Overview

OSXDEV

Jump to: navigation, 찾기

프라퍼티에는 두가지 요소가 있다 : 프라퍼티를 정의하는 데 사용되는 구문적인 요소, 그리고 프라퍼티에 엑세스하는 데 사용되는 구문적 요소. 이 섹션에서는 그 두가지를 개괄적으로 훑어보고, 그 기능을 사용하게 하는 동기부여에 관해 논의한다.

[편집] Declaring Properties

프라퍼티를 정의하는 것은 클래스의 인스턴스의 어트리뷰트에 대한 setter와 getter를 정의하는 것과, 엑세서의 동작에 대한 동일한 명세를 제공하면서도, 효율적이고 단축적인 방법이다. 정의 뿐만 아니라, 컴파일러에게 엑세서를 만들어내는 법을 알려주고 컴파일러에게 런타임시에 당신이 직접 메소드를 런타임시에 제공할 것이라는 것을 알려주기 위한 구현 지시어가 있다.

  • 프라퍼티를 정의하기 위해 컴파일러 지시어인 @property 사용한다. 이것은 클래스, 카테고리 메소드 선언 섹션 혹은 프로토콜 선언 어디에서든 나타날 수 있다.
  • @synthesize와 @dynamic 지시어를 @implemeataion 블럭 안에서 특정 컴파일러 액션을 시작하기 위해 사용한다 : @synthesize 는 컴파일러에게 적절한 엑세서를 만들어라는 것을 지시한다 ; @dynamic은 컴파일러에게 런타임시에 당신이 직접 메소드를 제공할 것임을 알려준다.

Listing 4-1 은 프라퍼티, value, 그리고 컴파일러에게 선언에서 지정한 것에 맞추기 위해 엑세서 메소드를 생성하도록 @synthesize 지시어를 사용을 보여준다.

Listing 4-1 클래스에서 프라퍼티 정의하기

@interface MyClass : NSObject
{
    NSString *value;
}
@property(copy, readwrite) NSString *value;
@end
 
@implementation MyClass
@synthesize value;
@end

[편집] Accessing Properties

dot 구문을 사용하면, 구조체의 구성요소에 엑세스하는 것과 동일한 패턴으로 프라퍼티에 엑세스 할 수 있다.

MyClass *myInstance = [[MyClass alloc] init];
myInstance.value = @"New value";
NSLog(@"myInstance value: %@", myInstance.value);

dot구문은 정말 "문법적으로 달콤"하다 - 컴파일러에 의해 멕세서 메소드의 발생으로 변환된다 (그러므로 인스턴스 변수를 직접 엑세스 하는 게 아니다). 위의 코드 예제는 다음과 완전히 동일하다

MyClass *myInstance = [[MyClass alloc] init];
[myInstance setValue:@"New value"];
NSLog(@"myInstance value: %@", [myInstance value]);