[Objective-C] 클래스의 @property와 @synthesize

리앤·2022년 10월 17일
0

Objective-C의 클래스

  • 데이터 유행에 대한 블루프린트 정의
  • 어떤 내용을 포함할 수 있고, 어떤 일을 수행할 수 있는지 정의
  • 클래스 정의는 interface 키워드와 인터페이스(클래스)이름으로 시작한다
  • Obj-C의 모든 클래스는 NSObject 기본 클래스에서 파생된다

인스턴스 변수는 비공개이며 클래스 구현 내에서만 접근 가능하다

  • 원칙적으로는 인스턴스의 속성은 아래처럼 접근하는 게 좋다:
      **`@property(nonatomic, readwrite)** double height;`

 

무슨 소린지 잘 모르겠으니까 예제를 따라 쳐보며 이해해보도록 하자.


 

오류 메세지: length라 하는 프로퍼티가 Box 클래스의 객체에서 발견되지 않았다 - 인스턴스 변수 length를 가져올까?
→ = “이 포인터 번지수 가서 이 내용에 접근해라”

 

  • 여기서 일단 → 로 수정하고 넘어간다
  • 근데 구현부 말고 main()에서 호출을 할 때 또 에러가 뜸
  • height 프로퍼티에 접근하려고 하는데 위 상황과 같은 메세지를 던짐. 그래서 또 똑같이 화살표로 바꿔줌.

 

다시 뜬 오류 메세지: 프로퍼티가 보호되고 있다..?! 점표기법으로 접근 불가

  • 이래서 인스턴스 변수는 비공개이며, 클래스 구현 내에서만 접근 가능하다는 거구나!
    • 원칙적으로는 인스턴스의 속성은 @property @synthesize로 접근해야 한다

 

  • 그럼 선언부에 @property부터 넣어준다

  • 그랬더니 친절한 Xcode씨가 한 마디 하신다. synthesize 안했으니 이거 자동으로 authosynthesized 프로퍼티로 처리했고, _height 변수명으로 대신 쓰라는.. 건가? 애매하다.

 

  • 애매하면 일단 써보기

  • 이 이건 또 무슨 소리야. 똑같이 오류는 뜨는데 아까 메세지랑은 다르다. 이번엔 프로퍼티가 protected가 아니라 private이랜다.
  • Objective-C property protected private error message로 구글링 ㄱ

 

Objective-C의 접근 제한자 Access Modifiers

@private, @protected, @public

  • Objective-C에서 클래스가 생성되면 프로퍼티는 public, private 둘 중 하나로 정의된다.
  • public 프로퍼티는 .h 파일에 저장되며 private 프로퍼티는 .m 파일에 저장된다.
    • 외부 접근 방지 / 객체 지향 Objective-C의 캡슐화
  • @public - 접근 제한 없음
  • @private - 정의된 클래스 내에서 접근 가능
  • @protected - 정의된 클래스 내와 하위 클래스 내에서 접근 가능 (디폴트값)
  • 접근 제한자는 멤버 프로퍼티에만 적용되고, 메서드는 항상 public 상태이다

접근 제한자 예제:

/* 헤더 파일 */ 

@interface Product : NSObject {
  @private
    int productId;
  @public
    NSString *productName;
    float price;
}

그렇다고 한다.

 

  • Xcode한테 잔소리 듣기 싫으면 룰을 착실히 따라줍시다
  • @property와 @synthesize를 통해 Box 클래스의 프로퍼티 이름을 안에서도 활용할 수 있게끔 매치해준다

 

수정된 예제:

#import <Foundation/Foundation.h>

@interface Box : NSObject {
    double length;
    double breadth;
    double height;
}

@property(nonatomic, readwrite) double length;
@property(nonatomic, readwrite) double breadth;
@property(nonatomic, readwrite) double height;

-(double)volume;
@end

@implementation Box

@synthesize length;
@synthesize breadth;
@synthesize height;

// initialize
-(id)init { // must include id when initialize (id = pointer of an instance)
    self = [super init]; // inherit NSObject
    self->length = 1.0;
    self->breadth = 1.0;
    return self;
}

-(double)volume {
    return length * breadth * height;
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Box *box1 = [[Box alloc] init];
        Box *box2 = [[Box alloc] init];
        
        box1.height = 4.0;
        box2.height = 34.0;
        
        NSLog(@"Volume of box1 : %f", [box1 volume]); // Volume of box1 : 4.000000
        NSLog(@"Volume of box2 : %f", [box2 volume]); // Volume of box2 : 34.000000
    }
    return 0;
}

 


Reference1 | Reference2

profile
iOS 뉴비의 성장 기록

0개의 댓글