2011. 12. 6. 14:28

[Objective C] 숫자를 표현하는 세가지 방법

출처 : http://blog.daum.net/hyunggullee/26

아이폰 앱 개발 시 숫자를 표현하기 위해 사용하는 다음 세 가지에 대한 의미를 살펴 본다.

- int:  primitive data type
- NSInteger: Foundation framework data type
- NSNumber: NSNumber 클래스의 인스턴스


1. int는 C에서 왔고 primitive data type(보통 원시 데이터 타입이라고 번역한다.) 최대값이 있는 숫자를 담을 변수에 보통 사용된다. 

2. NSInteger는 현재 사용하고 있는 아카텍처에 맞게  사이즈가 자동으로 설정되는 애플의 Foundation 프레임워크에 있는 특별한 primitive data type이다.

3. 숫자를 표현하기 위해 사용하는 세 번째 방식은 Foundation 프레임워크k의 NSNumber 클래스 인스턴스를 생성하는 것이다. 

int 와 NSInteger는 둘 다 객체(Object)가 아니다. 이 말은 동적 메모리 할당에 대해 걱정할 필요가 없다는 뜻이다. 미리 정의 된 사이즈가 있기 때문이다. 이 두 개의 데이터 타입은 스택(stack)에 생성된다. 힙(heap)에 생성되는 것이 아니라는 점에 주의하자. 그러므로 이 두 타입으로 선언된 변수의 값에 접근하기 위해서 포인터(pointer)가 필요 없다. 이와 유사한 데이터 타입으로 int, NSInteger, CGFloat, CGPoint, CGRect(Foundation Data Types Reference를 참고하라.) 등이 있다. 다시 한 번 말하지만체가 아니다. 그러므로 포인터(*)가 필요 없다.

이제 NSNumber 객체에 대해 살펴 보자.  새 NSNumber 객체는 다음과 같이 초기화 한다.

NSNumber *year = [NSNumber numberWithInt:2011];


그런데 NSNumber의 인스턴스를 생성하는데, +alloc과 -init 메서드가 없다. 아이폰 앱 개발자들은 다 알고 있겠지만, 바로 convenient class methods(보 통 유용한 클래스 메서드라고 번역이 되고 있다.)를 사용했다. 이 방식의 장점은 생성된 객체의 메모리 관리를 직접 할 필요가 없다는 점이다. 생성된 객체를 사용하고 나서 나중에 -release 메시지를 보내지 않아도 된다. 물론 다음과 같이 직접 개체를 생성할 수도 있다. 이 경우에는 직접 메모리 관리를 해야 한다.

NSNumber *year = [[NSNumber allocinitWithInt:2001];


이 렇게 해서 int 타입 2011를 랩핑한 NSNumber의 객체를 생성했다. 그런데 왜, 직접 int 또는 NSInteger를 사용하지 않고 NSNumber를 사용하는가? 하는 의문이 생긴다. 이유는 바로 객체를 만드는 데 꼭 다른 객체를 사용하는 몇몇의 Cocoa 클래스들이 있기 때문이다. 이 들은 primitive type들은 사용할 수 없다. 예를 들어, NSArray가 대표적인 경우이다. NSArray는 다른 객체들로 구성된 컬렉션(collection)을 관리하는 객체이다. 만약 숫자의 목록을 NSArray를 이용하여 관리하고자 한다면 NSNumber 객체를 사용해야만 한다. 물론 C의 배열(array)를 사용한다면 int와 NSInteger를 사용할 수 있다. 그렇지만 그렇게되면 NSArray에 내장된 유용한 많은 기능들은 사용할 수 없을 것이다.