Objective-C 2.0 이전의 시대...당시의 이름 규칙(코드 컨벤션)
이런 녀석이 있다고 가정,
그리고 당연히 TestClass의 내부에 있는 name에 접근할 일이 생기게 된다.
그래서 name에 접근하기 위해 접근자(accessor, getter and setter)를 만들게 됩니다.
당연히 어떤 함수든 뭐든 저 객체에서 저 데이터(name)을 밖으로 끄집어낼 방법이 필요하다!
그럼 getter는?
어떤 프로그래머가 Objective-C를 다룬지 얼마나 오래 되었는가? 를 판단하기 위해 손쉽게 알 수 있는 방법은
getter를 getName이라고 말하는가? 를 보고 판단한다.
Obj-C의 세상에서는 getter는 그냥 name이다.!!
이건 아무래도 Obj-C의 전체 설계 사상이 객체간의 메시지 전달이다보니, 저기에 동사를 넣는 표현 방식이
낯설게 느껴진것인지...어찌하든 Obj-C의 getter의 코드 컨벤션은 그저 get하고자 하는 변수의 이름... 이었다.
그렇다면 setter는?
여기서 참으로 영어 중심적인 그런 느낌이 드는 컨벤션이 사용이 된다. 나도 처음엔 참으로 거지같다 생각했던
부분이기도 하지만, set + 첫글자 대문자로 된 변수 이름...을 사용했다.
코드 컨벤션에 다라서 이런 녀석들이 필요하게 되는 것이다.
그리고 당연히 선언후엔 당연히 정의를 내려줘야 겠다. (자바의 get,set 처럼.....)
어찌되었든 예전에는 이런방식을 고수 해왔다. 근데 이게 솔직히 너무 귀찮지 않은가?
더구나 Obj-C의 구린 반자동 메모리 관리 덕분에 코드는 점점 더 지저분해 지고, 또한 코드가 늘어갈수록
인간의 실수에 의한 손해도 늘어나고, 또한 코드 길이도 길어지고 가독성 또한 떨어진다.
그래서 일부 고전 Obj-C 개발자들이 "뭔 쓰잘데 없는 추가냐?"라고 생각했던 업그레이드가 단행된다.....
"."의 등장!
바로 []뿐만이 아닌 "."을 통해 클래스 멤버에 접근하는...
다른 언어들과 비슷한 문법을 허용한 것이다!
그런데 이 실체는 무엇이냐...
"."을 쓴 경우 문맥에 맞춰서 위의 두 메시지(코드 컨벤션을 지킨 경우)가 보내지는 것이다.
즉
인스턴스.멤버 = 라면, -> [set멤버: ](setter)가,
그냥 인스턴스.멤버 가 사용되면 멤버(getter)로 자동 번역 되는 것이다.
즉 위에서 제시한 방식대로 다시 코드를 작성해 보자면!
결과도 똑같고 경고도 에러도 전혀 없다.
그냥 두가지의 방법이 아무런 차이가 없는 것이다. 단순히 "."은 저걸 줄임말로 쓰겠다는 의미를 가진다.
실제로 다른 일부 언어들처럼 저기 메모리 번지수를 찾아서 접근하는 것이 아니라 내부적으로는
여전히 setName, name이라는 메시지가 보내지는 것이다.
이러한 방식이 적절한 것이 Obj-C의 경우 메모리 관리가 반자동식이라서 단순하게 setter를 정의하기
어렵기 때문이기도 하다.
이런 행위?(방식이) 귀찮기 때문에!
@property/@synthesize의 등장!
드디어 이와 관련해서 코딩의 양을 조금 줄여줄 수 있는 키워드 @property/@synthersize 가 등장하게
된것이다. 그러나... 그실체는...
@property의 경우 위와 똑같은 것이고....@property는 그냥 컴파일할때 실제로 저 두 라인으로 바뀐다고
볼 수 있다. 물론 readonly, getter, setter등의 옵션에 따라 getter와 setter의 이름을 바꿀수도 있고,
또한 setter는 빼버리거나 할 수 있는 것이다.
@synthersize는 좀 더 복잡한 코드 제너레이션을 해주는데....
기본 내용은 위의 내용과 비슷하다.
하지만 옵션(atomic, nonatomic, retain, copy, assign 등)에 따라 이런저런 변경이 가해진다.
그리고 KVO등이 적용되면 좀 더 복잡한 구조를 가질 수도 있다.
이 두 키워드가 중요한 의미를 갖는 것이 코드 길이를 줄이는 것도 있지만,
코드 길이와 비례 하는 인간의 실수도 줄일 수 있다는 점이다.
따라서 정확한 코드 컨벤션과 그에 따른 검증된 구현 코드로 바뀌어 들어가는 것이다.
의의와 트릭
실제로 property와 "."은 Obj-C에서는 네이밍 컨벤션을 따른 getter 와 setter 메시지를 선언/구현하고, 보내는 것을 단지 줄여쓴 것에 불과하다.
이 말을 getter, setter 메세지의 구현을 저 위에 소개된 기본적인 구현과 전혀 다르게 할 수도 있다
(그러니까 getter가 처음 불릴때 아직 생성이 안되면 기본값을 생성해 주거나 하는...)
이런 트릭이 가능한 것이다.
@synthersize를 한 뒤에 바로 오버라이드 하면 구현 코드대로 오버라이드 된 구현이 동작하게 된다.
또한 멤버 변수랑 무관하게 이름만 규칙에 맞다면, 멤버 변수가 없이도 "."을 사용해서 멤버 변수처럼
사용할 수도 있단은 뜻이다.(전역변수를 멤버 변수처럼 접근 하는 방식...)
주1.
실제로 지금처럼 Obj-C가 인기가 올라가기 전부터 해당 강의를 개설하고 책을 펴내던 Big Nerd Ranch에서도
이 논쟁이 있었다고 한다. 그 근본적인 이유는 , 이미 잘 쓰고 있는 방법이 있는데 쓸데 없는 짓이다(이것은..
솔직히 변화를 싫어하는 징징이들...)와 구조체 멤버 접근시의 dot notation과 겹친다...라는 이유이다.
아마 후자의 이유때문에 id형에 property식으로 dot을 쓰면 워닝이 뜰것이다.
솔직히 dot notation은 타 언어 개발자들의 편으를 좀 봐주자는 취지였던 것 같으나, 이게 역시
Obj-C 순혈주의자들의 눈에는 거슬렸던 모양이다. 실제 Obj-C의 권위자인 Big Nerd Ranch의 CEO이자 거의
필독서였던 Cocoa Programming 책을 펴냈던 Aaron Hilligas 조차도, 당시 Cocoa Programming 책에서...
이것은 오히려 혼란을 초래할 추가일지도 모른다는...뉘왕스로 글을 썼던 것을 본 기억이 난다.
(이 책에서는 Java의 GUI 구축하는 방식을 상당히 디스함). 하지만 지금은 property의 시대가 되었다.
'Software > iOS & Objective-C' 카테고리의 다른 글
객체간을 여행하는 데이터를 위한 안내서 (0) | 2013.04.10 |
---|---|
아이폰에서 iOS 앱 테스트 하기 (0) | 2013.04.02 |
Objective C 기초정리 (0) | 2013.01.23 |
멀티스레딩 <NSThread> (0) | 2011.12.30 |
메모리 관리 <Objective-C?> (0) | 2011.12.29 |