상세 컨텐츠

본문 제목

[Objective-C] 객체를 생성하는 다양한 방법 (1)

헉!!/Objective C

by 권태성 2012. 2. 20. 15:14

본문


다양한 이니셜라이저

────────────────────────────────────
alloc 클래스 메소드로 생성한 인스턴스를 초기화하기 위해서 init 메소드를 실행한다는 것은 앞에서 설명했습니다.
이 init 메소드처럼 인스턴스를 초기화하는 메소드를 이니셜라이저(initializer)라고 부릅니다. 클래스에 따라서는 다양한 상황에서 편리하게 사용할 수 있도록 여러 개의 이니셜라이저를 가지고 있는 것도 있습니다. Cocoa 환경에서는 관습적으로 이니셜라이저의 메소드명은 반드시 'init'으로 시작합니다.

NSDate 클래스의 이니셜라이저의 예

NSDate 클래스의 이니셜라이저는 인스턴스를 실행한 시점의 날짜와 시각을 데이터로 가지도록 초기화되지만, 특정한 날로 지정해서 초기화하고 싶은 경우도 있을 것입니다. 그런 경우를 대비해 NSDate 클래스에는 다양한 형식으로 일시를 지정하여 초기화하는 이니셜라이저들이 여러 개 준비되어 있습니다. 여기서는 그 중에서 initWithString: 메소드를 소개하겠습니다. 

ㅇ 메소드 : initWithString:
ㅇ 형 식 :  - (id) initWithString:(NSString *) description
ㅇ 설 명 : 날짜를 나타내는 문자열로부터 인스턴스를 생성한다.

initWithString: 메소드의 인수에는 다음과 같은 형식의 문자열을 지정합니다.

initWithString: 메소드의 인수
YYYY-MM-DD HH:MM:SS ±HHMM
Y:년 / M:월 / D:일 / H:시 / M:분 / S:초 / HHMM:GMT로부터의 오프셋

연도는 서력으로 4자리, 시간은 24시간제로 지정하빈다. 마지막에 GMT(국제표준시)로부터의 오프셋은 한국의 경우 '+0900'(9시간)이 됩니다. 예를 들어, 한국 시간 1959년 7월 3일 오전 0시로 초기화하기 위해서는 다음과 같이 합니다.

NSDate *theDate;

theDate = [[NSDate alloc] initWithString:@"1959-07-03 00:00:00 +0900"];



지정한 날짜까지의 일수를 구한다
Date 클래스의 메소드를 사용하면 날짜, 시각을 계산할 수 있습니다. 여기서는 앞에서 설명한 initWithString: 메소드에서 초기화한 날짜와 현재 날짜의 차를 구하는 예를 보여드리겠습니다. 과거 날짜와의 차는 마이너스 값으로 표기하기로 합니다.

현재와의 시간차를 구하기 위해서는 timeIntervalSinceNow 메소드를 사용합니다. 

ㅇ 메소드 : timeIntervalSinceNow
ㅇ 형 식 :  - (NSTimeInterval) timeIntervalSinceNow
ㅇ 설 명 : 현재 시간으로부터 경과시간을 초단위로 반환합니다. 과거는 마이너스 값이 됩니다.

반환값의 형식이 NSTimeInterval이라는 점에 주의해 주십히오. 이름인 'NS'로 시작되지만, 이것은 NSDate나 NSString과 같은 클래스명이 아닙니다. NSTimeInterval의 온라인 매뉴얼을 살펴보면 다음과 같이 기술되어 있습니다.


이 typedef는 자료형을 재정의하는 것입니다. 단순한 double형을 'NSTimeInterval'이라는 보다 의미 있는 이름으로 재정의한 것입니다. 프로그래머는 자료형으로 double 대신 NSTimeInterval을 사용함으로써 변수가 시간 차(Time Interval)를 나타내고 있다는 것을 명확히 할 수 있습니다.

#import <Foundation/Foundation.h>


int main (int argc, const char * argv[]) {

NSDate *theDate;


theDate = [[NSDate alloc] initWithString:@"2010-1-20 00:00:00 +0900"];

//initWithString: 메소드로 NSDate 객체를 초기화하고,

//시간 차를 구하고자 하는 일시를 theDate 저장

NSTimeInterval diff = [theDate timeIntervalSinceNow];

//현재시각과 theDate 시간 차를 구해서 변수 deff 저장

//여기서는 NSTimeInterval 형식으로 되어 있지만 실제로는 double형이라 수치연산을 있음

int days = diff / 60 / 60 / 24;

//diff 초단위의 값으로 되어 있으므로 60으로 나누어 분으로 만들고

//다시 60으로 나누어 시간으로 변환한 24 나뉘어 일수를 계산

NSLog(@"Days: %d", days);

    return 0;

}


 
int형 변수 days에 대입하고 있으므로 소수점 이하는 버려져 정수값이 됩니다.
결과는 NSLog로 출력합니다.


NSString 클래스의 이니셜라이저
Objective-C의 문자열, 즉 NSString 클래스의 인스턴스는 '@"Hello"'와 같은 문자열 리터럴을 사용해 생성할 뿐만 아니라, alloc 메소드와 이니셜라이저를 사용해 작성할 수도 있습니다. 예를 들어 init 메소드의 경우 길이가 0인 문자열, 다시 말해 빈 문자열이 작성됩니다.

NSString *str;

str = [[NSString alloc]init];


실제로 이런 메소드는 그다지 쓸모가 없고 이 보다 편리한 이니셜라이저로 initWithFormat:이 있습니다.

ㅇ 메소드 : initWithFormat:
ㅇ 형 식 :  - (id)initWithFormat:(NSString *) format...
ㅇ 설 명 : 포맷문자열에서 지정한 문자열을 생성한다.

이 메소드는 지금까지 몇 번이나 사용해 왔던 NSLog 함수의 인수처럼 포맷 지정자를 사용해 문자열을 생성하고 있습니다. 예를 들어 '2009/10/07' 같은 문자열을 생성하기 위해서는 다음과 같이 합니다.

NSString *str;

str = [[NSString alloc]initWithFormat:@"%d/%d/%02d", 2009, 10, 7];

 
'@"%d/%d/%02d"'에서 마지막의 %02d는 2자리 수로 표시한다는 것을 나타내며, 수치가 한자리인 경우에 앞을 0으로 채우도록 지정하는 것입니다.

또한, 'now:현재의 날짜시각' 같은 형식의 문자열을 생성하기 위해서는 포맷 지정자로 '%@'를 사용하고, 인수로 NSDate 클래스의 인스턴스를 지정하여 다음과 같이 합니다.

NSDate *now;

NSString *str;

now = [[NSDate alloc]init];

str = [[NSString alloc]initWithFormat:@"now:%@", now];

//str 'now:2010-01-20 00:00:00 +0900' 같은 문자열이 저장된다.  

관련글 더보기