본문 바로가기
Programming/Swift

[Objective-C] 03. 클래스, 객체, 메서드

by ㅇㅏㄹI 수 2012. 11. 14.

본 글은 출판사 인사이트에서 출판한 Programming in Objective-C 2.0 (스티브 코찬 지음 \ 박세현 옮김) 책을 공부하면서 내용을 정리한 글입니다. 그냥 공부하면서 정리하는 글일 뿐입니다. 상세한 내용은 책을 참조하세요.
두서없이 작성되어 있다고 뭐라 마시라~~~~

책 3장. 클래스, 객체, 메서드의 내용이다.

 

객체 : 어떤 것.
일상에서 자동차는 "객체,
나의 차는 차의 "인스턴스".
Car는 그 인스턴스가 생성된 클래스의 이름. 따라서 새로운 차가 생산될 때마다 클래스car에서 새로운 인스턴스가 생성되고 car의 각 인스턴스는 객체라고 부른다....라고 책에 적혀있다...(뭔소린지...)

인스턴스와 메서드
인스턴스 :
클래스로부터 나온 것을 "인스턴스"라고 부르고, 이 인스턴스가 수행하는 행동을 "메서드"라고 한다.

클래스와 인스턴스에 메서드를 적용할 때 문법
[ClassOrInstance Method];
===>> 여는 대괄호 다음에 클래스 또는 그 클래스의 인스턴스 이름이 나오고 그 다음 공백이 나온 후 수행할 메서드가 온다.
클래스나 인스턴스에 행동을 수행하도록 할 때는 "메시지"를 보낸다고 표현.

메서드를 호출하는 일반적인 형태.
[receiver message];

적용 예를 보자면, Car라는 클래스가 있고 나의 차를 만든다면,
myCar = [Car new];

분수를 처리하는 Objective-C 클래스

절차적인 환경에서 동작하는 소스를 만들어 본다.
Xcode를 실행하여 Foundation 기반의 프로젝트(fraction_1)를 생성한다.
책의 소스는 다음과 같다.
...중략...
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]init];
int numerator = 1;
int denominator = 3;
NSLog (@"The fraction is %i/%i", numerator, denominator);
[pool drain];
return 0;

Xcode 4.4.1 에서는 다음과 같다.
....중략
@autoreleasepool {
int numerator = 1; // 분자
int denominator = 3; // 분모
NSLog (@"The fraction is %i/%i", numerator, denominator);
}
return 0;

결과

이제 클래스 버전으로 작성을 해본다.
Xcode에서 새로운 프로젝트(fraction_p) 생성한다.

type은 foundation 선택.

여기서 책에 나오는 @interface, @implementation을 어떻게 작성하는지 알 수가 없다. (뭐 Xcode에 대한 경험이 전부한 나한테 자다가 봉창두드리는 느낌...클래스 정의해서 할 수 있다고 하는데...덜렁 소스만 보여주고 설명하는 것은...쩝...이 코드들을 어디에다 작성하라는 것인지....)

다음과 같이 한다.

1. 프로젝트 명(fraction_p)에서 왼쪽 버튼 딸깍. 팝업 메뉴에서 [New File]을 선택한다.

2. 새로운 나타나는 창에서 Cocoa의 objective-C Class 항목을 선택한다. Next  버튼을 딸깍.


3. 적당한 파일명을 작성한다. 상속받을 부모클래스는 NSObject. Next 버튼을 딸깍.

4. 최종적으로 파일을 저장할 위치를 선택하고 Create 버튼을 딸깍.

5. 최종적으로 작성한 파일이 추가된 것을 확인할 수 있다.



자. 이제 @interface와 @implementation부분을 확인해보자.

@interface 부분은 frac_p.h 파일에서, @implementation은 frac_h.m 파일에서 확인할 수 있다.

각각의 위치에 다음 코드를 입력한다.

- frac_p.h 파일:

{
    int numerator; // 분자
    int denominator;    // 분모
}

-(void)    print;
-(void)    setNumerator: (int) n;
-(void)    setDenominator: (int) d;

- frac_p.m 파일:

-(void)    print
{
    NSLog (@"%i/%i", numerator, denominator);
}

-(void)    setNumerator: (int) n
{
    numerator = n;
}

-(void)    setDenominator: (int) d
{
    denominator = d;
}

이제 main.m 파일에서 위에서 작성한 클래스를 사용하는 코드를 작성한다.

- main.m

// insert code here...
        NSLog(@"Programming is fun!fun!");
        // 클래스 인스턴스 선언
        frac_p* myfrac;
       
        // 인스턴스 생성
        myfrac = [frac_p alloc];
        myfrac = [myfrac init];
        //myfrac = [[frac_p alloc]init];
        // 실제 값을 입력한다.
        [myfrac setNumerator:1];
        [myfrac setDenominator:3];
       
        // print 메서드로 분수로 표시한다.
        NSLog(@"The value of myfrac is :");
        [myfrac print];
        [myfrac release];

작성한 코드를 실행시켜본다. 단축키 command+R.

Xcode 4.4.1에서는 다음 그림처럼 에러를 뿜어낸다.

에러가 난 부분을 주석처리하고 실행해보면 하단의 All output 화면에서 결과를 확인할 수 있다.

여기서 전체적인 내용을 확인해보자. 에러 부분은 글 마지막에 확인하도록 한다.

1. @interface 부분.

클래스를 새로 정의할 때 해야 할 일.
ㄱ. 부모(parent)클래스를 알려주어야 한다.
ㄴ. 객체내에 저장될 데이터의 형(type)이 무엇인지 지정해야 한다.
ㄷ. 클래스의 객체를 다를 때 사용하는 메서드를 정의한다.

이러한 것들을 @interface라는 부분에서 수행된다. 형식은 다음과 같다.

@interface  NewClassName: ParentClassName
{
    memberDeclarations;
}
methodDeclarations;
@end

※ 코드를 작성하면서 의문점. 클래스의 멤버함수를 자동으로 생성해 주는 기능은 없는 건가? VS에서는 클래스의 하위머뉴로 [함수 추가] 라는 메뉴가 있는뎅....

위 코드에서 확인해보면
클래스 이름(NewClassName)은 frac_p, 부모클래스(ParentClassName)는 NSObject이다.
memberDeclarations(인스턴스 변수)는 두 개(numerator, denominator) 이다.

-(void) print
맨 앞에 있는 빼기부호(-)는 컴파일러에게 이 메서드가 인스턴스 메서드임을 알려준다.
더하기부호(+)는 클래스 메서드를 나타낸다.

-(void) setNumerator : (int) n ;

2. @implementation 부분
@interface에서 선언한 메서드의 실제코드를 담고 있는 부분이다.

@implementation NewClassName
    methodDefinitions;
@end

@interface부분과 동일하게 콜론(:)을 붙이고 부모클래스의 이름을 써줄 수 있다.(프로그래머의 선택사항)

@implementation frac_p : NSObject



728x90

댓글