본문 바로가기
2012.08.22 21:19

클래스와 객체 - 1

조회 수 3600 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

http://www.jinhokim.com/90


> 메소드 호출


Objective C에서 실질적으로 추가된 유일한 문법이라고 할 수 있는 메소드 호출이다. 

[object doSomething]; <------ [객체 메소드이름]
[object doSomethingWidth:input]; <------- [객체 메소드이름:매개변수]

이 문장은 객체가 어떤 일을 수행하라는 doSomething 메시지
아래는 매개변수 input을 가지고 어떤 일을 수행하라는 메시지

메소드에서 반환값을 받고 싶은 경우에는 다음과 같은 형식이다.

output = [object doSomething];
output = [object doSomethingWith:input];

앞으로 가장 많이 사용할 클래스 중 하나인 NSString이다.
새로운 NSString 객체를 반환하는 String메소드의 호출 예이다.

id newStringObject = [NSString string]; <----------- 클래스 NSString의 클래스메소드 string 호출하여 id 형 반환

Objective C는 매우 자유로운 언어이다. 타입에 대해서 그렇게 딱딱하지 않다. 특히 메시지를 보낼 때 많이 이용하게 된다. id는 모든 객체를 나타낸다
즉, 객체가 어떤 클래스인지를 모르는 상태에서도 메시지를 보낼 수 있다. 
또 그 객체가 해당 메시지를 처리할 수 있는지 없는지는 실행 시 판단한다. 컴파일 시에는 알 수 없다는 이야기다. 덕분에 마치 스크립트 언어와 같은 자유도를 가지고 개발할 수 있다. 

NSString *newStringObject = [NSString string];

이것이 평소 주로 사용할 스타일이란다..;
앞의 id 로 받는것은 자유도를 주긴 하지만 그런 자유도가 필요 없는 경우에는 다른 실수를 양산할 수 있다.
앞의 id에는 *가 없는것도 재미있는 점이다. 
id는 원래 포인터 타입으로 지정되어 있어서  *가 필요하지 않다. 객체를 반환하는 것이라고 이해하도록..
메시지 중복으로 보내고 싶은 경우도 간단하다. 
다른 언어에서 functionOne ( functionTwo() ); 라고 쓰는 코드를 ObjectiveC 에서는 다음과 같이 구현한다.

[objectA doSomethingWith:[objectB doSomethingBefore]];

<------ 객체A의 메소드호출시 매개변수로 객체B의 메소드호출 반환값을 사용

엄청 읽기가 힘든 코드를 만들어 낸다. 가능하면 둘 이상의 메시지를 중첩해 사용하지 않는 편이 더 좋다.

[myObject doSomethingwith: thisObject andThenWith : thatObject ];

내 객체가 이것과 저것을 가지고 어떤 일을 하라는 메시지이다. 간단하지만 조금 메시지가 중첩되기 시작하면 참 읽기 힘들어진다. 

> 접근자


모든 인스턴스 변수들은 Objective C에서는 private 이다
. 그래서 값을 가져오거나 설정하려면 접근자를 사용해야 한다. 예전의 방식과 지금 추가된 방식 이렇게 두가지가 있다. Objective C 2.0 에서는 기존 방식 이외에 다른 언어에서 익숙한 . 을 통한 접근이 추가되었다.

[myObject setTitle:@"오브젝티브C"]; <------------- set
NSString *title = [myObject title]; <------------ get

위 코드는 기존 Objective C에서 사용하던 형식이다. Objective C 2.0 에서 추가한 형식은 다음과 같다. 다른 언어에서 흔히 보던 방식이다.

myObject.title = @"오브젝티브C"; <-------------- set
NSString *title = myObject.title; <--------- get. 객체 myObject의 메소드 title 호출하여 반환형은 NSString

어떤 형식이든 상관없지만, 하나의 프로젝트에서 섞어 사용하게 되면 코드를 읽는 데 상당히 문제가 많다. 하나를 정해서 사용하는 편이 좋다. 

> 객체 생성


객체를 생성하는 방법은 크게 두가지 이다.

NSString *newString = [NSString string]; <------------- string 함수. factory 함수
NSString *anotherNewString = {[NSString alloc] init }; <----------- 수동 메모리 할당

바로 사용할 때는 newString 과 anotherNewString 에는 큰 차이가 없지만 메모리 관리에서는 큰 차이가 있다.

앞 에 newString 을 생성한 것은 string 함수이다. 이런 함수를 Factory함수 라고 한다. 이런 Factory함수의 특징은 객체를 생성할 때 오토릴리즈(AutoRelease) 로 생성한다는 것이다. 이렇게 오토릴리즈로 넘어오는 객체의 경우 그 객체의 메모리 관리 책임은 개발자에게 없다. 사용이 끝나면 사라지는 것이다. (마치 가비지컬렉션 처럼..) 강제로 변환하였다가는 나중에 임시 메모리 풀이 비워질 때 에러를 만들게 된다. 코드 상에서는 당장 에러로 보이지 않기 때문에 난감한 경우가 많다.

뒤에 anotherNewString의 경우는 다르다. 이렇게 수동으로 메모리를 할당한 경우에는 개발자에게 관리의 책임이 있다. 이런 경우에는 사용이 끝나면 꼭 직접 메모리에서 제거 해야한다.

> 클래스 인터페이스 정의


클 래스는 보통 두개의 파일로 나뉜다. 하나는 클래스의 인터페이스 정의, 공개 메소드, 인스턴스 변수를 담고 있는  SomeClass.h 파일이고, 다른 하나는 실제적인 구현과 private 메소드를 담고 있는 SomeClass.m 파일이다. 그러면 우선 클래스 인터페이스 정의부터 보자.

#import 

@interface Clip : NSObject
{
    int playCount;
    NSString *vid;
    NSString *title;
    NSString *originalURL;
}
+ clip;
-(BOOL) isNewClip;
@end

비디오클립 헤더 파일 Clip.h 이다. 
우선 #import 를 통해서 필요한 파일들을 불러온다. 한 파일을 여러 번 부르도록 시도하더라도 자동으로 한 번만 불러온다.
@interface 는 NSObject 의 하위클래스인 Clip 클래스의 정의를 시작함을 컴파일러에 알린다. () 내에서는 인스턴스 변수들을 정의한다. 
그 아래는 메소드 정의이다. 
+ 는 해당 메소드가 클래스 메소드임을 뜻한다. clip 은 아마도 NSString의 string과 같이 팩토리 함수로 구현하겠다. -는 인스턴스 메소드를 뜻한다. isNewClip은 해당 클립 인스턴스가 사용자가 보지 않은 클립인지를 BOOL 값으로 반환하는 메소드가 되겠다. 
@end 는 클래스의 정의가 끝났음을 알린다.

> 클래스 구현


클래스 구현 Clip.m 파일을 보자.

@implementation Clip

- (BOOL) isNewClip
{
     return YES;
}
@end

@implementation 키워드는 @interface 키워드의 다른 한 쪽이다. 
이제  @end 전에 클래스의 실제 하는 일들을 구현면 된다. 그리고 앞의 @interface에 구현하지 않은 메소드를 추가할 수도 있다. 그러면 그 메소드는 private이 되며 해당 클래스에서만 사용할 수 있다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
21 Cocoa Programming 정리 08 - NSArrayController file Hojung 2013.02.25 5377
20 Cocoa Programming 정리 07 - Key-Value Coding 과 Key-Value Observing file Hojung 2013.02.20 4498
19 Cocoa Programming 정리 06 - 헬퍼 객체 file Hojung 2013.02.19 6850
18 Cocoa Programming 정리 05 - 타겟(Target)과 액션(Action) file Hojung 2013.02.14 5805
17 Cocoa Programming 정리 04 - 메모리 관리 file Hojung 2013.02.13 5671
16 Cocoa Programming 정리 03 - Objective-C file Hojung 2013.02.08 5451
15 Cocoa Programming 정리 02 - 시작하기 file Hojung 2013.02.05 8056
14 Cocoa Programming 정리 01 - Cocoa란? Hojung 2013.02.05 4306
13 객체 변수 선언시 @private 사용 Hojung 2012.09.18 3739
12 테스트 코드 작성 Hojung 2012.08.22 3480
11 NSString 객체의 생성과 변환 Hojung 2012.08.22 4505
10 클래스 프로퍼티 설정 Hojung 2012.08.22 3522
» 클래스와 객체 - 1 Hojung 2012.08.22 3600
8 Interface and Implementation Hojung 2012.08.22 3343
7 Extends vs Implements의 개념과 차이점 - 2 Hojung 2012.08.22 3697
6 Extends vs Implements의 개념과 차이점 - 1 Hojung 2012.08.22 4289
5 포인터 Hojung 2012.08.22 3624
4 조건문 및 순환문 Hojung 2012.08.22 3760
3 변수형 및 객체형 Hojung 2012.08.22 3731
2 hello world Hojung 2012.08.22 3543
Board Pagination ‹ Prev 1 2 Next ›
/ 2

Designed by sketchbooks.co.kr / sketchbook5 board skin

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5