* 오브젝티브 C의 클래스
  - NSObject 클래스로부터 상속받는다
  - 선언부와 구현부가 분리되어 있다

* 선언부
@interface 클래스명 : 상위클래스명                            // 클래스는 일종의 Template
 {
      멤버변수 선언;
 }
 +- 메소드 선언;
 @end
 
  - static이나 const를 내부에서 선언할 수 없다. 오로지 멤버 변수만 가능.

* 구현부
@implements 클래스명
+- 메소드 구현
@end

@class NSObject
#import <Foundation / Foundation.h>

* 클래스 선언과 사용
  - 클래스는 무조건 포인터로 받는다
  - 클래스명 * 객체명;       <-- 객체 선언이지만 이 상태에서는 사용할 수 없다.
  - 객체명 = 다른 객체;     <-- Assign
  - 객체명 = [다른 객체 retain];           <-- Retain. Assign과 동작결과는 같지만 복사 구문이 아니다. 참조 카운터만 1 감소시키며,
                                                                할당된 메모리는 그대로 남아 있다. 참조 카운터가 0이 되었을 때 비로소 메모리가 해제
                                                                된다. 메모리 누수의 주된 원인 중의 하나이므로 반드시 메모리 해제를 해 줄것. 특히
                                                                인터페이스 빌더 등을 사용할 때 빈번하게 일어난다.
  - 객체명 = [다른 객체 copy];
  - 객체명 = [클래스명 alloc];             <-- 순수하게 메모리 할당만 받는다
  - 객체명 = [클래스명 new];              <-- 메모리 할당을 받고 초기화까지 해준다
  - 객체명 = [클래스명 allocWithZone : (NSZone *)zone];            <-- 하나의 Heap을 생성한다. 아이폰4의 멀티태스킹 작업에
                                                                                                          유리하게 사용될 것이다.
  - 객체명 = [클래스명 ? with ?];        <-- with라는 단어가 나오면 무조건 생성자나 초기화 역할을 하는 것. 앞에 무엇이 붙는가가 중요하다. 앞에 init가 붙지 않으면 생성자이며, init가 붙으면 초기화이다.

* 같은 기능을 하는 메소드지만 여러가지 종류가 있을 수 있다. 예를 들면
   awakeFromNib
   loadview
   viewDidLoad
  와 같은 것들인데, 결과는 같지만 실행 우선순위와 메모리 해제 시점이 다르기 때문에 이에 따라서 먼저 실행되는 부분이 결과가 나타나지 않는 경우가 많이 발생한다. 이 경우에는 retain 이 사용된 부분을 가장 우선적으로 검토하는 것이 좋다.

* 클래스 추가
  - XCode > File > New File > iPhone OS/Mac OS X > Cocoa Touch Class > Objective-C Class > NSObject를 선택.
  - 이름을 결정하면 class.h와 class.m이 바로 만들어진다.
  - 그러나 대개는 XCode의 왼쪽 구조창 중 class부분에서 오른쪽 클릭을 눌러 추가하는 방식이 일반적이다.

* 함수와 메소드의 차이
  - 함수 : C 스타일 함수, 또는 매크로 함수
  - 메소드 : 클래스 안에 선언된 함수
  - 오브젝티브 C에서는 기본적으로 C 스타일의 함수는 만들지 않는다. 만든다면 거의 매크로임.

* 메소드 선언
(결과형) 메소드 이름 : (자료형) 매개변수 이름  별명 : (자료형) 매개변수 이름

예) -(void) UIApplication : int XXX Section int YYY

  - 메소드 이름 부분은 대개 "누구", "어디" 라는 타겟, 장소를 의미하게 된다.
  - 별명 부분은 대개 "동작"을 의미한다.
  - " - "나 " + "를 붙인다.
  - " - "를 붙일 경우 의미가 인스턴스라는 뜻. 즉 멤버라는 뜻이 된다.
  - " + "가 붙을 경우 클래스라는 뜻.
  - 오버라이딩은 있지만 오버로딩은 없다.
 
* 변수
  - 인스턴스(멤버) 변수 : 클래스 내에서 선언되는 변수. 이 인스턴스 변수에만 접근 지정자 선언이 가능하다. (메소드나 클래스에는 사용 불가. 메소드나 클래스는 무조건 public이다)
     @private : 클래스 내부에서만 사용가능
     @protected : 클래스 내부에서, 그리고 상속받은 클래스에서도 사용가능
     @public : 클래스 내부, 상속받은 클래스, 객체에서 사용가능

  - 지역(Auto)변수 : 메소드 내에서 선언되어 그 안에서만 사용된다. Auto 키워드는 쓰거나 안쓰거나 자유지만 가능한 한 안쓰는 게 좋다.
  - static 변수
  - const 변수
  - static과 const는 File의 개념이므로 큰 의미가 없다
  - extern은 자료 교환을 위한 타입이지만 없어지지 않으므로 위험하다. (윈도우 모바일의 DLL과 비슷함. 한번 로드하면 메모리 해제를 해도 사용만 못하게 될 뿐 계속 남아있으므로 문제가 크다. 거의 사용할 필요가 없음.)

* getter와 setter의 개념
  - 멤버 변수와 메소드의 이름이 같아도 된다(오브젝티브 C만의 특성).
  - getter는 멤버 변수의 이름과 동일하게 사용하는 것을 권장한다.
  - setter는 set 변수명 으로 사용하는 것을 권장한다. 변수명의 첫 글자는 대문자.

{
int result;
}

-(int) result;      //  <-- getter
-(void) setResult : (int) temp;      //  <-- setter

-(int) result {return result;}      //  <-- getter
-(void) setResult : (int) temp {result = temp;}      //  <-- setter

[Obj setResult : 10];
NSLog(@"%d", [Obj result]);


* 프로퍼티
  - 위 방식은 메소드 갯수가 너무 많아지는 단점이 있기 때문에 도입된 것이 프로퍼티이다
  - setter와 getter 를 대신해서 사용할 수 있는 개념

  - 선언 :
   
@property (특성) 자료형 변수명;

    이렇게 씀으로서 setter와 getter의 선언이 완료된다.
    예 : @property int result;
    이것은 스레드 관련 권한의 처리도 겸하기 있기 때문에 권장되는 기능이다.

  - 구현 :

@synthersize 변수명;

    property문을 보고 구현해주는 역할만을 함.
    예 : @synthersize result;

* 프로퍼티의 특성
  - non atomic : 멀티 스레드를 제어하지 않는다. (속도를 빠르게 함) 지금까지는 아이폰에서 멀티태스킹을 할 필요가 없었기 때문에 거의 대부분이 이것을 사용해 퍼포먼스를 좋게 했었지만 앞으로는 이것을 지양해야 할 것이다.
  - setter, getter : 특성은 존재하지만 거의 안쓴다
  - assign, retain, copy : 객체에만 적용된다. 일반 value형 변수들은 값만을 사용하므로 의미가 없고 heap 메모리를 사용할 때에만 필요하다. copy는 "얕은 복사"라고 많이 표현하는데, 배열의 마지막 데이터가 아니라 첫번째 데이터만을 복사한다. 전체를 다 복사하는 "깊은 복사"는 archiving이라고 구분하여 표현한다.
  - read only, read//write : 읽기 전용 속성과 읽기/쓰기 속성. 이런 것이 있기 때문에 const를 사용하지 않는다. 읽기/쓰기 속성은 디폴트 값으로서, 따로 지정해 주지 않으면 이 속성이 되므로 거의 쓰지 않는다.
  - 위 속성들은 " , " 기호로 함께 사용할 수 있다. 다만 그 특성상 함께 쓸 수 없는 것들도 있다.
  - " . " 기호를 이용해서 접근 가능. " = " 기호(assign, 즉 할당 연산자)의 왼쪽에 " . " 기호가 사용되면 자동적으로 set이 호출된다.
    즉,
    [Obj setResult : 10];
    위 구문은
    Obj.result = 10;
    이렇게도 사용할 수 있다.
  - @synthersize _result = result;  <-- C에서 많이 사용되는 관습적 문법. 가능은 하지만 오브젝티브 C에서는 일반적인 문법은 아니다.

* Static 변수
  - 클래스 내부에 생성해서 모든 객체가 공유하기 위한 변수
  - 근본적으로 객체가 사용하게 된다.
  - 객체들 간의 통신에 사용한다.

static int sequence = 1;

-(id) init
{
self = [super init];
if(self != nil)    // 메모리를 제대로 받았는가 검사
{
    result = sequence++;
{
return self;
}
   
 
Posted by windship