티스토리 뷰


인스턴스가 생성되는 과정
────────────────────
인스턴스화, 즉 기존의 클래스로부터 인스턴스를 생성하기 위한 흐름은 다음과 같습니다.

(1) 인스턴스를 저장하기 위한 변수를 선언한다.
(2) 인스턴스를 생성한다.

인스턴스를 저장하는 변수의 선언
먼저 인스턴스 변수의 선언입니다. 여기서는 int형이나 float형 같이 C언어에 원래부터 있던 자료형과 Objective-C 객체의 데이터를 구별하기 위해서 전자를 기본 자료형, 후자를 객체형이라고 부르겠습니다.
인스턴스를 저장하기 위해서는 기본 자료형 변수의 선언과 마찬가지로 사전에 객체형 변수를 선언해야 합니다.
이 때 다음과 같은 형식으로 사용합니다. 기본 자료형 변수의 선언과 달리 변수 앞에 *가 붙어 있다는 점에 주의해야 합니다.
(Objective-C의 객체는 C언어 관점에서 구조체의 포인터입니다. '*'가 바로 포인터라는 것을 나타내고 있습니다.)

인스턴스 변수의 선언
클래스 *변수명;

예를 들어, Foundation 프레임워크에 있는 날짜 및 시각을 관리하는 클래스에 NSDate가 있습니다. NSDate 클래스의 인스턴스를 저장하는 변수 'date'를 선언하기 위해서는 다음과 같이 하면 됩니다.

NSDate *date;

또 다른 예로, Objective-C의 문자열 클래스인 NSString 클래스의 인스턴스를 저장하는 변수 'str'을 선언하기 위해서는 다음과 같이 해야 합니다.

NSString *str;

alloc과 init에 의한 인스턴스의 생성
Objective-C에서 인스턴스를 생성하는 방법에는 몇 가지가 있습니다. 예를 들어, NSString 클래스의 인스턴스는 소스 안에서 @"문자열"과 같은 문자열 리터럴로 기술하여 인스턴스를 생성할 수 있습니다. 단, 일반적인 클래스를 인스턴스화 할 경우, 가장 기본이 되는 것은 alloc 메소드로 인스턴스를 저장할 메모리 영역을 확보하고, init 메소드로 초기화하는 방법입니다.

alloc 메소드는 클래스를 인스턴스화 하는 메소드입니다. 구체적으로는 인스턴스를 저장할 메모리 영역을 확보하고, 그 자리에 생성된 인스턴스를 가리키는 값을 반환합니다. 이 alloc 메소드를 실행하는 시점에서는 아직 인스턴스가 존재하지 않는 상태이므로 클래스에 대해 실행하는 클래스 메소드이며, 다음과 같은 식으로 실행하게 됩니다.

인스턴스의 생성
변수 = [클래스 alloc];

NSDate 클래스를 인스턴스화 하는 예를 살펴 보겠습니다.

date = [NSDate alloc]; //인스턴스용 리소스를 확보

이런 경우, NSDate 클래스의 인스턴스가 변수 date에 저장됩니다. 또한, alloc 메소드는 해당 인스턴스 내의 모든 인스턴스 변수를 '0'으로 설정합니다. (BOOL 형식은 'no'를, 객체형은 'nil'로 초기화)
일반적으로 생성된 인스턴스를 사용 간으한 상태로 만들기 위해서는 클래스에 따른 초기화를 수행하는 init 메소드를 호출합니다. alloc과는 달리 init 메소드는 인스턴스 메소드이기 때문에 인스턴스에 대해서 실행합니다.
NSDate 클래스의 인스턴스인 경우에 init 메소드가 실행되면 실행 시점의 날짜와 시각을 표시하는 데이터를 가지도록 초기화되고, 초기화된 인스턴스가 반환됩니다. 따라서 그 결과를 원래 변수에 대입하면 초기화를 한 후의 인스턴스를 얻을 수 있습니다.

date = [date init]; //인스턴스
//date에 대입하고 init을 통해 date를 초기화

일반적으로 alloc으로 리소스를 확보한 것만으로는 인스턴스로서 기능하지 않는 경우가 대부분입니다. 따라서 보통 alloc과 init은 조합해서 사용하며, 다음과 같이 하나의 문으로 실행합니다.
date = [[NSDate alloc] init];

alloc과 init 메소드의 조합은 빈번하게 사용되기 때문에, 이 두 메소드를 차례로 실행하는 new라는 클래스 메소드도 있습니다.

date = [NSDate new];

범용 자료형
객체를 저장하는 범용 자료형으로 id형이 있습니다. 임의의 클래스 인스턴스를 id형식으로 선언할 수도 있고, 이런 경우에는 *가 필요없습니다. 클래스형식으로 선언한 경우와 마찬가지로 alloc + init 메소드의 조합으로 인스턴스를 생성하고 대입할 수 있습니다.

id date; // '*'는 불필요
date = [[NSDate alloc]init];

특정 클래스의 형식으로 선언한 경우와 id형으로 선언한 경우의 큰 차이점은 컴파일 시 형식의 체크 여부입니다. 가령 클래스에 들어 있지 않은 메소드를 호출하는 명령이 기술된 경우, 전자는 컴파일 시 경고가 표시되지만, 후자는 표시되지 않습니다. 물론 둘 다 클래스에서 제공하지 않는 메소드를 호출하면 실행 시 에러가 발생합니다.






   
728x90