본문 바로가기

Language/Objective-C

Objective-C를 이용한 도서관리 프로그램 만들기

이 글은 공부한 내용을 기반으로 정리하는 글이오니 건전한 비판은 환영합니다.

 

Property

내가 아는 선에서 Property는 getter,setter를 일일히 지정해 줄 필요없이, 자동으로 만들어준다.

그래서 먼저 Book파일을 만들어서 Propert를 만들어 주었다.

먼저 Book.h파일에서

#import <Foundation/Foundation.h>

@interface Book : NSObject


@property (nonatomic,strong) NSString *name;
@property (nonatomic,strong) NSString *genre;
@property (nonatomic,strong) NSString *author;

//@property (atomic) 하나씩 접근하려고 할 때

-(void)bookPrint;
@end

Property안에 있는 nonatomic은 서버에 접속을 할 때 하나하나씩 순차적으로 접근하는 것이다. 그에 비해 atomic은 비동기성으로 접근이 들어간다. 또한 strong이라고 적혀있는 것은 강한 참조를 이야기 하고 그에 비해 반대로 weak는 약한 참조를 의미한다.

밑에 (void)라고 적혀있는 것은 .h파일에서 선언하고 .m파일에서 구현해줘야 하는 메소드 입니다.

 

그리고 구현 파일인 Book.m 파일은

#import "Book.h"

@implementation Book
@synthesize name,genre,author;

-(void)bookPrint{
    NSLog(@"Name : %@",name);
    NSLog(@"Genre : %@",genre);
    NSLog(@"Author : %@",author);
}

@end

저 synthesize라고 하는 부분은 .h파일에서 선언한 프로퍼티를 받아주는 것이다. 뭐 현재는 안 적어도 된다고 하지만 여기서는 선언하겠다.

그리고 함수의 부분을 구현하여 준다.

그리고 Book.h를 받아서 BookManager파일은 만들어준다.

#import <Foundation/Foundation.h>

@class Book;//import로 쓸 수 있지만 컴파일이 빨라져 성능이 빨라진다. 순환 참조시에 이것을 컴파일하라고 알려준다.
@interface BookManager : NSObject{
    NSMutableArray *bookList;
}

-(void)addBook:(Book *)bookObject;
-(NSString *)showAllBook;
-(NSUInteger)countBook;
-(NSString *)findBook:(NSString *)name;
-(NSString *)removeBook:(NSString *)name;
@end

여기서 중요한 것은 class라고 하는 부분인데 원래 import하면 되는 부분이지만 class로 사용한 이유는 강의에서 컴파일이 빨라진다라고 설명은 했지만, 개인적으로 찾아본 결과 import는 객체의 생성과 클래스 메소드를 사용하는 경우이고, class는 단순히 포인터를 넣어서 단순히 참조를 합니다. 그래서 불필요한 헤더파일은 부르지 않습니다.

Interface에 Array를 넣은 이유는 list를 저장하기 위해서 넣었습니다.

그리고 BookManager.m 파일로

#import "BookManager.h"
#import "Book.h"

@implementation BookManager

- (id)init {
    self = [super init];//init 해주기
    if (self) {
        bookList = [[NSMutableArray alloc]init];//저장할 bookList
    }
    return self;
}

-(void)addBook:(Book *)bookObject{
    [bookList addObject:bookObject];
}

-(NSString *)showAllBook{
    NSMutableString *strTemp = [[NSMutableString alloc]init];
    for (Book *bookTemp in bookList) {
        [strTemp appendString:@"Name : "];
        [strTemp appendString:bookTemp.name];
        [strTemp appendString:@"\n"];
        [strTemp appendString:@"Genre : "];
        [strTemp appendString:bookTemp.genre];
        [strTemp appendString:@"\n"];
        [strTemp appendString:@"Author : "];
        [strTemp appendString:bookTemp.author];
        [strTemp appendString:@"\n"];
        [strTemp appendString:@"------------------------"];
        [strTemp appendString:@"\n"];
    }
    return strTemp;
}

-(NSUInteger)countBook{
    return [bookList count];
}

-(NSString *)findBook:(NSString *)name{
    NSMutableString *strTemp = [[NSMutableString alloc]init];
    for (Book *bookTemp in bookList) {
        if ([bookTemp.name isEqualToString:name]) {
            [strTemp appendString:@"Name : "];
            [strTemp appendString:bookTemp.name];
            [strTemp appendString:@"\n"];
            [strTemp appendString:@"Genre : "];
            [strTemp appendString:bookTemp.genre];
            [strTemp appendString:@"\n"];
            [strTemp appendString:@"Author : "];
            [strTemp appendString:bookTemp.author];
            return strTemp;
        }
    }
    return nil;
}

-(NSString *)removeBook:(NSString *)name{
    for (Book *bookTemp in bookList) {
        if ([bookTemp.name isEqualToString:name]) {
            [bookList removeObject:bookTemp];
            return name;
        }
    }
    return nil;
}

@end

BookList를 받기위해 init으로 메모리를 할당하여 줍니다.

그리고 main에서

#import <Foundation/Foundation.h>
#import "Book.h"
#import "BookManager.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Book *book1 = [[Book alloc]init];
        book1.name = @"햄릿";
        book1.genre = @"비극";
        book1.author = @"셰익스피어";
        //[book1 bookPrint];
        
        Book *book2 = [[Book alloc]init];
        book2.name = @"누구를 위하여 종을 울리나";
        book2.genre = @"전쟁소설";
        book2.author = @"헤밍웨이";
        //[book2 bookPrint];
        
        Book *book3 = [[Book alloc]init];
        book3.name = @"죄와 벌";
        book3.genre = @"사실주의";
        book3.author = @"톨스토이";
        //[book3 bookPrint];
        
        BookManager *myBook  = [[BookManager alloc]init];
        
        [myBook addBook:book1];
        [myBook addBook:book2];
        [myBook addBook:book3];
        
        NSLog(@"%@",[myBook showAllBook]);
        NSLog(@"count : %li",[myBook countBook]);
        
        NSString *strTemp = [myBook findBook:@"죄와 벌"];
        if (strTemp != nil) {
            NSLog(@"%@",strTemp);
        }else{
            NSLog(@"찾으시는 책이 없네요 ^^;");
        }
        
        NSString *removeResult = [myBook removeBook:@"죄와 벌"];
        if (removeResult != nil) {
            NSLog(@"%@ 책을 지웠습니다.",removeResult);
        }else{
            NSLog(@"지울려는 책이 없네요 ^^;");
        }
        
        NSLog(@"%@",[myBook showAllBook]);
        NSLog(@"count : %li",[myBook countBook]);
        
    }
    return 0;
}

프로그램을 돌려주면

2022-08-08 20:58:30.303766+0900 BookManager[4882:43918] Name : 햄릿
Genre : 비극
Author : 셰익스피어
------------------------
Name : 누구를 위하여 종을 울리나
Genre : 전쟁소설
Author : 헤밍웨이
------------------------
Name : 죄와 벌
Genre : 사실주의
Author : 톨스토이
------------------------
2022-08-08 20:58:30.304522+0900 BookManager[4882:43918] count : 3
2022-08-08 20:58:30.304712+0900 BookManager[4882:43918] Name : 죄와 벌
Genre : 사실주의
Author : 톨스토이
2022-08-08 20:58:30.305018+0900 BookManager[4882:43918] 죄와 벌 책을 지웠습니다.
2022-08-08 20:58:30.305103+0900 BookManager[4882:43918] Name : 햄릿
Genre : 비극
Author : 셰익스피어
------------------------
Name : 누구를 위하여 종을 울리나
Genre : 전쟁소설
Author : 헤밍웨이
------------------------
2022-08-08 20:58:30.305158+0900 BookManager[4882:43918] count : 2
Program ended with exit code: 0

이렇게 작성이 됩니다.

'Language > Objective-C' 카테고리의 다른 글

Objective-C 첫 시작  (0) 2022.08.04