c++에서 objective-c까지

117
C++에서 Objective-C까지 창원대학교 박동규 ( @dongupak ) 20111222iPhone 개발자 포럼발표자료 http://cafe.naver.com/appforge/60

Upload: donggyu-park

Post on 18-Jan-2015

1.205 views

Category:

Technology


1 download

DESCRIPTION

2011년 1월 창원대학교에서 개최된 아이폰 개발자 포럼 자료입니다.Objective-C의 문법과 iOS 앱 개발에 대하여 다루고 있습니다.

TRANSCRIPT

Page 1: C++에서 Objective-C까지

C++에서 Objective-C까지

창원대학교 박동규 ( @dongupak )2011년 1월 22일

제2회 iPhone 개발자 포럼발표자료http://cafe.naver.com/appforge/60

Page 2: C++에서 Objective-C까지

발표자 소개

창원대학교 정보통신공학과 교수 박동규(YES, I’m a developer!!)

Page 3: C++에서 Objective-C까지

발표자 소개

• 창원대학교 정보통신공학과 교수

• ivis lab, mobile-x 지도교수

• 2002년 BREW 플랫폼에서의 콘텐츠 개발

• 2004년 이후 WIPI 플랫폼, Windows Mobile 플랫폼에서의 콘텐츠 개발

• 2009년 이후 아이폰위주의 어플 개발

Page 5: C++에서 Objective-C까지

위치기반, 관광

창원 유적과 투어, 창원 축제, 부산 축제

Page 6: C++에서 Objective-C까지

게임 앱

Coke Shake Peekaboo

Speed Up

Page 7: C++에서 Objective-C까지

게임앱- cocos2d 기반

Pocket FireSpider-X Bubble Buster

Page 8: C++에서 Objective-C까지

Blog

Page 9: C++에서 Objective-C까지

WJApp Blog

Page 10: C++에서 Objective-C까지

iOS 관련 교육경력• 대학원 - Objective-C, iPhone Programming

• 학부 - 3개 과정 교육

• 특강• KAIST, 부산대학교 아이폰 앱 개발 특강

• 동명대학교 게임공학과 아이폰 앱 개발

• 경남로봇진흥원 아이폰 개발자과정

• ETRI 전문가 초청세미나, ...

Page 11: C++에서 Objective-C까지

교육

• 창원대학교 정보통신공학과 교과목 운영

• 모든 수강생은 팀으로 앱을 개발하고 앱스토어에 올릴것, 사용자 평가와 판매는 학점과 관계가 있음

• 2명의 앱 전문 디자이너와 공동작업

Page 12: C++에서 Objective-C까지

기말 발표

Page 13: C++에서 Objective-C까지

아이폰 앱 개발 개요

Page 14: C++에서 Objective-C까지

아이폰 개발자되기• 어떤 관문을 지나야 할까?

• 맥 OS X - 윈도우와의 철학 차이를 이해 해야한다.

• 개발도구의 이해 - X Code라는 개발도구의 기능과 특성을 이해해야 한다

• IB, Performance Tool, iOS Simulator의 이해

Page 15: C++에서 Objective-C까지

아이폰 개발자되기• 관문• 개발언어 : Objective C라는 다소 생소한 프로그래밍 언어를 개발언어로 사용한다

• API의 이해 : Cocoa Touch API가 가지는 객체 지향성의 이해가 필요함

• 애플 앱스토어라는 마지막 관문이 존재함

Page 16: C++에서 Objective-C까지

지나치기 쉬운점

• 아이폰 앱 개발 교육 현황

• 지나치게 API 위주로 교육한다

• 기능을 익히는데 주력한다

• 애플의 운영체제와 개발언어를 대하는 철학을 이해하는 것이 먼저이다.

Page 17: C++에서 Objective-C까지

왜 Objective C인가?

• C는 하드웨어를 직접제어하기 원하는 시스템 SW 개발자등을 위한 최선의 선택이 된다

• C++는 객체지향 언어임에도 불구하고 C에 구속적인 특성이 많다.

• C++는 비객체지향적 특성이 너무 많다

Page 18: C++에서 Objective-C까지

C++

Bjarne Stroustrup

http://imakeit.ibbun.com/blog/58 C++개발자와의 인터뷰를 한번 보시길.. ^.^

Page 19: C++에서 Objective-C까지

Window Phone 7

• MS의 차기 모바일 OS로 사용

• Silverlight, XNA에 기반함

• C++을 사용하지 못함

• C# 만을 사용하여 개발함

Page 20: C++에서 Objective-C까지

Android

• 개발언어로 Java를 사용함

• 이제 모바일 플랫폼에서 C++의 입지는 점차 약해지고 있다

• 성능보다는 앱개발을 편리하게 하기 위한 선택

Page 21: C++에서 Objective-C까지

C++ vs Objective-C

• C++은 매우 불완전한 객체지향언어이다

• 특히 배우기가 너무 어렵다.

• friend function, 다중상속, 순수가상함수의 문법적인 불완전성

Page 22: C++에서 Objective-C까지

Good Reference

Page 23: C++에서 Objective-C까지

번역자료

http://ivis.cwnu.ac.kr/tc/dongupak 에 최신버전(2.2) 탑재

Page 24: C++에서 Objective-C까지

역사

출처 : http://chachatelier.fr/programmation/fichiers/cpp-objc-en.pdf

Page 25: C++에서 Objective-C까지

Objective-C

• Smalltalk에 영향을 많이 받은 객체지향언어(객체지향성이 강하다)

• C 언어의 superset이다

• 모든 객체는 동적이다

• 프로그램 실행중에 메모리를 할당받고(alloc) 해지(release)된다.

• 메모리관리를 사용자가 해야한다

Page 26: C++에서 Objective-C까지

또 다른 특징

• C++보다 문법적으로 단순하다

• 다중상속을 허용하지 않는다

• 모든 메소드는 public이다

• 클래스도 객체이다.(C++에서는 객체를 생성하는 설계도가 클래스님)

• 추가된 키워드는 @로 시작한다

Page 27: C++에서 Objective-C까지

2.0에서 추가된 기능• 가비지 콜렉터를 지원

• 모바일 프레임워크인 Cocoa Touch에서는 지원하지 않음

• @property 지원

• 멤버 변수의 접근자를 자동으로 생성

• Fast enumeration 기능으로 집합적인 객체내부의 원소를 하나하나 접근

Page 28: C++에서 Objective-C까지

함수 vs 메소드• 함수• C의 함수는 Objective-C에서도 지원한다

• 메소드• 객체가 보내는 신호

• +,- 접두어로 정적메소드, 동적메소드 를구분한다

Page 29: C++에서 Objective-C까지

함수 vs 메소드• C++에서는 두개의 문법적 차이점이 크지 않다

• Objective-C에서 함수와 메소드는 매우 큰 차이가 있다

• 함수 : 호출문에 의해서 호출되어 작업을 수행하는 수행단위

• 메소드 : 클래스데이터 타입에 의존적인 함수, 멤버함수라고도 하는데, 반드시 객체나 클래스가 호출한다

Page 31: C++에서 Objective-C까지

속성과 메소드

속성메소드

scope 연산 구현부에서 메소드를 만든다

Page 32: C++에서 Objective-C까지

@class와 @interface

• 클래스 선언은 Objective-C에서는 @interface라는 키워드로 한다.

• @class는 전치선언을 위한 키워드로 사용된다.

• 전치선언(forward declaration)이란 다음에 나타날 클래스가 어딘가에 정의되어 있음을 표시하는 기능이다

Page 33: C++에서 Objective-C까지

전치 선언은 큰 차이가 없다

Page 34: C++에서 Objective-C까지

문법

Page 35: C++에서 Objective-C까지

예제

• Stanford 강좌 CS 193p(2010년 가을)

Page 36: C++에서 Objective-C까지

View

계산기 MVC

Controller

Model

operationPressed:

Target

display

계산기의 핵심

계산기View콘트롤러

x

-2+4

7 3.21

UILabel

UIButtons

digitPressed:

Page 37: C++에서 Objective-C까지

CalculatorBrain.h

Model클래스의 헤더파일.공개API 문서

Page 38: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

@end

이 클래스의 이름

Page 39: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

@end

이 클래스의 슈퍼클래스

Page 40: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

@end

슈퍼 클래스가 있는 곳의 헤더를 가져와야 한다.

Page 41: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{

}

@end

인스턴스 변수는 여기에 입력메소드는 { } 안에 넣지 않는다

Page 42: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

@end

Page 43: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

@end

메소드선언은

여기에 입력

Page 44: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand;- (double)performOperation:(NSString *)operation;

@end

메소드의 앞에 있는 +는 클래스 메소드를 -는 인스턴스 메소드를 의미한다

Page 45: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand;- (double)performOperation:(NSString *)operation;

@end

반환 타입이 void로 지정되었으므로이 메소드는 아무 값도 반환하지 않는다

Page 46: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand;- (double)performOperation:(NSString *)operation;

@end

이 메소드의 이름은 “setOperand:”.

Page 47: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

@end

이것은 매개변수이다. double형의 “anOperand”

Page 48: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

@end

세미콜론을 잊지 말것!

Page 49: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

@end

이 스레드는 더블을 반환한다.

Page 50: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

@end이것은 매개변수로 NSString 객체에 대한 포인터를 전달한다.

그렇다, 우리는 매소드에 개체를 통과시킨다.

Page 51: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

- (NSArray *) foo : (int) zap bar : (id) pow;

@end

Page 52: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

- (NSArray *) foo : (int) zap bar : (id) pow;

@end이 메소드는 두 개의 매개변수를 사용하려한다.

“foo:bar”(발음 “푸 콜론 바 콜론”)가 메소드 이름이다 bar는 매개변수 (id)pow의 태그(또는 레이블)이다.

Page 53: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

- (NSArray *) foo : (int) zap bar : (id) pow;

@end이 메소드는 NSArray에 대한 포인터를 반환한다

(Foundation에 있는 컬렉션 클래스)

Page 54: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

- (NSArray *) foo : (int) zap bar : (id) pow;

@end두번째 인수는 “id” 이다.

이것은 “모든 종류의 객체에 대한 포인터라는” 뜻 이다

Page 55: C++에서 Objective-C까지

CalculatorBrain.h

Model

#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject

{ double operand;

}

- (void)setOperand:(double)anOperand ;- (double)performOperation:(NSString *)operation;

@end

Page 56: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

@end

이것은 구현 파일이다.public이나 private 구현부가 이파일에 오게 된다

Page 57: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

@end

자기 자신의 헤더 파일을 가져와야 한다.

Page 58: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

@end

구현부에서는 슈퍼 클래스를 지정하지 않는다는 점에 유의하자.

Page 59: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

-(void) setOperand: (double) anOperand

{

<구현 코드는 여기에 오게 된다>

}

@end

이번에는 세미콜론이 없다.

Page 60: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

-(void) setOperand: (double) anOperand

{ operand = anOperand;}

-(double) performOperation : (NSString *) operation{ [operation sendMessage : argument]; return aDouble;}

@end

Page 61: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

-(void) setOperand: (double) anOperand

{ operand = anOperand;}

-(double) performOperation : (NSString *) operation{ [operation sendMessage : argument]; return aDouble;}

@end 대 괄호는 “메시지를 보낸다”라는 의미이다

Page 62: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

-(void) setOperand: (double) anOperand

{ operand = anOperand;}

-(double) performOperation : (NSString *) operation{ [operation sendMessage : argument]; return aDouble;}

@end이것은 메시지를 받는 개체이다.(이 경우, NSString 타입의 “operation”이라는 객체가 :performOperation 메소드의 매개변수로 전달되었다.)

Page 63: C++에서 Objective-C까지

CalculatorBrain.m

Model

#import “CalculatorBrain.h”

@implementation CalculatorBrain

-(void) setOperand: (double) anOperand

{ operand = anOperand;}

-(double) performOperation : (NSString *) operation{ [operation sendMessage : argument]; return aDouble;}

@end이것이 operation 객체에게 보내는 메시지이다.

Page 64: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

인스턴스 메소드 : -클래스 메소드 : +

Page 65: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

괄호안은 메소드가 반환하는 타입

Page 66: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

메소드 이름의 첫부분 메소드 이름의 두번째 부분

여기서 shipsAtPoint: withDamage: 가 메소드의 전체이름

- Objective-C는 메소드 이름이 두 부분, 세 부분,.. 이 될 수 있다.

- 두 번째 부분, 세 번째 부분을 각각 태그라고 하기도 한다

- 이상한가요?

Page 67: C++에서 Objective-C까지

메소드 이름을 잘 읽어야 함

67

Page 68: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

괄호 안에 첫번째 인자의 종류이 부분은 C의 구조체임.

괄호 안에 두번째 인자의 종류.이것 하나는 BOOL (부울 값)임.

Page 69: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

첫번째 파라미터 이름.메소드 구현부에서 지역 변수처럼 사용할

수 있다.

두번째 파라미터 이름

Page 70: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

* 라인이 인자가 많거나 (또는 인수 이름이 길거나) 할경우 라인을 바꾸면 :(콜론)으로 정렬됨

- (void)splitViewController:(UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController;

* 서술적인 메소드 이름으로 인해 메소드가 길어지지만 가독성이 높아지고 에러를 줄이는데 도움이 된다.

* 위의 메소드는 “분할 뷰 컨트롤러 svc가 aViewController를 숨기는데, 바 버튼으로 숨기며, 이때 팝오버 컨트롤러를 사용한다”고 이해할 수 있음.

정렬선으로 XCode 에디터가 자동정렬시킴

Page 71: C++에서 Objective-C까지

메소드 구문- (NSArray *)shipsAtPoint:(CGPoint)bombLocation withDamage:(BOOL)damaged;

IBAction은 사용하는 (void와 같음) 행동을 인터페이스 빌더에 알려주는 역할을 한다.- (IBAction)digitPressed:(UIButton *)sender;- (IBAction)digitPressed:(id)sender;- (IBAction)digitPressed:sender; // (id)sender 버전과 동일함.- (IBAction)digitPressed;

Page 72: C++에서 Objective-C까지

in UINibDeclarations.h

72

#ifndef IBOutlet#define IBOutlet#endif

#ifndef IBOutletCollection#define IBOutletCollection(ClassName)#endif

#ifndef IBAction#define IBAction void#endif

Page 73: C++에서 Objective-C까지

인스턴스 메소드• 대시(-)로 시작 보통사용하는 - (IBAction)digitPressed:(UIButton *)sender;• 보통의 객체가 사용하는 “일반적인” 메소드임.• 인스턴스 변수를 지역변수인것처럼 액세스 할 수 있다.• 내부의 super와 self에게 메시지를 보낼수 있다.

• 예시 BOOL destroyed = [ship dropBomb:bombType at:dropPoint from:height];

Page 74: C++에서 Objective-C까지

클래스 메소드• +로 시작. 메모리 할당, 단일체 객체, 유틸리티에 사용 + (id)alloc; // 리시버의 클래스의 개체에 대한 공간을 만든다. (항상 init과 쌍으로) + (id)motherShip; // 공유된 motherShip 인스턴스의 단일 객체만을 반환. + (int)turretsOnShipOfSize:(int)shipSize; // 정보유틸리티 메소드• 인스턴스 변수의 내부는 액세스 할 수 없음.• 호출 문법 (인스턴스 메소드와 약간 다름)

CalculatorBrain *brain = [[CalculatorBrain alloc] init];Ship *theMotherShip = [Ship motherShip];Ship *newShip = [Ship shipWithTurrentCount:5];int turretsOnMediumSizedShip = [Ship turretsOnShipOfSize:4];

Page 75: C++에서 Objective-C까지

리테인 카운터

• 모든 객체는 동적으로 할당된다

• 포인터를 이용하여 접근한다

• 자바와 C++, 그리고 Objective-C

Page 76: C++에서 Objective-C까지

자바• 객체의 메모리를 동적으로 만들어서 가비지 수집기가 소거시킨다

• Scanner scan = new Scanner(System.in);

• scan의 소거는 프로그래머의 몫이 아니다

• 가비지 수집비용

• 사용하지 않는 메모리의 소거를 프로그램에게 위임한다?? 고비용, 저효율.

Page 77: C++에서 Objective-C까지

가비지 수집기

Page 78: C++에서 Objective-C까지

C++

• new를 통해 메모리를 할당 받으면, delete 를 통해 메모리를 해지시켜야한다.

• 다른 곳에서 이를 참조하고 있을경우 이를 delete시키면?

• CRASH

• 이 메모리가 몇번 참조되고 있는지 알 수 없을까

• 알 수 없다???

Page 79: C++에서 Objective-C까지

Objective-C

• alloc을 통해 할당 받은 메모리는 release를 통해 해지시켜야한다.

• 메모리관리는 효율적이지만, 가비지 수집은 프로그래머의 몫이다

• 이 메모리가 몇번 참조되고 있는지 알 수 없을까

• 알 수 있다!!!

Page 80: C++에서 Objective-C까지

리테인 카운터

• 객체가 참조될 때마다 객체의 retain 메소드를 호출하여 이 값을 증가시킨다.

• 참조가 해지되면 release를 통해 retain 값을 감소시킨다.

Page 81: C++에서 Objective-C까지

• 어떻게 작동하는가?– 모든 객체가 준수해야할 매우 단순한 규칙들이 있다.

• 당신은 포인터를 유지하려는 객체에 대한 소유권을 갖는다.– 주어진 객체에 대한 다수의 소유자(공용)를 허용한다.

• 객체의 사용이 완료되면, 당신이 그 소유권을 포기해야한다• 아무도 객체에 대해 소유권을 주장안하면, 소거

(deallocate)된다.

리테인 카운터

Page 82: C++에서 Objective-C까지

객체 소유권• 언제 소유권을 가지는가?

–new, alloc, copy 메시지를 어떤 객체에 보내는 즉시 –이들의 가장 일반적인 조합은 alloc 다음에 init되는 조합–NSObject의 retain 메시지를 통해 리테인 카운터를 증가시킬것.

Page 83: C++에서 Objective-C까지

• 그럼 어떤식으로 "임시 소유권" 작업이 이루어지는가?당신은 "옵션"을 가진 상태에서 객체를 이전해 주고 싶다면, 그것의 소유권을 위한객체를 전송할적에 autorelease 메시지를 포함한 상태로 보내서 소유권을 해지시켜야한다. 여러분의 객체 소유권은 미래의 시간에 (그러나 현재 이벤트가 완료되기 이전에는 해지되지 않는한 해지되니 않음) "종료"된다.

• 예제- (Money *)showMeTheMoney:(double)amount {

Money *theMoney = [[Money alloc] init]; }

임시 소유권

우리는 지금 메서드 alloc을 사용하여theMoney를 사용하고 있다.우리는 이 객체를 release시킬 책임이 있다.

Page 84: C++에서 Objective-C까지

• 그럼 어떤식으로 "임시 소유권" 작업이 이루어지는가?당신은 "옵션"을 가진 상태에서 객체를 이전해 주고 싶다면, 그것의 소유권을 위한객체를 전송할적에 autorelease 메시지를 포함한 상태로 보내서 소유권을 해지시켜야한다. 여러분의 객체 소유권은 미래의 시간에 (그러나 현재 이벤트가 완료되기 이전에는 해지되지 않는한 해지되니 않음) "종료"된다.

• 예제- (Money *)showMeTheMoney:(double)amount {

Money *theMoney = [[Money alloc] init]; return theMoney; }

임시 소유권

안타깝게도, 우리는 이 객체를 이미 반환했기 때문에, 우리는 지역적으로 선언된 객체를 release시킬 수 없다!

Page 85: C++에서 Objective-C까지

• 그럼 어떤식으로 "임시 소유권" 작업이 이루어지는가?당신은 "옵션"을 가진 상태에서 객체를 이전해 주고 싶다면, 그것의 소유권을 위한객체를 전송할적에 autorelease 메시지를 포함한 상태로 보내서 소유권을 해지시켜야한다. 여러분의 객체 소유권은 미래의 시간에 (그러나 현재 이벤트가 완료되기 이전에는 해지되지 않는한 해지되니 않음) "종료"된다.

• 예제- (Money *)showMeTheMoney:(double)amount {

Money *theMoney = [[Money alloc] init]; [theMoney release]; return theMoney;

}

임시 소유권

이러면 안된다 : 지역적으로 선언된 객체를 만들자마자 release시키면 외부에서 쓸 수가 없다.

Page 86: C++에서 Objective-C까지

• 그럼 어떤식으로 "임시 소유권" 작업이 이루어지는가?당신은 "옵션"을 가진 상태에서 객체를 이전해 주고 싶다면, 그것의 소유권을 위한객체를 전송할적에 autorelease 메시지를 포함한 상태로 보내서 소유권을 해지시켜야한다. 여러분의 객체 소유권은 미래의 시간에 (그러나 현재 이벤트가 완료되기 이전에는 해지되지 않는한 해지되니 않음) "종료"된다.

• 예제- (Money *)showMeTheMoney:(double)amount {

Money *theMoney = [[Money alloc] init]; [theMoney autorelease]; return theMoney;

}

임시 소유권

해결 방법 : 이 메소드를 호출한 외부에서 theMoney가 retain되고 나면 release된다.

Page 87: C++에서 Objective-C까지

임시 소유권

• Autorelease Pool : 해지될 객체들이 임시로 보관되는 곳

• 지역적으로 이 풀을 만들어서 관리하면 효율적인 메모리 관리를 달성할 수 있다

Page 88: C++에서 Objective-C까지

세터와 게터

• 세터(Setter)

• 설정자, 치환자라고도 한다

• 클래스 속성값을 설정하는 메소드

• 게터(getter)

• 클래스 속성값을 가져오는 메소드

Page 89: C++에서 Objective-C까지

왜 필요한가

• 외부에서 하가된 방법으로 멤버의 값을 바꾸거나 읽어오기 위해 필요하다

• 멤버의 수가 증가하면 세터,게터의 수도 증가하게 된다

Page 90: C++에서 Objective-C까지

자바의 예

• set, get으로 시작하는 엄청난 메소드가 보이세요?

Page 91: C++에서 Objective-C까지

세터와 게터

• 자바의 예와 같이 엄청난 분량의 세터와 게터 함수를 개발자가 만드는 코딩을 대체할 수는 없을까?

• 있다.

• @property를 이용하여 자동으로 setter, getter를 만들자

Page 92: C++에서 Objective-C까지

프로퍼티• @property 키워드• set/get 메소드를 개발자가 만드는 것이 아니라,

@property 지시문을 통해 컴파일러가 자동 생성한다

@interface MyObject : NSObject{

@private int eye;

}// getter 메소드로 속성값과 이름이 같은 메소드를 사용할 수 있다- (int)eye; - (void)setEye:(int)anInt; // setter 메소드로 매개변수를 속성값으로 set@end

Page 93: C++에서 Objective-C까지

프로퍼티• @property 키워드• set/get 메소드를 개발자가 만드는 것이 아니라,

@property 지시문을 통해 컴파일러가 자동 생성한다

@interface MyObject : NSObject{

@private int eye;

}@property int eye; // 앞의 명령과 동일함@end

Page 94: C++에서 Objective-C까지

프로퍼티• @property int eye;는 다음과 같은 메소드를 생성한다• @synthesize eye; 명령에 의하여 실제로 setter/getter를 생성

@implementation MyObject

- (int)eye { return eye;

}

- (void)setEye:(int)anInt {eye = anInt;

} @end

Page 95: C++에서 Objective-C까지

프로퍼티• 컴파일러는 @synthesize 를 사용하여 setter/getter를 자동 구현함.헤더파일 (.h):@interface MyObject : NSObject{ @private int eye;}@property int eye;@end해당실행 파일(.m):@implementation MyObject@synthesize eye; // 아래의 코드를 자동생성하는 역할@end

Page 96: C++에서 Objective-C까지

프로퍼티• 컴파일러는 @synthesize 를 사용하여 setter/getter를 자동 구현함.헤더파일 (.h):@interface MyObject : NSObject{ @private int eye;}@property int eye;@end해당실행 파일(.m):@implementation MyObject@synthesize eye; // 아래의 코드를 자동생성하는 역할- (int)eye { return eye;}- (void)setEye:(int)anInt { eye = anInt;}@end

Page 97: C++에서 Objective-C까지

주의

호출시 무한 루프

Page 98: C++에서 Objective-C까지

실행

Page 99: C++에서 Objective-C까지

실행

무한 loop가 됩니다

Page 100: C++에서 Objective-C까지

@property• 반환자(getter) 메소드는 대개 인스턴스 변수를 직접 반환

• UILabel의 Text 속성을 생각해보자display.text = [display.text stringByAppendingString:digit];

이것은 계속해서 display (UILabel)에 의해 소유된다.우리는 그것을 계속 소유하지 않기 때문에 retain하지 않는다.우리는 단지 다른 NSString을 stringByAppendingString로 부터

얻기 위해서만 사용할 것이다.

Page 101: C++에서 Objective-C까지

@property• 예제(retain 옵션)

@property (retain) NSString *name;

@synthesize will create a setter equivalent to this ...

- (void)setName:(NSString *)aString{

[name release];name = [aString retain];

}@synthesize는 (만일 존재한다면 nil이 될 수 있는) 이전 객체를 새로운 객체에 retain 할당시키기 이전에 release시킨다는 점을 주목

Page 102: C++에서 Objective-C까지

돌아가는 방식obj.name = @”dongupak”; 명령문은[obj setName:@”dongupak”]; 명령을 호출하고 설정자가 호출된다

...

obj.name = @”new dongupak”;은기존의 객체를 해지하고[@”dongupak” release];새 객체를 retain시킨 후 name이 참조하도록 함name = [aString retain];

Page 103: C++에서 Objective-C까지

• 예제(copy 옵션)

@property (copy) NSString *name;

@synthesize will create a setter equivalent to this ...

- (void)setName:(NSString *)aString{

[name release];name = [aString copy];

}

@property

copy 이전에 release시킴

Page 104: C++에서 Objective-C까지

• 예제(assign 옵션)

@property (assign) NSString *name;

@synthesize will create a setter equivalent to this ...

- (void)setName:(NSString *)aString{

name = aString;}

@property

우리가 retain이나 copy를 하지 않았으므로 여기서는 release 되지 않음

Page 105: C++에서 Objective-C까지

메모리 검사

• XCode를 이용하여 Objective-C 프로그램을 짤적에는 메모리 누수검사가 매우 중요하다

• Performance Tool을 잘 활용해야하는 이유가 여기에 있다

Page 106: C++에서 Objective-C까지

Memory Leak

Page 107: C++에서 Objective-C까지

Memory Leak

메모리 누수를 검사하는 매우 강력한 도구

Page 108: C++에서 Objective-C까지

또 다른 방법

잠재적인 메모리 누수의 가능성을 알려줌

Page 109: C++에서 Objective-C까지

기타(id형)• id 형

• NSObject *와 같은며 NSObject로 부터 상속받은 객체를 참조할 수 있는 매우 유용한 타입

• id* 와 같이 사용하면 이중 참조가 된다. 주의가 필요함• NSObject에서 상속받은 모든 객체는 아래 메소드를 가지고 있다.

• isKindOfClass : 개체가 클래스의 한 종류인지 여부를 반환한다(상속 포함).

• isMemberOfClass : 개체가 클래스(상속이 아닌)의 멤버인지 여부를 반환한다.

• respondsToSelector : 객체가 특정 메소드에 응답하는지 여부를 반환한다

Page 110: C++에서 Objective-C까지

• 메소드 테스트 방법은 선택자(selector) SEL이다.특별한 @selector() 지시자는 메소드의 이름을 선택자에 넣는다.if ([obj respondsToSelector:@selector(shoot)]) { [obj shoot];}

• SEL은 선택자를 위한 특별한 Objective-C “타입”이다.SEL shootSelector = @selector(shoot);SEL moveToSelector = @selector(moveTo:);타겟/액션 사용의 예 : [button addTarget:self action:@selector(digitPressed:)]

• 당신이 SEL을 갖고 있다면, 당신은 객체에게 수행을 요청할 수 있다.NSObject에 있는 메소드 performSelector나 performSelector: withObject 사용[obj performSelector:shootSelector];[obj performSelector:moveToSelector withObject:coordinate];

SEL

Page 111: C++에서 Objective-C까지

• 아무것도 가리키지 않는 개체의 포인터의 값id obj = nil;NSString *hello = nil;

• 원시타입은 “제로”처럼 간주할 수 있다• NSObject는 제로로 모든 인스턴스 변수로 설정한다.

• 개체에 대한 포인터는 nil 인스턴스 변수로 설정• Nil에게 메시지를 보내는것도 가능하다.

• 메소드는 값을 반환하는 경우, 그것은 제로를 반환한다.

int i = [obj methodWhichReturnsAnInt]; // obj가 nil이면 제로가 될 것이다.

nil도 객체이다

Page 112: C++에서 Objective-C까지

프로토콜

• 다중상속이 허용되지 않는 상황에서 객체가 필요로하는 메소드를 사용하기 위한 방법

• < .. > 내부에 프로토콜 이름을 적는다

• Java의 interface와 매우 유사한 개념이다

Page 113: C++에서 Objective-C까지

정리• Objective-C는 객체지향성이 매우 강하다

• Objective-C는 기존의 개발자들이 많이 사용해온 C/C++/Java/C#과 매우 다른 특징이 많다

• 그러나 배우기 어려운 까다로운 언어는 분명히 아니다

• 새로운 철학을 먼저 이해해야만 한다.

Page 114: C++에서 Objective-C까지

정리• 기존의 개념으로 접근하기 보다는 마음을 비우고 객체라 하는 일을 어떨해 효율적으로하면 되는가를 생각하자.

• 까다로운 메모리 관리는 개발의 효율성을 위한 것이다.

• 메모리 관리의 중요성은 아무리 강조해도 지나치지 않다.

Page 115: C++에서 Objective-C까지

조언

• 개발자들을 위한 새로운 삶이 열리게되었다.

• 앱스토어, 맥 앱스토어, 윈도우 마켓플레이스, 안드로이드 마켓.. 그리고...

• 새로운 개념을 즐거운 마음으로 받아들이자

Page 116: C++에서 Objective-C까지

기타

• 트위터: @dongupak

• 블로그: http://ivis.cwnu.ac.kr/tc/dongupak

Page 117: C++에서 Objective-C까지

Q & A