클래스 구성

2개의 파일로 나뉨

SomeClass.h : 클래스의 인터페이스 정의, 공개 메소드, 인스턴스 변수
SomeClass.m : 실제적 구현 및 Private 메소드

 

클래스 인터페이스 구현

아래코드는 비디오클립 헤더 파일인 Clip.h

#import <foundation/Foundation.h>  //필요한 파일을 불러옴

@interface clip : NSObject  //NSObject의 하위클래스인 clip 클래스 정의를 시작
// 아래는 인스턴스 변수 정의
    int PlayCount;
    NSString *vid;
    NSString *title;
    NSString *orginalURL;
}

// 아래는 메소드 정의
+ clip;  // +는 클래스 메소드임을 뜻함
- (BOOL) isNewClip;  // -는 인스턴스 메소드를 뜻함
@end  // 클래스 정의가 끝났음

+는 NSString의 string처럼 객체를 생성시킬 때 사용하는 클래스 메소드 (팩토리 함수)

-는 인스턴스 메소드르 isNewClip은 사용자가 보지 않은 클립인지를 BOOL형 값으로 반환

 

클래스 구현

다음 코드는 Clip.m

@implementation Clip

- (BOOL) isNewClip
{
    return YES;
}

@end

@implementation과 @end 사이에 클래스의 실제적 하는 일을 구현

@interface에 구현하지 않은 메소드를 추가하면, 그 메소드는 Private이 되어 해당 클래스 내에서만 사용 가능

2가지 방법이 있음.

첫 번째 : NSString *aString = [NSString string];
두 번째 : NSString *bString = [[NSString alloc] init];

바로 사용시에는 둘 간의 차이가 없으나 메모리 관리에서 차이가 있음.

첫 번째 방법은 string함수가 객체를 생성해 줌. 따라서 메모리 관리는 자동적임. 즉, 사용이 끝나면 자동적으로 반환됨. 단, 강제로 반환하면 에러를 발생시킴.

두 번째 방법은 수동으로 메모리 할당.
사용이 끝나면 꼭 반환해야 함.

 

모든 인스턴스 변수는 Object-C에서 private 인 이유로 값을 가져오거나 설정하기 위해서는 접근자를 사용해야 함.

Object-C 2.0에서 점( . )을 이용한 접근이 추가되었음. (마치 public인 것처럼)

다른 객체지향언어에서도 그렇지만 개인적으로 setValue, getValue 형태의 접근자를 설정해 사용하는 것이 좋다고 생각함

 

Object-C 기존 방법

[objectA setTitle:@"안녕하이"];
NSString *title = [objectA title];

objectA에 setTitle이라는 접근자 사용

 

Object-C 2.0 에서 추가된 방법

objectA.title = @"안녕하이";
NSString *title = objectA.title;

*접근자: 변수에 접근하기 위한 메소드

기본 호출 방법

[Object method];
[Object method:input];

Object : 오브젝트 명
method : 매소드
input : 입력 매개변수

 

값을 돌려 받을 때

output = [Object method];
output = [Object method:input];

객체를 돌려 받을 때

id newStringObject = [NSString string];
NSString *newStringObject = [NSString string];

둘은 같은 의미, 명확한 경우는 id를 사용하는 것도 나쁘지 않으나, 실수를 증가시킬 우려가 있음.

id : 모든 객체, 어떤 것이든 대체 가능함을 의미, 본래 포인터 타입이므로 *이 불필요
NSString : 클래스
string : 객체를 반환하는 NSString의 메소드

 

메시지를 중복으로 보내고 싶은 경우

(C언어의 function1(function2( )); 와 같이)

[objectA method:[objectB method]];

스택구조상 objectB가 먼저 수행된 후 objectA 수행

 

복수의 매개변수 사용

[objectA method: objectB method: objectC]

objectA가 objectB와 objectC를 가지고 수행, 복수개의 매개변수일 때는 : 로 구분

+ Recent posts