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 |