* import
  - C/C++의 include와 비슷하지만 몇 가지가 다르다.
  - 몇 번을 선언해도 한번만 실행됨.
  - 아이폰 프로그래밍에서는 거의 Foundation 하나만 import하면 끝난다.

* 앞에 NS가 붙는 것은 NextStep의 약자로 스몰토크 시절부터 내려온 함수라는 뜻.

* NSAutorelease : 아주 중요한 함수. 메모리 할당 후 나중에 drain으로 알아서 해제하겠다는 선언.
  -  [[NSAutorelease alloc] init] : alloc으로 메모리 할당. init로 초기화. 이 두가지를 한번에 하고 싶다면 new로 바꿔 쓸 수 있다.

* NSLog : C의 printf와 거의 같다.
  - NSLog(@"%d", 10);  <-- "%d"는 서식, 10은 데이터. 앞에 @가 붙는 것을 제외하면 같다.
  - C의 printf는 UTF-8 아스키 코드를 출력하지만 NSLog는 유니코드로 출력한다.

* 서식
  - %d, %i, %x, %o, %u
  - %f, %g
  - %c
  - %s : 주소부터 바이트 단위로 읽어서 null을 만날 때까지 문자로 출력
  - %@ : description 메소드 출력. C에는 없고 오브젝티브 C에만 있음. NSString, NSNumber, NSDate는 이것밖에 지원 안한다.

* 오브젝티브C에서는 기본적으로 데이터에 숫자처리는 없고 문자열로 취급한다.
  - 숫자데이터 10과 문자데이터 Hello가 있을 경우 이 둘을 합치고 싶으면 단순히 10 + "Hello" 해 버리면 됨.
  - 숫자데이터 10을 문자열로 바꾸고 싶을 경우 단순히 10 + "" 해버리면 됨.

* 자료형
  - 기본적으로 C의 자료형은 다 사용할 수 있다.
  - Value 타입 : C와 거의 같다. 없는 것은 BOOL 타입. BOOL 타입의 예:1, 아니오:0.
  - Reference 타입 : C의 포인터와 같다. 객체라는 뜻. 대개 주소라서 앞에 *을 붙이지만 id는 *가 붙지 않아도 주소로 받는다.
  - id는 C의 void *와 유사하다. 모든 데이터 타입의 주소를 기억할 수 있다. 동적 데이터 할당 - 자료가 들어올 때 그에 맞게 기억장소를 할당.

int a = 20;
float f = 10.7f;
void * vp = &a;
vp = &f;

  - 이 경우 printf("%d", *vp); 라고 하면 에러가 난다. void *는 시작주소는 기억하지만 사이즈는 기억하지 못하기 때문. 그래서 C언어에서는 (Cint *)vp)와 같이 vp를 int로 형변환을 해서 알아낸다.
  - 그러나 오브젝티브C에서는 자료 저장시에 이미 자료의 크기도 함께 저장한다. 따라서

id x = &a;
printf("%d", *x);

이렇게 하면 가능해진다.
 - 다만 id는 모든 자료타입을 다 받을 수 있기 때문에 차후 관리가 어렵다. 가능하면 사용하지 말고 형변환을 통해 사용하는 것을 추천.

* enum : 열거형 상수.
  - 아이폰 프로그래밍에서 매우 자주 사용하게 됨.
  - enum test {Zero, One, Two}; -> {K=10, Z, A} 와 같이 주었을 경우 Z는 11, A는 12가 된다(초기값부터 시작해 증가하게 됨).

* 연산자와 제어문은 C와 같다.

* 오브젝티브 C의 클래스
  - 선언부와 구현부가 분리되어 있다.
  - 선언부가 .h 파일에 들어가고, 구현부는 .m 파일에 들어간다.
  - 따라서 기본적으로 한 쌍으로 사용되며, 이름도 같은 것이 보통이다.

  - 선언 문법

@ interface 클래스명 : 상속되는 클래스                 // 반드시 상속되는 클래스가 필요하다
{
인스턴스 변수 선언;
}

+- (리턴타입) 메소드명;
@end

  - 구현 문법

@ implementation 클래스명                                   // 상속클래스명은 필요없다
+- (리턴타입) 메소드명;
{
정의
}
@end


* 메소드

  - "-"가 붙으면 인스턴스 메소드(객체).

(리턴타입) 메소드이름 : (매개변수 자료형) 매개변수명

+(void) disp : (int) a
{
    NSLog(@"%d", a);
}

  - 객체 생성
    클래스명 * 객체명 = [클래스명 alloc]; new

  - "+"가 붙으면 클래스 메소드.

Posted by windship