스펜서 개발블로그

[Objective-C] 프로퍼티(@Property)란? (feat. _변수명) 본문

iOS/Objective-C

[Objective-C] 프로퍼티(@Property)란? (feat. _변수명)

스펜서 2022. 8. 25. 00:16

 

프로퍼티(Property)

 

Objective-C 2.0 배포판에 프로퍼티가 추가되었다.

간단히 말하면 객체가 포함된 데이터를 캡슐화하는 방법을 제공하는 기능이다.

 

 

프로퍼티의 역할


// h파일
#import <UIKit/UIKit.h>
 
@interface Member: NSObject  { 	// 클래스 명 : 부모 클래스
   	NSString  *name;		// 변수타입 변수명
}

@end

 

Objective-C에서 위와 같이 변수를 선언하게 되면 기본적으로 @protected 타입으로 Member 클래스의 내부와 하위 클래스에서만 인스턴스에 접근할 수 있다.

 

변수 앞에 @public 을 붙여 주는 것도 문법상 가능하지만 사용하지 않는다. (혹은 @private)

@public, @private 변수를 사용할 경우, 컴파일 시간에 따라 객체의 배치가 변경되는 문제가 생기기 때문이다.

 

두번째로 선언된 변수로 인해 첫번째로 선언된 변수의 오프셋이 변경되어 문제가 발생한다. (기준점으로부터 떨어진 거리로 측정한다.)

 

이와 같은 이유로 보통 아래와 같이 getter와 setter 메소드를 통해 접근한다.

 


// h파일
#import <UIKit/UIKit.h>
 
@interface Member: NSObject  {
    NSString  *name
}

@end

//m 파일
#import "Member.h"
 
@implementation Member
 
- (NSString *)name {
    return name;
}
 
- (void)setName: (NSString *)name {
    name = name;
}
 
@end

 

Objective-C에서는 setter는 다른 언어들과 같이 'set변수명'으로 생성하고, getter는 get을 생략한다.

 

하지만 이런 방법도 변수가 많을 경우, 변수의 개수의 두배 분량이 작성되야해서 번거롭다.

그래서 나온 것이 프로퍼티이다.

 

 

 

프로퍼티 사용방법

 

// h파일
#import <UIKit/UIKit.h>
 
@interface Member: NSObject
 
@property NSString *name;
 
@end

 

프로퍼티는 헤더 파일의 변수 선언부에 @property 변수타입 *변수명 형태로 선언한다.

그리고 이렇게 선언된 프로퍼티는 컴파일러가 인스턴스 변수를 하나 만들고, 이 변수 이름 앞에 _를 붙인다.

(_는 언더바, 언더스코어(underscore)라고 함)

 

따라서 이런 변수에 접근할때는 _name = @"Benji"; 와 같이 사용한다.

 

 

 

 

Comments