'Objective-C의'에 해당되는 글 4건

  1. 2010.08.31 Objective-C의 기본 문법을 정리했습니다.
  2. 2010.08.22 Objective-C의 기초
  3. 2010.06.22 Objective-C의 기본 문법
  4. 2010.06.22 Objective-C의 특징
아이폰어플개발정보2010. 8. 31. 11:43
Objective-C의 기본 문법을 정리했습니다.

원글Learn Objective-C by Scott Stevenson

작성자 블로그의 첫페이지에 있는 말.


All of the buildings, all of those cars were once just a dream in somebody's head. — Peter Gabriel
(모든 빌딩과 모든 자동차들도 원래는 누군가의 머리속의 꿈에 지나지 않았다.)


<순서>
 1.메소드의 호출
 2.접근자
 3.오브젝트의 생성
 4.기본 메모리 관리법
 5.클래스 Interface (.h)
 6.클래스 Implementation (.m)
 7.메모리 관리법 좀더 살펴보기
 8.로깅
 9.프로퍼티
10.Nil 오브젝트의 메소드 호출
11.카테고리


1.메소드의 호출 +-----+-----+-----+-----+-----+


기본 문법
[object method];
[object methodWithInput:input];


다른 언어에서 말하는 오브젝트명.메소드명 이 여기서는 [오브젝트 메소드] 괄호에 둘러쌓여있고 스페이스로 구분하는 형식이 된다.

파라메터를 가지는 경우에는 [오브젝트 메소드:파라매터] 로 불린다. (메소드와 파라매터사이에 콜론이 존재)

리턴값이 있는 경우
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];


클래스 메소드도 같은 문법으로 호출 가능하다.
id myObject = [NSString string];


여기서 id란 myObject가 어떤 오브젝트의 참조도 될 수 있다는 뜻이며,
즉 컴파일 할 때에도 클래스 타입을 알지 못한다는 뜻이다.


하지만 여기선 딱 보면 NSString이란걸 알 수 있기에 아래와 같이도 쓸수 있다.
NSString* myString = [NSString string];


오브젝트 타입 옆에 *(아스타리스크)가 있는걸 볼 수 있다.
모든 Objective-c의 오브젝트 변수들은 포인터 타입이다.
id 타입은 이미 포인터 타입으로 정의 되어 있기 때문에 *(아스타리스크)를 붙일 필요가 없는것 뿐이다.


Nasted 메세지


일반적인 많은 프로그래밍 언어에서 Nasted 메소드나 함수를 호출할 때 아래와 같은 문법을 사용한다.
function1 ( function2() );


이것이 Objective-C에선 아래와 같이 표현된다.
[NSString stringWithFormat:[prefs format]];


다중 파라매터를 가지는 메소드 호출


이런 경우, Objective-C에서는 메소드 명을 여러 조각으로 나누어 사용한다.
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;


위의 메소드를 호출하는 방법은 아래와 같다.
BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO];


결국 이 말은 파라매터명이란 것이 존재 하지 않는 다는 뜻이며,
런타임 시스템에서 메소드 명은 writeToFile:atomically: 로 인식된다.

2.접근자 +-----+-----+-----+-----+-----+


Objective-c의 모든 인스턴스 변수들은 private이다. 즉 접근자를 사용하여 억세스 하여야 한다는 소리이다.


일반적인 문법


[photo setCaption:@"Day at the Beach"];
output = [photo caption];


두번째 줄의 코드는 인스턴스 변수를 직접 읽는다는 뜻이 아니라 caption이라는 메소드를 부르고 있는 것이다.
Objective-C에서는 일반적으로 getter 메소드에 get을 붙이지 않고 사용한다.


.(dot)를 이용한 문법


.(dot)는 접근자(getter and setter)를 위해 Objective-C 2.0에 새로 추가된 문법이다.


photo.caption = @"Day at the Beach";
output = photo.caption;


동일한 프로젝트 내에서는 한쪽 문법만 사용하는 것이 통일성 있게 코딩하는 방법이다.
또한 .(dot)는 일반 메소드 호출에는 사용할 수 없음을 명심하자.

3.오브젝트의 생성 +-----+-----+-----+-----+-----+


오브젝트를 생성하는 방법은 여러가지가 있다.


자동할당


NSString* myString = [NSString string];


자동으로 생성하여 할당해주는 편리한 방법이다. 자세한 내용은 나중에 살펴보도록 한다.
하지만 대부분의 오브젝트는 아래에 설명하는 수동 할당 방법을 사용하여야 한다.


수동할당


NSString* myString = [[NSString alloc] init];


이것은 메소드의 Nested된 호출방식이다.
우선 NSString클래스의 alloc메소드를 부른다.
이는 매우 하위레벨의 호출로써 메모리를 확보하고 오브젝트를 인스턴스화 한다.


다음으로 생성된 오브젝트의 init 메소드를 부른다.
init은 주로 초기화 작업을 하는데 예를 들면 내부 변수들의 인스턴스를 생성하는 작업 등이다.


값을 가지는 다른 버젼의 init을 호출하는 경우도 있다.


NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];

4.기본 메모리 관리법 +-----+-----+-----+-----+-----+


만약 Mac OS X에서 돌아가는 어플리케이션을 개발한다면 garbage collection을 사용할 수 있다.
다시 말하자면 복잡한 경우를 제외하고는 메모리 관리를 하지 않아도 된다는 뜻이다.


하지만 우리는 항상 garbage collection을 제공하는 환경하에서 작업하는 것이 아니기 때문에
기본 메모리 관리법을 알아 두도록 하자.


alloc을 이용하여 수동적으로 오브젝트를 생성하였을 경우에는 이를 release 하는 작업을 해야 한다.
반대로 자동으로 할당해주는 방법으로 생성한 오브젝트는 수동으로 release 하면 안된다.
이는 프로그램에 문제를 발생시킨다.


// string1 는 자동으로 release 될 것이다.
NSString* string1 = [NSString string];


// string2 는 사용이 끝난후 수동으로 release 해주어야 한다.
NSString* string2 = [[NSString alloc] init];
[string2 release];


여기서 string1 는 함수의 끝에서 자동으로 release된다고 생각하면 된다.


메모리 관리에 대해서 좀 더 알아둘 내용이 있지만
몇가지 다른 개념을 먼저 알고 가는 것이 좋음으로 뒤쪽에서 다시 보도록 한다.

5.클래스 Interface (.h) +-----+-----+-----+-----+-----+


Objective-C에서 클래스를 만드는 방법은 매우 간단하다.
.h 파일에 인터페이스를 적고 .m 파일에 내용을 적으면 된다.


.h 파일
인스턴스 변수와 퍼블릭 메소드의 인터페이스를 정의한다.


.m 파일
.h 에 정의한 인터페이스들을 implement한다.
그리고 private 메소드 들도 여기에 적어준다.


<.h 파일의 예>
#import

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}

//getters - 일반적으로 getter에 get을 붙이지 않는다는것은 위에서 언급한바 있다.
- (NSString*) caption;
- (NSString*) photographer;

//setters - setter에서 리턴값이 필요없다면 void로 지정한다.
- (void) setCaption: (NSString*)input;
- (void) setPhotographer: (NSString*)input;
@end


여기서 import한 Cocoa.h는 Cocoa 어플리케이션을 위한 기본 클래스들을 포함한다.
#import 명령은 하나의 파일을 여러번 읽어들이는 것을 자동적으로 방지해준다.

6.클래스 Implementation (.m) +-----+-----+-----+-----+-----+


위에서 정의한 Photo클래스의 .m 부분을 살펴보자.


#import "Photo.h"


@implementation Photo


- (NSString*) caption {
    return caption;
}
- (NSString*) photographer {
    return photographer;
}


@end


모든 메소드 내용들은 @implementation과 @end 사이에 기술된다.
이 getter 메소드들은 특별히 설명하지 않아도 친숙한 코딩방법이므로 넘어가도록 한다.


setter를 추가해보자.


- (void) setCaption: (NSString*)input
{
    [caption autorelease];
    caption = [input retain];
}


- (void) setPhotographer: (NSString*)input
{
    [photographer autorelease];
    photographer = [input retain];
}


settter는 좀 설명이 필요할 듯 하다.
하나의 setter안에는 두 변수가 사용된다. 하나는 기존의 오브젝트의 참조이고 하나는 파라매터로 넘어온 새로운 오브젝트이다.
만약 garbage collection을 사용할 수 있는 환경이라면 단순히 아래와 같이 적어주면 된다.


- (void) setCaption: (NSString*)input {
    caption = input;
}


하지만 그렇지 않다면 첫번째 예제와 같이 release와 retain을 수동적으로 적어줘야 할 것이다.
우선 release 방법에는 release 와 autorelease 의 두가지 방법이 있는데,
스탠다드 release는 오브젝트 참조를 바로 삭제하는 방법이고, autorelease는 가까운 시일내에 release할 것을 명령하는 방법이다.
단, autorelease를 지정한 경우에 기존 오브젝트는 현재 실행되고 있는 함수 안에서는 유효하다고 볼 수 있다.


setter메소드 안에서는 autorelease 를 사용할 것을 추천한다.
왜냐하면 새 오브젝트와 기존 오브젝트가 같은 오브젝트를 가르키고 있는 경우도 있기 때문이다.
이럴 경우 스탠다드 release를 사용해 버리면 원치 않게 새로 오브젝트를 삭제해 버리는 경우가 생긴다.


이 부분이 지금 바로 이해가 가지 않는다고 해도 좀 더 공부하면 서서히 알게 될 것이니 걱정하지 않아도 된다.

Init


인스턴스 변수들을 초기화하기 위해 Init 메소드를 정의한다.


- (id) init
{
    if ( self = [super init] )
    {
        [self setCaption:@"Default Caption"];
        [self setPhotographer:@"Default Photographer"];
    }
    return self;
}


여기서 if 문의 조건은 == 이 아니라 = 이다.
즉, 같다면 이라는 비교문이 아니라 [super init]의 결과를 self 에 대입하고 있다는 뜻이다.
이 예제 메소드에서는 슈퍼클래스에게 초기화를 대신 요청하고 그 결과에 문제가 없으면 다른 변수들에 기본값을 세팅하고 있다.

Dealloc


dealloc 메소드는 오브젝트가 메모리에서 삭제될때 불려진다.
고로 이 메소드 안에서 자신이 가지고 있는 인스턴스 변수들의 참조를 release 해 주면 된다.


- (void) dealloc
{
    [caption release];
    [photographer release];
    [super dealloc];
}


클래스의 멤버 변수 였던 caption과 photographer는 그냥 스탠다드 release를 이용하여 release 한다.
이게 더 빠른 방법이므로 여기서 autorelase를 이용할 필요는 없다.


마지막 줄의 [super dealloc]은 슈퍼클래스에게 메모리 release를 요청하는 것인데,

만약 이것을 까먹는다면 memory leak 문제가 발생할 수 있을 것이다.


dealloc메소드는 garbage collection이 이용되고 있는 환경에서는 불려지지 않으며 대신 finalize 메소드를 정의한다.

7.메모리 관리법 좀더 살펴보기 +-----+-----+-----+-----+-----+


Objective-C에서는 참조카운터라는 메모리 관리 수법을 사용한다.


오브젝트를 생성(alloc) 하거나 보유(retain - 메소드 파라매터로 넘어올때) 할때 참조 카운터는 1씩 증가한다.
생성한 오브젝트를 retain 하면 카운터는 2가 되어있을 것이며 우리는 각각의 alloc 과 retain에 대해 release를 해줘야 한다.


하지만 실제로 우리가 오브젝트를 생성하는 경우는 아래 2가지 상황 뿐이다.


1.클래스의 인스턴스 변수로 사용할때
2.함수안에서 임시로 사용할 때


1번의 인스턴스 변수는 주로 autorelease와 dealloc에서 release 해주게 된다.


그럼 우리가 해결해야 할 것은 2번의 로컬변수들인데, 이것도 결국은 같은 이치로 alloc 이나 copy로 생성된 오브젝트를 사용후
함수안에서 autorelease나 release해주면 되는 것 뿐이다.


<1의 예제>
- (void) setTotalAmount: (NSNumber*)input
{
    [totalAmount autorelease];
    totalAmount = [input retain];
}


- (void) dealloc
{
    [totalAmount release];
    [super dealloc];
}


<2의 예제>
NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];
NSNumber* value2 = [NSNumber numberWithFloat:14.78];


// value2 는 alloc으로 생성하지 않았기 때문에 release 할 필요가 없다.
[value1 release];


이부분이 이해 된다면 Objective-C 의 메모리 관리의 90%를 파악했다고 할 수 있다.\

※ retain (오브젝트의 보유) 에 관하여

수신한 오브젝트를 파기하고 싶지 않은 경우도 있다. 예를 들어 인스턴스변수에 오브젝트를 캐쉬할 필요가 있을지도 모른다.
이런 경우, 오브젝트가 필요한지 어떤지 알수 있는건 본인 뿐임으로 사용중인 오브젝트를 파기당하지 않도록 보증하는 수단이 필요해진다. 이럴때 바로 retain 메소드를 사용한다. 이 메소드는 보류중인 autorelease 효과를 정지시켜 그 오브젝트가 필요없어 질때까지 relase되지 않도록 보장해준다.

8.로깅 +-----+-----+-----+-----+-----+


Objective-C의 로깅은 매우 심플하다. NSLog 함수가 거의 printf() 와 유사하기 때문이다.
단, %@ 라는 오브젝트를 표현하는 포멧이 추가되어 있다.


NSLog ( @"The current date and time is: %@", [NSDate date] );


NSLog를 이용하여 오브젝트를 콘솔에 찍으면 사실 오브젝트의 description메소드가 불려짐으로,
이를 오버라이드하여 원하는 결과를 찍어볼 수 있다.

9.프로퍼티 +-----+-----+-----+-----+-----+


Objective-C의 특징에 설명되어 있음으로 예제만 나열하도록 한다.


위에서 봐 온 getter와 setter가 적혀있는 예제를 property를 이용하여 아래와 같이 간략해진다.


#import

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;

@end



#import "Photo.h"

@implementation Photo

@synthesize caption;
@synthesize photographer;

- (void) dealloc
{
    [caption release];
    [photographer release];
    [super dealloc];
}

@end


@synthesize는 소스내에 정의되어 있지 않은 getter/setter만 자동생성 해주기 때문에 안심하고 사용할 수 있다.

10.Nil 오브젝트의 메소드 호출 +-----+-----+-----+-----+-----+


Objective-C의 nil 오브젝트는 다른 프로그래밍 언어에서 말하는 NULL 오브젝트와 동일한 개념이다.
한가지 다른점은 nil인 오브젝트의 메소드를 호출하여도 에러가 나지 않는다는 점이다.


이것은 여러가지 방법으로 활용되지만 가장 편리한 점은 널 체크를 하지 않고 메소드를 호출할 수 있다는 점이다.


또한 dealloc의 성능을 높이기 위해서 사용할 수도 있다.
- (void) dealloc
{
    self.caption = nil;
    self.photographer = nil;
    [super dealloc];
}


여기서 nil을 인스턴스 변수의 값으로 넘기면 setter는 nil을 retain하고 기존 오브젝트를 release 한다.
이 방법은 dealloc에서 매우 효율적인데, 왜냐하면 nil을 세팅하므로써 변수가 다른 오브젝트를 참조할 가능성이 없어지기 때문이다.


self.를 붙여 setter를 호출해야하지 caption = nil; 이라고 하면 잘못된 방법이므로 memory leak를 초래한다.

11.카테고리 +-----+-----+-----+-----+-----+

카테고리는 Objective-C의 유용한 특징중에 하나이다.
요점부터 말하자면 카테고리는 기존의 클래스의 서브클래스를 생성하지 않고도 메소드를 추가할 수 있다.
(확장하고자 하는 클래스의 내부구조를 파악할 필요가 없다.)


이는 매우 유용한데, 왜냐하면 예를 들어 NSString에 그냥 카테고리를 추가만 하면 그 프로젝트 안에서 카테고리로서 추가된 메소드를 사용 할 수 있기 때문이다. 즉, NSString을 계승하여 새 클래스를 만들어 그것을 alloc하여 쓴다.. 하는 복잡한 과정이 필요없다는 뜻이자.


예제를 살펴보자.

<헤더>
#import

@interface NSString (Utilities)
- (BOOL) isURL;
@end

<클래스>
#import "NSString-Utilities.h"

@implementation NSString (Utilities)

- (BOOL) isURL
{
    if ( [self hasPrefix:@"http://"] )
        return YES;
    else
        return NO;
}

@end


일반 클래스와의 차이는 단지 슈퍼클래스의 정의가 없고 클래스 명 뒤의 괄호안에 카테고리 명을 써 준 다는 점 뿐이다.


위에서 추가한 메소드를 사용해 보는 예제를 살펴보자
NSString* string1 = @"http://pixar.com/
";
NSString* string2 = @"Pixar";

if ( [string1 isURL] )
    NSLog (@"string1 is a URL");

if ( [string2 isURL] )
    NSLog (@"string2 is a URL");  


카테고리는 서브클래스 확장과는 달리 인스턴스 변수는 추가 할 수 없다.
하지만 기존의 메소드를 오버라이드 하는것은 가능한데 이는 매우 신중히 해야할 작업중 하나이다.


기억해둬야 할 중요한 사항은, 클래스 카테고리를 사용한 변경은 어플리케이션의 모든 클래스 인스턴스에 영향을 준다는 사실이다.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075417177
Posted by 오늘마감

댓글을 달아 주세요

오브젝트C2010. 8. 22. 19:58
Objective-C의 기초

http://developer.apple.com/iphone/gettingstarted/docs/objectivecprimer.action

Objective-C 언어는 객체지향 Programming이 가능한 심플한 컴퓨터 언어이다. Objective-C는 표준 ANSI C를 확장하였으며 이를 통하여 클래스, 메써드, properties를 정의 하며 클래스의 동적확장을 더욱 더 증진시킨다. 클래의 문법과 설계는 Smalltalk에 기반을 하며 이는 최초의 객체지향 programming 언어이다.

객체지향 Programming을 해본적이 있다면 아래의 내용은 Object-C의 기본 문법을 배우는데 도움이 되는 정보이다. 많은 전통적인 객체지향 개념들(슐화, 상속성, 다향성과 같은) Object-C 안에서 모두 구현이 가능하다. 몇몇 중요한 차이점은 이 문서에 소개가 될것이고 더 깊은 정보들에 대해서 제공을 한다.

만약 객체지향 Programming 언어를 써본적 없다면 다음으로 넘어가기 전에 기본 개념을 이해할 필요가 있다. 객체의 사용 그리고 객체지향적인 개념은 iPhone Application을 설계하는 기본이며 어떻게 상호작용을 하는지에 대한 이해는 iPhone application을 중요하다. 객체지향개념의 개론은 Object-Oriented Programming with Objective-C을 보라. 추가적으로 Cocoa Fundamentals Guide를 보면 Cocoa에서 객체지향 디자인패턴을 사용하는 방법에 대한 정보를 얻을 수 있다.

For a more detailed introduction to the Objective-C language and syntax, see The Objective-C 2.0 Programming Language.

Object-C 언어와 문법에 대한 상세한 소개는 The Objective-C 2.0 Programming Language을 보라.

Objective-C: A Superset of C c의 확장

Objective-C는 ANSI 버젼의 c언어와 기본적인 c문법의 집합이다. C코드처럼 헤더 파일과 소스파일을 분리하여 선언부와 구현부를 분리하여 정의할 수 있다. Objecive-C에서 사용하는 파일 확장자는 표1에 나와있다.

 
표1  Objective-C code의 확장자

헤더파일. 헤더파일은 class, type, function, 상수의 정의를 포함한다.

소스 파일. 이 확장자는 Objective-C와 C 코드를 사용한 소스이다.

소스 파일. 이 확장자는 Objective-C와 C++ class를 사용할 수 있다. C++ class에 대한 접근도 가능하다.

When you want to include header files in your source code, you can use the standard #include compiler directive but Objective-C provides a better way. The #import directive is identical to #include, except that it makes sure that the same file is never included more than once. The Objective-C samples and documentation all prefer the use of #import, and your own code should too.

소스코드에 헤더 파일을 포함하고 싶다면, 표준방식 #include를 사용하여 컴파일러에 직접 지시할 수 있다 그러나 Objective-C는 더 좋은 방법을 제공한다. #import는 #include와 동일한 지시를 하지만 한번이상 동일한 파일이 포함되지 않게 만든다. Objective-C 예제와 문서에는 모두 #import를 사용하고 너의 코드에도 그렇게 해라.

Strings

C의 포함집합(superset)이라는 것은 Objective-C가 C의 규칙으로 string을 사용하는 것을 지원한다. 다른 말로, 하나의 character들은 '로 묶이고 문자열은 "으로 묶인다는 것이다. 그렇지만, 대부분의 Objective-C framework들은 C형식의 문자열 자주 사용하지 않는다. 그대신에 대부분의 framework들은 NSString 객체로 통용된다.

NSString class,는 당신이 기대하는 모든 잇점을 가지고 있으며, 저장된 임의길이의 문자열을 위한 완성된 메모리 관리를 포함하고, Unicode를 지원, printf형태의 유용한 포맷팅 그리고 더 많은 것을 가진 문자열을 싸고있는 객체이다. 때문에 비슷한 문자열은 일반적으로 사용이 되지만 Objective-C는 NSString객체를 상수로부터 생성할 수는 약식표기법을 지원한다. 이같은 약식 표기를 사용하려면 모든 문자열의 앞에 @를 붙여야 하며 다음 예제에 나온다.

NSString* myString = @"My String\n"; NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"]; // Create an Objective-C string from a C string NSString* fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding]; 

Classes

다른 모든 객체지향 언어처럼, Objective-C안의 클래스들은 일부 데이터에 대해 캡슐화를 지원 한다. 객체는 실행시기의 클래스의 instance이며, 그리고 클래스의 클래스 와 method의 포인터에 의해 선언된 instance 변수의 복사본 을 그것 자신에 포함한다.

Objective-C 클래스의 명세는 두개의 뚜렷한 구분을 필요로 하는데 그것은 interface 그리고 imlementation이다. Interface는 클래스의 정의 일부를 선언하고 클래스와 교류하는 instance 변수와 method를 정의 한다. Implementation 클래스의 실제 동작하는 코드를 가진 method 일부를 포함한다. 그림1은 MyClass라고 불리는 클래스를 선언하는 문법을 보여주는데 이 클래스는 NSObject 기본 클래스를 상속 받았다. 클래스의 정의는 항상 @interface로 시작해서 컴파일러에 지시한다. 그리고 끝은 @end로 지시한다. 그 다음 클래스 이름은(:으로 구분된) 부모클래스의 이름이다. 클래스의 instace(또는 맴버) 변수는 { }블럭안에 정의된다. 그 뒤로 클래스의 method들이 정의 된다. 세미콜론은 instance변수 와 method의 정의가 끝났음을 나타낸다.

(출처:iPhone Dev Center)

Listing 1 shows the implementation of MyClass from the preceding example. Like the class declaration, the class implementation is identified by two compiler directives—here, @implementation and @end. These directives provide the scoping information the compiler needs to associate the enclosed methods with the corresponding class. A method’s definition therefore matches its corresponding declaration in the interface, except for the inclusion of a code block.

리스트1은 앞선 예제 MyClass의 구현을 보여준다. 클래스의 선언처럼 클래스의 구현은 컴파일러에 두개의 지시자인 @implementation과 @end로 선언이 된다. 이 지시자들은 일치하는 클래스와 함께 둘러싸인 메써들과 필요한 연동을 제공한다. 메써드의 정의와 어울리는 인터페이스안의 일치하지만 그 인터페이스의 선언과 일치하는 포함된 코드블럭은 제외한다.

Listing 1  A class implementation

@implementation MyClass - (id)initWithString:(NSString *) aName { if (self = [super init]) { count count = 0; data = nil; name = [aName copy]; return self; } } + (MyClass *)createMyClassWithString: (NSString *) aName { return [[[self alloc] initWithString:aName] autorelease]; } @end

Note: Although the preceding class declaration declared only methods, classes can also declare properties. For more information on properties, see “Properties”.

When storing objects in variables, you always use a pointer type. Objective-C supports both strong and weak typing for variables containing objects. Strongly typed pointers include the class name in the variable type declaration. Weakly typed pointers use the type id for the object instead. Weakly typed pointers are used frequently for things such as collection classes, where the exact type of the objects in a collection may be unknown. If you are used to using strongly typed languages, you might think that the use of weakly typed variables would cause problems, but they actually provide tremendous flexibility and allow for much greater dynamism in Objective-C programs.

The following example shows both strongly and weakly typed variable declarations for the MyClass class:

NOTE:단지 method의 선언을 정의하기 전이라고 해도 클래스는 properties선언을 통해 할 수 있다. properties에 대한 더 많은 정보를 원한다면 "Properties"를 보라.

변수에 객체를 저장할때 당신은 항상 포인트 타입을 사용한다. Objective-C 강한형(Strongly type)과 약한형(Weekly type) 두가지를 통해 변수에 객체를 저장하는 방법을 제공한다. 강한형 포인터들은 변수형 선언안에 클래스의 이름을 포함한다. 약한형 포인터는 객체 대신에 id type을 사용한다. 약한형 포인터들은 collection 클래스를 이용할때 사용이 되는 이유는 collection 정확한 클래스의 형태를 알 수 없을때 사용이 된다. 마약 당신이 강한형 포인트를 사용하는 언어를 사용했다면, 넌 약한형이 문제를 일으킬것이라고 생각하게 된다 그러나 그것들은 크다란 융통성과 Objective-C의 큰 원동력을 허용한다.

다음 예제는 MyClass class에서 쓸 두가징형태의 변수 방법을 보여준다

MyClass* myObject1; // Strong typing id myObject2; // Weak typing 

Methods

A class in Objective-C can declare two types of methods: instance methods and class methods. An instance method is a method whose execution is scoped to a particular instance of the class. In other words, before you call an instance method, you must first create an instance of the class. Class methods, by comparison, do not require you to create an instance, but more on that later.

The declaration of a method consists of the method type identifier, a return type, one or more signature keywords, and the parameter type and name information. Figure 2 shows the declaration of the insertObject:atIndex: instance method. The declaration is preceded by a minus (-) sign, which indicates that this is an instance method. The method’s actual name (insertObject:atIndex:) is a concatenation of all of the signature keywords, including colon characters. The colon characters declare the presence of a parameter. If a method has no parameters, you omit the colon after the first (and only) signature keyword. In this example, the method takes two parameters.

 

 


출처 : http://blog.naver.com/PostView.nhn?blogId=baek2187&logNo=150059568493
Posted by 오늘마감

댓글을 달아 주세요

오브젝트C2010. 6. 22. 17:53
Objective-C의 기본 문법

아무리 무작정 따라하기 라지만, 역시 기본 문법도 모르고는 앞으로 나아가기가 쉽지 않다.

그렇다고 또 한권짜리 문법책을 읽기엔 너무 지루해서 흐름이 멈춘다.

다행히 기본 문법을 한페이지(?)로 간략히 메모해놓은 사이트가 있다.

앞에서 정리한 Objective-C의 특징과 겹치는 부분들도 있지만 훨씬 이해하기 편하게 적혀있다.


원글Learn Objective-C by Scott Stevenson
작성자 블로그의 첫페이지에 있는 말.


All of the buildings, all of those cars were once just a dream in somebody's head. — Peter Gabriel
(모든 빌딩과 모든 자동차들도 원래는 누군가의 머리속의 꿈에 지나지 않았다.)


<순서>
 1.메소드의 호출
 2.접근자
 3.오브젝트의 생성
 4.기본 메모리 관리법
 5.클래스 Interface (.h)
 6.클래스 Implementation (.m)
 7.메모리 관리법 좀더 살펴보기
 8.로깅
 9.프로퍼티
10.Nil 오브젝트의 메소드 호출
11.카테고리


1.메소드의 호출 +-----+-----+-----+-----+-----+


기본 문법
[object method];
[object methodWithInput:input];


다른 언어에서 말하는 오브젝트명.메소드명 이 여기서는 [오브젝트 메소드] 괄호에 둘러쌓여있고 스페이스로 구분하는 형식이 된다.

파라메터를 가지는 경우에는 [오브젝트 메소드:파라매터] 로 불린다. (메소드와 파라매터사이에 콜론이 존재)

리턴값이 있는 경우
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];


클래스 메소드도 같은 문법으로 호출 가능하다.
id myObject = [NSString string];


여기서 id란 myObject가 어떤 오브젝트의 참조도 될 수 있다는 뜻이며,
즉 컴파일 할 때에도 클래스 타입을 알지 못한다는 뜻이다.


하지만 여기선 딱 보면 NSString이란걸 알 수 있기에 아래와 같이도 쓸수 있다.
NSString* myString = [NSString string];


오브젝트 타입 옆에 *(아스타리스크)가 있는걸 볼 수 있다.
모든 Objective-c의 오브젝트 변수들은 포인터 타입이다.
id 타입은 이미 포인터 타입으로 정의 되어 있기 때문에 *(아스타리스크)를 붙일 필요가 없는것 뿐이다.


Nasted 메세지


일반적인 많은 프로그래밍 언어에서 Nasted 메소드나 함수를 호출할 때 아래와 같은 문법을 사용한다.
function1 ( function2() );


이것이 Objective-C에선 아래와 같이 표현된다.
[NSString stringWithFormat:[prefs format]];


다중 파라매터를 가지는 메소드 호출


이런 경우, Objective-C에서는 메소드 명을 여러 조각으로 나누어 사용한다.
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;


위의 메소드를 호출하는 방법은 아래와 같다.
BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO];


결국 이 말은 파라매터명이란 것이 존재 하지 않는 다는 뜻이며,
런타임 시스템에서 메소드 명은 writeToFile:atomically: 로 인식된다.

2.접근자 +-----+-----+-----+-----+-----+


Objective-c의 모든 인스턴스 변수들은 private이다. 즉 접근자를 사용하여 억세스 하여야 한다는 소리이다.


일반적인 문법


[photo setCaption:@"Day at the Beach"];
output = [photo caption];


두번째 줄의 코드는 인스턴스 변수를 직접 읽는다는 뜻이 아니라 caption이라는 메소드를 부르고 있는 것이다.
Objective-C에서는 일반적으로 getter 메소드에 get을 붙이지 않고 사용한다.


.(dot)를 이용한 문법


.(dot)는 접근자(getter and setter)를 위해 Objective-C 2.0에 새로 추가된 문법이다.


photo.caption = @"Day at the Beach";
output = photo.caption;


동일한 프로젝트 내에서는 한쪽 문법만 사용하는 것이 통일성 있게 코딩하는 방법이다.
또한 .(dot)는 일반 메소드 호출에는 사용할 수 없음을 명심하자.

3.오브젝트의 생성 +-----+-----+-----+-----+-----+


오브젝트를 생성하는 방법은 여러가지가 있다.


자동할당


NSString* myString = [NSString string];


자동으로 생성하여 할당해주는 편리한 방법이다. 자세한 내용은 나중에 살펴보도록 한다.
하지만 대부분의 오브젝트는 아래에 설명하는 수동 할당 방법을 사용하여야 한다.


수동할당


NSString* myString = [[NSString alloc] init];


이것은 메소드의 Nested된 호출방식이다.
우선 NSString클래스의 alloc메소드를 부른다.
이는 매우 하위레벨의 호출로써 메모리를 확보하고 오브젝트를 인스턴스화 한다.


다음으로 생성된 오브젝트의 init 메소드를 부른다.
init은 주로 초기화 작업을 하는데 예를 들면 내부 변수들의 인스턴스를 생성하는 작업 등이다.


값을 가지는 다른 버젼의 init을 호출하는 경우도 있다.


NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];

4.기본 메모리 관리법 +-----+-----+-----+-----+-----+


만약 Mac OS X에서 돌아가는 어플리케이션을 개발한다면 garbage collection을 사용할 수 있다.
다시 말하자면 복잡한 경우를 제외하고는 메모리 관리를 하지 않아도 된다는 뜻이다.


하지만 우리는 항상 garbage collection을 제공하는 환경하에서 작업하는 것이 아니기 때문에
기본 메모리 관리법을 알아 두도록 하자.


alloc을 이용하여 수동적으로 오브젝트를 생성하였을 경우에는 이를 release 하는 작업을 해야 한다.
반대로 자동으로 할당해주는 방법으로 생성한 오브젝트는 수동으로 release 하면 안된다.
이는 프로그램에 문제를 발생시킨다.


// string1 는 자동으로 release 될 것이다.
NSString* string1 = [NSString string];


// string2 는 사용이 끝난후 수동으로 release 해주어야 한다.
NSString* string2 = [[NSString alloc] init];
[string2 release];


여기서 string1 는 함수의 끝에서 자동으로 release된다고 생각하면 된다.


메모리 관리에 대해서 좀 더 알아둘 내용이 있지만
몇가지 다른 개념을 먼저 알고 가는 것이 좋음으로 뒤쪽에서 다시 보도록 한다.

5.클래스 Interface (.h) +-----+-----+-----+-----+-----+


Objective-C에서 클래스를 만드는 방법은 매우 간단하다.
.h 파일에 인터페이스를 적고 .m 파일에 내용을 적으면 된다.


.h 파일
인스턴스 변수와 퍼블릭 메소드의 인터페이스를 정의한다.


.m 파일
.h 에 정의한 인터페이스들을 implement한다.
그리고 private 메소드 들도 여기에 적어준다.


<.h 파일의 예>
#import <Cocoa/Cocoa.h>

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}

//getters - 일반적으로 getter에 get을 붙이지 않는다는것은 위에서 언급한바 있다.
- (NSString*) caption;
- (NSString*) photographer;

//setters - setter에서 리턴값이 필요없다면 void로 지정한다.
- (void) setCaption: (NSString*)input;
- (void) setPhotographer: (NSString*)input;
@end


여기서 import한 Cocoa.h는 Cocoa 어플리케이션을 위한 기본 클래스들을 포함한다.
#import 명령은 하나의 파일을 여러번 읽어들이는 것을 자동적으로 방지해준다.

6.클래스 Implementation (.m) +-----+-----+-----+-----+-----+


위에서 정의한 Photo클래스의 .m 부분을 살펴보자.


#import "Photo.h"


@implementation Photo


- (NSString*) caption {
    return caption;
}
- (NSString*) photographer {
    return photographer;
}


@end


모든 메소드 내용들은 @implementation과 @end 사이에 기술된다.
이 getter 메소드들은 특별히 설명하지 않아도 친숙한 코딩방법이므로 넘어가도록 한다.


setter를 추가해보자.


- (void) setCaption: (NSString*)input
{
    [caption autorelease];
    caption = [input retain];
}


- (void) setPhotographer: (NSString*)input
{
    [photographer autorelease];
    photographer = [input retain];
}


settter는 좀 설명이 필요할 듯 하다.
하나의 setter안에는 두 변수가 사용된다. 하나는 기존의 오브젝트의 참조이고 하나는 파라매터로 넘어온 새로운 오브젝트이다.
만약 garbage collection을 사용할 수 있는 환경이라면 단순히 아래와 같이 적어주면 된다.


- (void) setCaption: (NSString*)input {
    caption = input;
}


하지만 그렇지 않다면 첫번째 예제와 같이 release와 retain을 수동적으로 적어줘야 할 것이다.
우선 release 방법에는 release 와 autorelease 의 두가지 방법이 있는데,
스탠다드 release는 오브젝트 참조를 바로 삭제하는 방법이고, autorelease는 가까운 시일내에 release할 것을 명령하는 방법이다.
단, autorelease를 지정한 경우에 기존 오브젝트는 현재 실행되고 있는 함수 안에서는 유효하다고 볼 수 있다.


setter메소드 안에서는 autorelease 를 사용할 것을 추천한다.
왜냐하면 새 오브젝트와 기존 오브젝트가 같은 오브젝트를 가르키고 있는 경우도 있기 때문이다.
이럴 경우 스탠다드 release를 사용해 버리면 원치 않게 새로 오브젝트를 삭제해 버리는 경우가 생긴다.


이 부분이 지금 바로 이해가 가지 않는다고 해도 좀 더 공부하면 서서히 알게 될 것이니 걱정하지 않아도 된다.

Init


인스턴스 변수들을 초기화하기 위해 Init 메소드를 정의한다.


- (id) init
{
    if ( self = [super init] )
    {
        [self setCaption:@"Default Caption"];
        [self setPhotographer:@"Default Photographer"];
    }
    return self;
}


여기서 if 문의 조건은 == 이 아니라 = 이다.
즉, 같다면 이라는 비교문이 아니라 [super init]의 결과를 self 에 대입하고 있다는 뜻이다.
이 예제 메소드에서는 슈퍼클래스에게 초기화를 대신 요청하고 그 결과에 문제가 없으면 다른 변수들에 기본값을 세팅하고 있다.

Dealloc


dealloc 메소드는 오브젝트가 메모리에서 삭제될때 불려진다.
고로 이 메소드 안에서 자신이 가지고 있는 인스턴스 변수들의 참조를 release 해 주면 된다.


- (void) dealloc
{
    [caption release];
    [photographer release];
    [super dealloc];
}


클래스의 멤버 변수 였던 caption과 photographer는 그냥 스탠다드 release를 이용하여 release 한다.
이게 더 빠른 방법이므로 여기서 autorelase를 이용할 필요는 없다.


마지막 줄의 [super dealloc]은 슈퍼클래스에게 메모리 release를 요청하는 것인데,

만약 이것을 까먹는다면 memory leak 문제가 발생할 수 있을 것이다.


dealloc메소드는 garbage collection이 이용되고 있는 환경에서는 불려지지 않으며 대신 finalize 메소드를 정의한다.

7.메모리 관리법 좀더 살펴보기 +-----+-----+-----+-----+-----+


Objective-C에서는 참조카운터라는 메모리 관리 수법을 사용한다.


오브젝트를 생성(alloc) 하거나 보유(retain - 메소드 파라매터로 넘어올때) 할때 참조 카운터는 1씩 증가한다.
생성한 오브젝트를 retain 하면 카운터는 2가 되어있을 것이며 우리는 각각의 alloc 과 retain에 대해 release를 해줘야 한다.


하지만 실제로 우리가 오브젝트를 생성하는 경우는 아래 2가지 상황 뿐이다.


1.클래스의 인스턴스 변수로 사용할때
2.함수안에서 임시로 사용할 때


1번의 인스턴스 변수는 주로 autorelease와 dealloc에서 release 해주게 된다.


그럼 우리가 해결해야 할 것은 2번의 로컬변수들인데, 이것도 결국은 같은 이치로 alloc 이나 copy로 생성된 오브젝트를 사용후
함수안에서 autorelease나 release해주면 되는 것 뿐이다.


<1의 예제>
- (void) setTotalAmount: (NSNumber*)input
{
    [totalAmount autorelease];
    totalAmount = [input retain];
}


- (void) dealloc
{
    [totalAmount release];
    [super dealloc];
}


<2의 예제>
NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];
NSNumber* value2 = [NSNumber numberWithFloat:14.78];


// value2 는 alloc으로 생성하지 않았기 때문에 release 할 필요가 없다.
[value1 release];


이부분이 이해 된다면 Objective-C 의 메모리 관리의 90%를 파악했다고 할 수 있다.\

※ retain (오브젝트의 보유) 에 관하여

수신한 오브젝트를 파기하고 싶지 않은 경우도 있다. 예를 들어 인스턴스변수에 오브젝트를 캐쉬할 필요가 있을지도 모른다.
이런 경우, 오브젝트가 필요한지 어떤지 알수 있는건 본인 뿐임으로 사용중인 오브젝트를 파기당하지 않도록 보증하는 수단이 필요해진다. 이럴때 바로 retain 메소드를 사용한다. 이 메소드는 보류중인 autorelease 효과를 정지시켜 그 오브젝트가 필요없어 질때까지 relase되지 않도록 보장해준다.

8.로깅 +-----+-----+-----+-----+-----+


Objective-C의 로깅은 매우 심플하다. NSLog 함수가 거의 printf() 와 유사하기 때문이다.
단, %@ 라는 오브젝트를 표현하는 포멧이 추가되어 있다.


NSLog ( @"The current date and time is: %@", [NSDate date] );


NSLog를 이용하여 오브젝트를 콘솔에 찍으면 사실 오브젝트의 description메소드가 불려짐으로,
이를 오버라이드하여 원하는 결과를 찍어볼 수 있다.

9.프로퍼티 +-----+-----+-----+-----+-----+


Objective-C의 특징에 설명되어 있음으로 예제만 나열하도록 한다.


위에서 봐 온 getter와 setter가 적혀있는 예제를 property를 이용하여 아래와 같이 간략해진다.

<Photo.h>
#import <Cocoa/Cocoa.h>

@interface Photo : NSObject {
    NSString* caption;
    NSString* photographer;
}
@property (retain) NSString* caption;
@property (retain) NSString* photographer;

@end


<Photo.m>
#import "Photo.h"

@implementation Photo

@synthesize caption;
@synthesize photographer;

- (void) dealloc
{
    [caption release];
    [photographer release];
    [super dealloc];
}

@end


@synthesize는 소스내에 정의되어 있지 않은 getter/setter만 자동생성 해주기 때문에 안심하고 사용할 수 있다.

10.Nil 오브젝트의 메소드 호출 +-----+-----+-----+-----+-----+


Objective-C의 nil 오브젝트는 다른 프로그래밍 언어에서 말하는 NULL 오브젝트와 동일한 개념이다.
한가지 다른점은 nil인 오브젝트의 메소드를 호출하여도 에러가 나지 않는다는 점이다.


이것은 여러가지 방법으로 활용되지만 가장 편리한 점은 널 체크를 하지 않고 메소드를 호출할 수 있다는 점이다.


또한 dealloc의 성능을 높이기 위해서 사용할 수도 있다.
- (void) dealloc
{
    self.caption = nil;
    self.photographer = nil;
    [super dealloc];
}


여기서 nil을 인스턴스 변수의 값으로 넘기면 setter는 nil을 retain하고 기존 오브젝트를 release 한다.
이 방법은 dealloc에서 매우 효율적인데, 왜냐하면 nil을 세팅하므로써 변수가 다른 오브젝트를 참조할 가능성이 없어지기 때문이다.


self.를 붙여 setter를 호출해야하지 caption = nil; 이라고 하면 잘못된 방법이므로 memory leak를 초래한다.

11.카테고리 +-----+-----+-----+-----+-----+

카테고리는 Objective-C의 유용한 특징중에 하나이다.
요점부터 말하자면 카테고리는 기존의 클래스의 서브클래스를 생성하지 않고도 메소드를 추가할 수 있다.
(확장하고자 하는 클래스의 내부구조를 파악할 필요가 없다.)


이는 매우 유용한데, 왜냐하면 예를 들어 NSString에 그냥 카테고리를 추가만 하면 그 프로젝트 안에서 카테고리로서 추가된 메소드를 사용 할 수 있기 때문이다. 즉, NSString을 계승하여 새 클래스를 만들어 그것을 alloc하여 쓴다.. 하는 복잡한 과정이 필요없다는 뜻이자.


예제를 살펴보자.

<헤더>
#import <Cocoa/Cocoa.h>

@interface NSString (Utilities)
- (BOOL) isURL;
@end

<클래스>
#import "NSString-Utilities.h"

@implementation NSString (Utilities)

- (BOOL) isURL
{
    if ( [self hasPrefix:@"http://"] )
        return YES;
    else
        return NO;
}

@end


일반 클래스와의 차이는 단지 슈퍼클래스의 정의가 없고 클래스 명 뒤의 괄호안에 카테고리 명을 써 준 다는 점 뿐이다.


위에서 추가한 메소드를 사용해 보는 예제를 살펴보자
";
NSString* string2 = @"Pixar";

if ( [string1 isURL] )
    NSLog (@"string1 is a URL");

if ( [string2 isURL] )
    NSLog (@"string2 is a URL");  


카테고리는 서브클래스 확장과는 달리 인스턴스 변수는 추가 할 수 없다.
하지만 기존의 메소드를 오버라이드 하는것은 가능한데 이는 매우 신중히 해야할 작업중 하나이다.


기억해둬야 할 중요한 사항은, 클래스 카테고리를 사용한 변경은 어플리케이션의 모든 클래스 인스턴스에 영향을 준다는 사실이다.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075417177

'오브젝트C' 카테고리의 다른 글

The Objective-C 2.0 Programming Language  (0) 2010.06.24
Objective-C  (0) 2010.06.22
Objective-C의 기본 문법  (0) 2010.06.22
Objective-C의 특징  (0) 2010.06.22
[Objective-C]Interface Builder 기본 사용  (0) 2010.06.22
[Objective-C]번들  (0) 2010.06.22
Posted by 오늘마감

댓글을 달아 주세요

오브젝트C2010. 6. 22. 17:53
Objective-C의 특징
오늘은 맥을 쓸 여건이 안되어서 잠시 실습을 쉬고 Getting Started 시리즈중 젤 짧은 걸 하나 읽어보기로 했다.
(아.. WOL 설치해야지.. ㅠㅠ)
Objective-C는 표준 ANSI C를 확장한 객채지향 언어이다.
* 문법에 대해서는 별도 문서 참조. 
확장자
 .h  헤더파일
 .m  소스파일(C, Objective-C를 기술 가능)
 .mm  소스파일(Objective-C에서 c++클래스를 호출하고자 하는경우에만 사용할것)
* 헤더 파일을 소스에 임포트 할때는 #include대신 #import를 사용할 것.
클래스 선언
클래스의 interface 는 .h에 정의하고 implementation은 .m에 정의 한다.
인터페이스 정의는 @interface로 시작하며 @end로 끝난다.
Strong typing과 Weak typing

MyClass *myObject1;  //Strong typing앞에는 *를 붙여준다
id       myObject2; 
Strong typing 만 사용해온 개발자들은 id와 같은 불확실한 타입을 사용함으로써 많은 문제점이 생길꺼라 생각하지만 
사실 이는 Objective-c 프로그래밍을 유연하게 만들어주는 장점중 하나이다.
메소드 정의 방법
 (-) 기호로 시작되는 메소드 타입 식별자는 인스턴트 메소드 임을 의미한다. (+)로 적으면 클래스 메소드.
 메소드명 뒤의 (:)콜론은 이 메소드가 파라매터를 가진다는 것을 의미한다.
 파라매터가 없는 경우 (:)콜론 이후는 생략 가능하다. (아하, API문서 읽기가 어렵더라니... 이런 뜻이었구나)
<호출 하는 예>
[myArray insertObject:anObject atIndex:0];
또한, Objective-C에서는 쓸모없는 임시 변수를 선언하지 않아도 되게끔 메소드의 리턴값을 파라메터로 직접 넘길 수 있다.
괄호 안에 괄호([ [] ])를 넣는 방법.
<예>
[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];
.(도트) 문법도 제공하는데, accessor methods(단순히 클래스 멤버에 억세스 하기 위해 만들어진 메소드, getter or setter)를 호출할때 사용된다.
위의 예제를 .(도트) 문법으로 표현해 보면 아래와 같아진다.
[myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0];
물론 .(도트) 문법은 myAppObject.theArray = aNewArray; 와 같이 사용할 수도 있다.
클래스 implementation 
<예>
@implementation MyClass
- (id)initWithString:(NSString *)aName
{
    if (self = [super init]) {
        name = [aName copy];
    }
    return self;
}
+ (MyClass *)createMyClassWithString: (NSString *)aName
{
    return [[[self alloc] initWithString:aName] autorelease];
}
@end
프로퍼티 선언
프로퍼티란 accessor methods(클래스 멤버에 접근하기 위한 메소드)를 편하게 implementation 하는 방법이다.
인터페이스안에 메소드와 같이 정의 하면 된다.
<예>
@property BOOL flag;
@property (copy) NSString *nameObject;  // Copy the object during assignment.
@property (readonly) UIView *rootView;  // Declare only a getter method.
위와 같이 선언하면 같은 이름으로 데이터를 꺼내올수 있고, 앞에 set을 붙인 이름으로 데이터를 세팅 가능하다.
set을 붙일때는 프로퍼티명의 첫글자는 대문자가 된다. 예: nameObject 는 setNameObject로 접근.
그리고 나서 클래스 implementation 에서 아래와 같은 선언을 하면 컴파일러에 의해 메소드가 자동 생성된다.
<예>
@synthesize flag;
@synthesize nameObject;
@synthesize rootView;
또는 붙여 쓸수도 있다.
<예>
@synthesize flag, nameObject, rootView;
결국 이런 기능을 이용함으로써 개발자는 accessor methods를 위한 불필요한 코딩을 줄일 수 있다.

String
위에서 언급한 바와 같이 Objective-C는 c의 확장임으로 c의 String을 그대로 사용할 수 있다.
하지만 대부분의 Objective-C 프레임워크에서는 c-style String대신 NSString이라는 독자적인 클래스를 사용한다.
이는 가변길이 문자의 사용, 유니코드 대응, printf와 같은 포멧기능 등의 많은 이점이 있으며 자주 사용하는 클래스이기 때문에
단지 "(더블 쿼테이션) 앞에 @만 붙여줌으로써 생성이 가능하다.
<예>
NSString *myString = @"My String\n";
NSString *anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];
// Create an Objective-C string from a C string
NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

Protocols와 Delegates
프로토콜은 다른 클래스에 의해 implement되는 인터페이스로써 그 자체는 클래스가 아니다. 
프로토콜은 필수 또는 옵션 메소드를 선언 할 수 있으며,
아래와 같이 클래스의 인터페이스 선언과 매우 비슷하나 다만 슈퍼클래스를 가지지 않는다.
<예>
@protocol MyProtocol
    - (void)requiredMethod;
@optional
    - (void)anOptionalMethod;
    - (void)anotherOptionalMethod;
@required
    - (void)anotherRequiredMethod;
@end
프로토콜을 사용한다는 것은 그가 가지는 인터페이스를 준수하겠다는 선언이며, 
주로 클래스간의 데이터 전달을 목적으로 하는 클래스에 사용된다.
프로토콜에 대한 자세한 내용은 별도 문서로 있으며, 후에 읽어볼 필요가 있을것이다. (Protocols 문서)

이상이 Objective-C에 대한 간단한 소개였으며 앞으로 읽어볼 문서들중에 쉽게 접하게 될 특징들이다. 
물론 이것이 전부는 아니며 자세한 내용은 The Objective-C Programming Language에 나와있다.


출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075365123

'오브젝트C' 카테고리의 다른 글

Objective-C  (0) 2010.06.22
Objective-C의 기본 문법  (0) 2010.06.22
Objective-C의 특징  (0) 2010.06.22
[Objective-C]Interface Builder 기본 사용  (0) 2010.06.22
[Objective-C]번들  (0) 2010.06.22
[Objective-C]메세지 포워딩  (0) 2010.06.22
Posted by 오늘마감

댓글을 달아 주세요