Objective-C 셀렉터와 프로퍼티


  1. 셀렉터
    1. 셀렉터란? 클래스에 선언된 메소드를 구별하고, 선언된 메소드가 있는지 확인 및 실행해준다.
    2. 메소드를 구별하는 항목
      1. 메소드 이름
      2. 메소드의 파라미터 개수
      3. 메소드의 파라미터 레이블
      4. 셀렉터에서 메소드 구별하는 예시
        1. -(int)setWidth:(int)newWidth; -> setWidth:
        2. -(int)setWidth:(int)newWidth height:(int)newHeight; -> setWidth:height:
        3. -(int)setWidth:(int)newWidth height:(int)newHeight range:(int)tRange -> setWidth:height:range:
    3. 셀렉터 사용하기
      1. 형태 : @selector(메소드)
      2. SEL 타입 : SEL selector = @selector(length);
      3. 셀렉터 사용 예시
        1. -(int)setWidth:(int)newWidth; -> SEL s = @selector(setWidth:);
        2. -(int)setWidth:(int)newWidth height:(int)newHeight; -> SEL s = @selector(setWidth:height:);
        3. -(int)setWidth:(int)newWidth height:(int)newHeight range:(int)tRange -> SEL s = @selector(setWidth:height:range:);
      4. 셀렉터로 메소드 실행하기
        1. 셀렉터 실행 메소드
          1. -(id)performSelector:(SEL)aSelector
          2. -(id)performSelector:(SEL)aSelector withObject:(id)object
          3. -(id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2
        2. 셀렉터로 메소드 호출 (NSString 클래스에 있는 length 함수 호출)
          셀렉터로 메소드 호출하는 형태
          NSString *obj = [[NSString alloc] init];

          SEL selector = @selector(length);

          [obj performSelector:selector];
        3. 셀렉터를 사용하는 클래스에 해당 메소드가 있는지 여부 확인 : (BOOL)respondsToSelector:(SEL)aSelector
        4. 셀렉터를 사용하는 예시는 아래와 같다.
          예시) 입력된 문자를 모두 대문자로 변경
  2. 프로퍼티
    1. 프로퍼티란? 점(.)을 이용해서 데이터에 접근할 수 있는 툴을 의미한다.
    2. 프로퍼티 사용 방법 : 클래스 선언부에 프로퍼티 선언을 해준다.
      형태) @property ([프로퍼티 속성]) [타입] [변수명];
      1. 프로퍼티 속성
        1. 읽기/쓰기 제어
          1. readwrite : 읽기/쓰기 제어 (기본으로 생략 가능함)
            예시) @property (readwrite) int width;
          2. readonly : 읽기 전용
            예시) @property (readonly) int width
        2. 쓰레드 접근 제어
          1. atomic : 동시에 접근하는 쓰레드 제어(기본으로 생략가능)
            예시) @property (atomic) int width;
          2. nonatomic : 쓰레드 접근 제어 사용 안 함
            예시) @property (nonatomic) int width;
        3. 게터와 세터 메소드 이름
          1. getter = [게터 메소드 셀렉터]
          2. setter = [세터 메소드 셀렉터]
          3. 예시) @property (getter = getWidth, setter = setRactangleWidth:) int width; -> 보통 세터는 설정하지 않음 
        4. 메모리 소유권 (추후에 다룸)
      2. 프로퍼티와 멤버변수
        1. 프로퍼티 선언 시에 언더바(_) + 프로퍼티 이름의 멤버 변수가 생성된다.
        2. 멤버 변수 선언과 프로퍼티 선언을 함께한 경우 이름이 같아도 두 멤버 변수가 선언된 상태가 된다.
          프로퍼티와 멤버 변수
          @interface Ractangle : NSObject {
          int width;
          }
          @property int width;
          @property int height;

          @end
          주의 : width와 _width 가 선언된 상태로 (width는 선언된 멤버변수, _width는 프로퍼티에서 선언된 멤버변수) 값을 할당해줄 때 별도의 멤버 변수이므로 원하는데로 값이 할당되지 않을 수 있음
        3. 프로퍼티의 멤버 변수와 선언된 멤버변수를 같이 사용하려면, "synthesize" 키워드로 프로퍼티의 멤버변수를 셀렉터로 선언된 멤버변수로 변경해준다.
          형태)@synthesize [프로퍼티 이름]; / @synthesize [프로퍼티 이름] = [멤버 변수 이름];
        4. 2번에 대한 예시) @synthesize width; 를 구현부에 선언하면 "width" 하나로 사용 가능하다.
          1. 선언부에 아래와 같이 선언될 경우에 해당한다. (width, _width 가 선언)
          2. 구현부에 아래와 같이 선언 해주면, 같은 width로 같이 사용가능하다.
      3. 프로퍼티와 게터/세터 메소드
        1. 프로퍼티를 이용할 경우 단순히 값을 설정하고 설정된 값을 얻어오는 기본 행위만 정의된 함수가 정의가 되는데 추가적인 동작이 필요한 경우 게터와 세터 메소드를 별도로 작성 후 동작을 메소드에 추가한다.
        2. 프로퍼티로 선언된 게터와 세터의 기본명은 게터는 선언된 멤버변수명, 세터는 set + "선언된 멤버변수명(맨 처음글자만 대문자)"의 형태로 정의된 것과 동일하다.
        3. 별도의 작업이 필요한 경우에 구현부에 아래와 같이 넣어준다.
          예시) 사각형의 가로 길이가 0보다 작은 경우 0으로 변환하고, 세로 길이가 0보다 작은 경우 0으로 값을 얻어온다.