Objective C에서 프로퍼티에 관한 질문입니다.

dunphy23의 이미지

안녕하세요. 이번에 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 는 컴파일러의 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

dunphy23의 이미지

자세한 답글 감사드립니다!
제가 이해한게 맞는지 확인 부탁드립니다.

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

dunphy23의 이미지

덕분에 고민해결됬네요 ㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.