어흥

[Objective - C] 기본 예제(종합) 본문

iOS

[Objective - C] 기본 예제(종합)

라이언납시오 2020. 10. 19. 15:18
728x90
반응형

[구현 사항]

- 이름(strong), 취미(strong), 성적(int 형)을 가진 Student Cocoa Class 생성

- Student를 여러명 담는 StudentClass Cocoa Class 생성

- 학생을 생성, 학생을 학급에 추가, 삭제, 검색 할 수 있는 기능 구현

- 학급에 존재하는 학생 정보 출력

 

[학생 클래스]

- 모든 변수를 property로 선언하며, 이름과 취미만 Strong으로 선언한다

- 학생 정보 출력의 경우, 해당 학생에 대한 정보를 출력하도록 한다

- initWithName 함수를 통하여 이미 생성된 빈 객체에 값을 할당해서 넘겨준다

- studentWithName 함수를 통하여 객체를 생성하고 값을 초기화한 이후, 반환한다 -> 내부에서 객체 생성 이후, 객체 반환(팩토리 메소드 패턴)

 

※ Factory Method Pattern

- 정의: 객체를 생성해서 반환하는 것. 즉, 결과값이 객체다

- 이점: 팩토리 메소드 클래스를 통해 객체를 대신 생성하고 반환받기 때문에 효율적인 코드제어 + 결합도를 낮춰서 유지보수에 용이

 

//Student.h
//학생 검색, 생성, 학생 이름 일치, 학생 출력

@interface Student : NSObject
@property (strong,nonatomic) NSString *name;        //학생 이름
@property (strong,nonatomic) NSString *hobby;       //학생 취미
@property int rank;             //학생 순위

-(id)initWithName:(NSString *)name hobby:(NSString *)hobby;     //이름과 취미를 입력하며 생성
+(id)studentWithName:(NSString *)name hobby:(NSString *)hobby;          //학생 검색
-(void)print;       //학생 정보출력
-(BOOL)searchStudentWithName:(NSString *)name;      //학생 이름 일치
@end

 

//Student.m
#import "Student.h"

@implementation Student

- (id)initWithName:(NSString *)name hobby:(NSString *)hobby {
    self = [super init];
    if(self){
        _name = name;
        _hobby=hobby;
    }
    return self;
}

+ (id)studentWithName:(NSString *)name hobby:(NSString *)hobby {
    Student *student = [[Student alloc] initWithName:name hobby:hobby];
    return student;
}

- (void)print {
    NSLog(@"%@'s hobby is %@",_name,_hobby);
}

- (BOOL)searchStudentWithName:(NSString *)name {
    return [_name isEqualToString:name];
}

@end

 

 

[StudentClass]

- Student를 담는 객체가 필요하므로 Student 헤더를 임포트 + 가변형배열 선언

- 학생 검색의 경우, 해당 학생에 대한 정보를 반환한다

- printAll 함수를 통해 학급에 존재하는 모든 학생에 대한 정보를 출력한다

- searchStudent 함수 내에 존재하는 if([student searchStudentWithName:name]) 조건문을 바탕으로 name의 이름을 가진 학생이 학급에 존재하는지 판단하여 존재하면 해당 학생 객체 반환

 

//StudentClass.h
#import <Foundation/Foundation.h>
#import "Student.h"

@interface StudentClass : NSObject

@property (strong,nonatomic) NSMutableArray *students;      //배열 생성

-(void)addStudent:(Student *)student;             //학생 추가
-(void)removeStudent:(NSString *)name;            //학생 삭제
-(Student *)searchStudent:(NSString *)name;     //학생 검색
-(void)printAll;                                //전체 출력

@end

 

//StudentClass.m
#import "StudentClass.h"

@implementation StudentClass

- (id)init                                          //학급 초기화(배열)
{
    self = [super init];
    if (self) {
        self.students = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)addStudent:(Student *)student {             //학생 추가
    [_students addObject:student];
    NSLog(@"반에 학생 추가 : %@",student);
}

- (void)removeStudent:(NSString *)name {            //학생 삭제
    Student *s1 = [self searchStudent:name];
    [_students removeObject:s1];
}

- (Student *)searchStudent:(NSString *)name {       //학생 검색
    for (Student *student in _students) {
        if([student searchStudentWithName:name]){
            return student;
        }
    }
    return nil;
}

- (void)printAll {				//학급에 포함된 학생 정보들 출력
    for (Student *student in _students) {
        [student print];
    }
}

@end

 

[Main]

- 2개의 헤더 파일을 임포트한다

- 일반적으로 학생을 생성하는 방법(s1)과 객체를 생성한 이후, 한번에 초기화하는 initWithName(s2)와 팩토리 메소드 기법을 사용하여 학생 객체 s3~5를 생성

- s2~s5의 학생을 addStudent 함수를 통해 학급에 추가한다

- searchStudent를 사용하여 학생 이름이 학급에 있는지 확인한다

- 전체 학생정보를 출력 -> s5 학생 삭제 후, 전체 학생정보 출력 

#import <Foundation/Foundation.h>
#import "Student.h"
#import "StudentClass.h"

int main(int argc, const char * argv[]) {
    
    @autoreleasepool {
        NSLog(@"<<<학생 추가 진행>>>");
        Student *s1 = [[Student alloc] init];
        s1.name = @"Jennie";
        s1.hobby = @"Drawing";
        s1.rank = 2;
        
        Student *s2 = [[Student alloc] initWithName:@"John" hobby:@"Soccer"];
        Student *s3 = [Student studentWithName:@"Amy" hobby:@"Caricature"];
        Student *s4 = [Student studentWithName:@"Timber" hobby:@"American Football"];
        Student *s5 = [Student studentWithName:@"Bob" hobby:@"Boxing"];
        
        NSLog(@"<<<학급에 학생 추가 과정>>>");
        StudentClass *sc = [[StudentClass alloc] init];
        [sc addStudent:s2];
        [sc addStudent:s3];
        [sc addStudent:s4];
        [sc addStudent:s5];
    
        NSLog(@"<<<Amy 학생 검색>>>");
        Student *ss = [sc searchStudent:s3.name];
        NSLog(@"Student Amy : %@",ss);
        
        NSLog(@"<<<Juliet 학생 검색>>>");
        Student *ss2 = [sc searchStudent:@"Juliet"];
        NSLog(@"Student Juliet : %@",ss2);
        
        NSLog(@"<<<학급 출력>>>");
        [sc printAll];
        NSLog(@"<<<%@ 학생 제거>>>",s5.name);
        [sc removeStudent:s5.name];
        NSLog(@"<<<학급 출력>>>");
        [sc printAll];
    }   
    return 0;
}

 

 

[결과]

728x90
반응형
Comments