Objective C에서 프로퍼티에 관한 질문입니다.
안녕하세요. 이번에 Objective C를 공부해보면서 좀 헷갈리는부분이 있어서 질문올립니다.
일단 소스는 아래와 같구요.
@interface ClassA : NSObject { int value; // (1) } @property int value; // (2) -(void)printvalue; @end @implementation ClassA @synthesize value = _value; // (3) -(void)printvalue { self.value = 15; value =20; _value = 13; NSLog("@self.value = %i", self.value); NSLog("@value = %i", value); NSLog("@_value = %i", _value); }
printvalue를 돌린
출력결과는
self.value = 13
value = 20
_value = 13
이렇게 나옵니다.
질문을 요약해보면..
1) @property int value; (2) 에서
value란 프로퍼티 이름이 ClassA의 멤버(인스턴스변수)인 int value (1) 랑 연결되는 값인가요?
프로퍼티를 통해 set되고 get되는 값은 ClassA안에 있는 int value (1) 를 뜻하는건지 궁금합니다.
2) interface 내에 멤버에 int value (1)가 선언되지 않더라도 @property int value; 를 선언했더라면
자동으로 ClassA에 int value 라는 인스턴스 멤버가 컴파일러에 의해 생겨나는건가요?
3) self.value와 _value가 프로퍼티를 통해 value(1)을 set하는 거라고 공부했습니다.
근데 value란 값은 self.value와 _value와 다른점이 무엇인지 잘 모르겠습니다.
classA의 멤버 value인건 확실한데, 왜 self.value, _value와 다른지 이해가 잘 안갑니다.
4) synthesize value = _value 이부분에서 질문입니다.
_value를 사용하는건 자기자신의 메소드 안에서만 사용할 수 있는게 맞나요?
_value가 다른 클래스에서 사용될수 있는 가능성,
즉 다른 클래스(classA를 import한 클래스 혹은 하위클래스 포함)에선 _value를 직접 사용할수 없는게 맞는지 궁금합니다.
5) 외부 (예를들면 main)에서 classA의 int value에 접근하는 프로세스가
프로퍼티를 선언했으므로 도트연산자로 접근한다하면
ClassA* a = [ClassA alloc]; a.value = 5;
와 같을때
a.value는 a객체의 value 프로퍼티로 접근 -> 프로퍼티에서 set -> classA (a객체)의 int value값이 변경
이게 맞나요?
질문이좀 많네요..
프로퍼티에대한 공부가 볼때마다 의미가 혼동되서 질문올립니다 ㅜ
1) value 란 property 는 컴파일러의
1)
value 란 property 는 컴파일러의 synthesize 를 통해 _value 라는 instance variable 과 연결됩니다.
2)
_value 라는 instance variable 이 생겨나는 것입니다.
3)
self.value 를 property set 할 때 사용한다는 것은
[self setValue:1] 을 호출해주는 것의 syntactic sugar 에 불과합니다.
setValue: method 는 해당 class 의 value 라는 이름을 갖는 property
(따라서, _value 라는 instance variable) 에 접근하는 것입니다.
반면, 그냥 value 는 value 라는 이름을 갖는 instance variable 에 접근하는 것입니다.
4)
_ prefix 를 갖는 instance variable 로의 직접 접근은 해당 class 구현에서만 가능합니다.
그리고 초기화를 하는 경우가 아니라면 class 구현 내에서도 직접 접근은 피하고
dot syntax 나 accessor method 를 사용하는 것이 바람직합니다.
5)
앞서 말씀드린 것처럼
a.value = 5;
는
[a setValue:5];
와 동일합니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
자세한 답글 감사드립니다.
자세한 답글 감사드립니다!
제가 이해한게 맞는지 확인 부탁드립니다.
property int value를 선언하고
property value가 classA의 ivar인 int value(1) 와 연결되는 경우는
@synthesize 를
@synthesize value; 로 선언해야 하고, (ivar name을 선언안함)
[a setValue : 5] 로 외부에서 property에 접근하면 classA의 ivar인 (1)인 int value를 get,set 할수 있다.
( classA에는 int value (1) ivar만 존재, property value를 통해 get,set하면 (1)의 value값이 변한다)
만약 @synthesize value = _value; 로 선언시 (ivar name을 선언함)
(1)과는 별개로 property에 대한 _value라는 ivar가 classA에 추가로 생성되어
[a setValue : 5] 로 외부에서 property로 접근하면 classA의 ivar인 (1)은 변하지 않고, 추가로 생성된 ivar인 _value가 set된다.
( classA에는 int value (1) 외에 @synthesize에 의해 int _value(2) 라는 ivar가 추가. 즉 classA 에는 int value, int _value 2개의 ivar가 존재,
property value로 get,set하면 (2)의 _value 값이 변한다.)
마지막으로 @synthesize를 아예 선언하지 않으면 (property value만 선언)
컴파일러에 의해 @synthesize value = _value ; 라는 문장이 처리되며
_value라는 ivar가 생성되서 두번째 문장같이 classA에는 2개의 ivar가 있는셈이다.
제일 헷갈리는 부분에서 제가 이해한대로 정리해봤습니다.
맞게 이해를 한건지 확인 부탁드립니다!
네, 모두 맞게 이해하셨습니다. ^^
네, 모두 맞게 이해하셨습니다. ^^
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
감사합니다!
덕분에 고민해결됬네요 ㅎ
댓글 달기