본문 바로가기

6. With IT/6.3 iOS

setter getter??


출처 : http://oz-iphone.tistory.com/2

OOP 와 관련된, 더 정확하게 말하면 class 형태를 사용하는 랭귀지는 getter 와 setter 가 반드시 사용됩니다.

C++ 로 예를 들면, 
class MyClass
{
    int value;
public:
    void setValue(int n) { value = n; }
    int getValue() { return value; }
}

value 가 private 로 되어 있기 때문에, 클래스 외부에서는 setValue() 와 getValue() 함수로만 접근이 가능합니다.
이 컨셉은 OOP 의 기본중에 기본적인 Capsulatioin 개념입니다.

Objective-C 의 경우, 아예 클래스 외부에서 value 에 직접 접근을 원천 차단 시켰습니다. C++ 에서는 public 으로 해 놓으면 접근이 가능하지만 말이죠.
그래서, 필연적으로 getter 와 setter 를 쓸 수 밖에 없구요. (개인적으로 OOP 의 개념을 잘 살린, 아주 훌륭한 처사라고 보고 싶습니다.)

위의 클래스를 Objective-C 형태로 바꿔 봅니다.

@interface MyClass
{
    int value;
}
-(void)setValue:(int)n;
-(int)value;
@end

@implementation MyClass
-(void)setValue:(int)n
{
    value = n;
}

-(int)value
{
    return value;
}
@end

자, 별 다른 이상한 점을 발견 못 하셨나요?
-(int)value;
이 함수에 대해서 어떻게 생각하시나요?

멤버 변수(프로퍼티)로 선언된 
int value;
와 이름(토큰)이 똑같습니다.
C++ 이었다면 당장 에러를 냈을겁니다. 토큰명이 겹친다고...

Objective-C 의 특성이 또 나오는데, 겹쳐도 상관없으며, 오히려 권장하는 형태입니다.

잠시 삼천포로 빠져서, 
왜 getValue 라고 이름짓지 않았을까요?
Objective-C 에서는 getXXX 라는 형태의 함수는 통상,
void getValue(int *v)
{
  *v = value;
}
 
이렇게 포인터로 값을 얻어올 때 쓰입니다. 값을 리턴하는게 아니라...
물론, 문법적으로 강제하는 사항이 아닌, 어디까지나 권고 사항입니다.
개인적으로 이러한 권고사항은 컴파일러 에러만큼 잘 지켜져야 한다고 생각합니다.
그래야, 공동 작업을 하거나, 다른  사람의 소스를 읽을 때 헷갈리지 않으니깐요.

다음 포스트에는 getter 와 setter 를 좀 더 편하게 생성하는 방법에 대해 알아보겠습니다.

'6. With IT > 6.3 iOS' 카테고리의 다른 글

시너지프로그램 맥10.8 윈도우 7  (0) 2013.04.25
Xcode에서 SVN사용법  (0) 2013.04.25
iOS - Application architecture  (4) 2011.05.28
iOS - Xcode이해  (0) 2011.05.27
iOS - 앱구조  (0) 2011.05.27