어흥
[Objective - C] 기본 예제(종합) 본문
[구현 사항]
- 이름(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;
}
[결과]
'iOS' 카테고리의 다른 글
[Objective - C] Segue사용시 발생할 수 있는 에러 (0) | 2020.10.23 |
---|---|
[Objective - C] 프로젝트 기본 설정 (0) | 2020.10.20 |
[Objective - C] 아카이빙 (0) | 2020.10.16 |
[Objective-c] Collection (0) | 2020.10.16 |
[Objective-C] 문자열, 파일, 프로토콜 (2) | 2020.10.15 |