상세 컨텐츠

본문 제목

[Objective-C] 메소드의 사용2

헉!!/Objective C

by 권태성 2012. 1. 12. 18:16

본문


description 메소드와 포맷 지정자 '%@'
──────────────────────────────
description 메소드는 인스턴스의 내부정보를 나타내는 문자열을 반환하는 메소드입니다. 이 메소드는 루트 클래스인 NSObject에 정의되어 있는데, 각 크래스에서는 필요에 따라 재정의 합니다. 이처럼 슈퍼클래스의 메소드를 서브클래스에서 재정의 하는 것을 오버라이드라고 합니다. NSDate 클래스의 description 메소드는 인스턴스의 내부에 저장되어 있는 날짜와 시각 데이터를 문자열 형식으로 반환하도록 오버라이드 되어 있습니다.

그런데 NSLog 함수의 포맷 지정자인 '%@'는 Objective-C의 문자열 즉, NSString 객체의 내용을 표시하기 위해서 사용했지만 사실은 그 이외의 객체에도 사용할 수 있습니다. 그런 경우, 그 클래스에 준비되어 있는 description 메소드 (혹은 descriptionWithLocale:메소드)가 자동으로 호출됩니다. 따라서 description 메소드를 호출해 NSString 객체에 대입하는 대신 다음과 같이 직접 NSDate 클래스의 인스턴스를 NSLog 함수의 인수로 전달해도 결과는 같습니다.

now = [[NSDate alloc]init]; //NSDate 객체를 생성

NSLog(@"%@", now); //NSLog 함수의 인수로 now 지정 



날짜와 시각을 한국어로 표시하기
─────────────────────────
날짜와 시각을 한국어로 표시하는 방법에 대해서 설명해 보겠습니다. 프로그램을 다양한 언어에 대응하게 하는 데 빼놓을 수 없는 존재가 로케일(Locale) 입니다. 로케일이란 언어와 국가, 지역을 지정하는 것을 말합니다. 로케일에 따라 사용하는 문자코드와 날짜 시각의 형식, 통화단위 등이 정해집니다.
NSDate 클래스에는 날짜 시각을 로케일에 맞는 형식으로 반환하는 descriptionWithLocale: 메소드가 준비되어 있습니다.

ㅇ 메소드 : descriptionWithLocale:
ㅇ 형 식 :  - (NSString *) descriptionWithLocale: (id) locale
ㅇ 설 명 : 지정한 로케일에 맞게 날짜와 시각을 표시하는 문자열을 반환한다.

인수의 형식이 범용 객체인 'id'로 되어 있지만, 실제로는 로케일을 관리하는 NSLocale 클래스의 인스턴스입니다. 현재의 로케일(한국어 환경이라면 한국어용 로케일)은 NSLocale 클래스의 currentLocale 메소드로 구할 수 있습니다.

ㅇ 메소드 : currentLocale
ㅇ 형 식 :  + (id) currentLocale
ㅇ 설 명 : 현재 사용자에 관한 NSLocale 클래스의 인스턴스를 반환한다.

앞에 '+'가 있는 것으로 봐서 클래스 메소드임을 알 수 있습니다. currentLocale은 init + alloc 메소드를 직접 사용하지 않고 객체를 생성하는데 사용되는 팩토리 메소드라는 종류의 메소드 입니다. 다음은 이 메소드를 사용한 소스 코드입니다.

#import <Foundation/Foundation.h>


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

NSDate *now;

NSString *nowStr;

now = [[NSDate alloc]init];

NSLocale *cLocale = [NSLocale currentLocale];
//현재의 로케일을 표시하는 NSLocale 클래스의 인스턴스를 생성

nowStr = [now descriptionWithLocale:cLocale];
//그것을 인수로 하여 descriptionWithLocale: 메소드를 실행하여
//한국어로 날짜와 시각을 나타내는 문자열 nowStr 생성

NSLog(@"%@", nowStr);//NSLog함수를 이용해 내용을 표시

return 0;

}


실행결과는 아래와 같습니다.


또한 8, 9번째 라인에서 로케일을 변수 cLocale에 저장하고 있지만, 변수를 사용하지 않고 다음과 같이 직접 descriptionWithLocale: 메소드의 인수로 지정해도 상관없습니다.
 

nowStr = [now descriptionWithLocale:[NSLocale currentLocale]];

 



 

관련글 더보기