Tag Archives: Objective C

나의 첫번째 iPhone 어플리케이션 개발하기

아이폰 개발이라는 카테고리를 떡하니 만들어 놓고 지금까지 계속 Object-C만을 글쓰고 있었네요.

하지만 역시 기본이 중요하긴 중요합니다. 지금까지 정도의 Object-C를 이해하고 계신다면 이제부터 진짜로 나오는 아이폰 개발은 별로 어려움 없을꺼라 생각합니다.

XCode 사용법한번 정리해 본적 없으니 이번 글은 XCode를 살짝 이해하는 과정이 되지 않을까 생각해 봅니다.

XCode를 실행하여 File -> New Project를 하여 View-Based Application을 선택하여 프로젝트를 만들어 봅시다.

저는 FirstProject라는 이름으로 하였습니다.

사용자 삽입 이미지새로운 프로젝트를 생성하고 나면 다음과 같은 화면을 볼 수 있습니다.
사용자 삽입 이미지이 화면이 아이폰을 개발하며 가장 많이 보게 될 IDE(Integrated Development Environment)화면입니다.

우선 알아두실것은 A의 클래스들과 B의 리소스들입니다. C++의 MFC개발을 많이 해보셨다면 이미 짐작하셨을것입니다.

Classes에는 앞으로 사용할/추가할 모든 클래스들을 모아두는 곳입니다. Resources에는 뷰와 프로젝트 설정파일인 Info.plist 파일을 넣어두는 공간이 되겠습니다.

Resources안의 FirstProjectViewController.xib파일을 더블클릭하여 Interface Builder를 띄워 봅시다.
사용자 삽입 이미지위와 같은 화면들을 만날 수 있습니다. 왼쪽은 Inspector입니다. 만약에 없다면 Tools -> Inspector를 선택해 주면 보실 수 있습니다.

Inspector의 하위 메뉴로 있는 4가지는 각각 Attributes, Connections, Size, Identity입니다.

오른쪽은 Dock 윈도우 입니다. 눈에 보이지 않는 리소스들이 이곳에 나오게 됩니다. 앞으로 실제 클래스들과 매핑하는등의 연결을 하는데 이용됩니다.
사용자 삽입 이미지그리고 너무 길어 부담스럽지만 위의 화면은 Library 윈도우 입니다.

설명을 안해도 이미 아시겠지만 모든 컨트롤 라이브러리들이 이곳에 등록되어있습니다.

실제 개발할 뷰에 끌어다 놓는것만으로 컨트롤을 추가 할 수 있습니다.

이제 예제 개발을 위해 라벨과 버튼을 View에 추가해 보겠습니다.
사용자 삽입 이미지각 컨트롤러의 값은 더블클릭하여 문자를 변경할 수 있습니다.

라벨의 경우 으로 버튼의 경우 Click!으로 값을 변경해 놓았습니다.

위에서 사용된 컴포넌트 라이브러리들은 Library – Cocoa Touch Plugin – Inputs&Values안에 들어있습니다.

라벨의 문자열 중앙정렬은 Inpector윈도우의 속성(Attributes)에 보시면 Layout이라고 있습니다.

이제부터 XCode개발의 묘미라고 해야 할까요 적응 안되는 변화라고 해야 할까요.

신기한 방법으로 개발하는 방법을 경험해 보도록 하겠습니다.


Dock 윈도우의 File’s Owner를 선택하고 Inpector 윈도우의 Identity탭을 선택하여 봅시다.


사용자 삽입 이미지Class에 보니 FirseProjectViewController라고 되어있군요. 저 File’s Owner는 이 클래스와 매핑되어있다고 생각하시면 됩니다.

XCode에 돌아가서 위에서 나온 FirstProjectViewController 클래스에 몇가지를 추가해 봅시다.
[code]// FirstProjectViewController.h
#import <UIKit/UIKit.h>

@interface FirstProjectViewController : UIViewController {
    IBOutlet UILabel *label;
}
– (IBAction)buttonClick:(id)sender;
@end[/code]
[code]// FirstProjectViewController.m
// 다음의 구현을 추가
– (IBAction)buttonClick:(id)sender {
    [label setText:@”Hello My First Project!”];
}[/code]


아웃렛(Outlet)은 우리나라에서 부르는 콘센트와 같이 무언가를 연결하는 플러그를 뜻합니다.

IBOutlet은 저 label이 어딘가와 연결되는 창구임을 뜻하는 것이라고 생각하시면 될 것 같습니다.

위의 코드는 buttonClick이 호출되면 label에 “Hello My First Project”를 값으로 정한다고 보시면 됩니다.

그리고 저 label이 아까 우리가 View에 추가한 라벨에 연결시키면 되는 것이죠.

연결을 해보겠습니다. 밑에 보이는 저 사각형이 곧 클래스라는 것이죠.
사용자 삽입 이미지컨트롤키를 누른상태로 버튼을 드래그 하여 File’s Owner 객체로 끌어다 놓습니다.
사용자 삽입 이미지위와 같이 미리 구현해 두었던 buttonClick이라는 메서드가 나옵니다. 선택해 줍시다.
사용자 삽입 이미지buttonClick과 연결이 완료되었습니다. 오른편의 동그란 부분에 흰색으로 칠해져 있죠. 연결이 된것을 알 수 있습니다.
사용자 삽입 이미지반대로 컨트롤 키를 누르고 라벨이라는 변수를 끌어다가 라벨 위에 올려놓습니다.
사용자 삽입 이미지마찬가지로 흰색으로 칠해지며 연결이 완료 되었음을 알 수 있습니다.

위와 같은 연결로 버튼을 클릭하면 buttonClick이 호출될 것이고 label의 Text속성을 변경하면 바로 눈에 보이는 라벨의 값이 변경되게 됩니다.

Build&Go로 시뮬레이터를 실행하여 실행할 수 있습니다.
사용자 삽입 이미지

Click버튼을 누르면 잘 되는 것을 알 수 있습니다.

[iPhone] Object-C – Property & Synthesize란 무엇인가?

아이폰의 직접적인 개발에 앞서 Object-C(Objective C)를 공부하다 보면 여러가지 의문점이 드는 부분이 많이 생기는데 그런 부분을 가끔씩이라도 정리하고 넘어가야 하겠다는 생각을 하게 되었습니다. 그런 일환에서 Property와 Synthesize에 대해 알아볼까요. 이 두가지를 이해하기 전에 MVC 개발 방법론에 대해 이해가 필요할 것 같습니다.

iPhone Application Programming Guide문서의 Fundamental Design Patterns에 나와있는 MVC(Model-View-Controller)는 다음과 같이 설명하고 있습니다.

Model-View-Controller(MVC) 디자인 패턴은 기능적인 요소별로 당신의 코드를 나눌 수 있는 방법이다. Model은 당신의 어플리케이션의 기초가 되는 데이터 엔진과 신뢰할 수 있는 데이터를 안전하게 보존 하는 방법을 정의하는 부분이다. View는 당신의 어플리케이션을 위한 사용자 인터페이스(UI)와 그것에게 데이터를 표시하는 암시적인 방법을 정의하는 부분입니다. ControllerModelView사이를 연결하는 다리와 같은 역할을 하며 그들사이의 업데이트를 용이하게 하는 역할을 하는 부분입니다.

번역이 개판이군요. 말을 조금만 정리해 보면 Model은 데이터를 제공하고 보존하는 역할을 하는 영역입니다. View는 실제로 사람이 눈으로 보이고 조작하는 부분입니다. Controller는 모델에서 데이터를 가져와서 가공후에 View에게 전달해주는 비지니스 로직을 포함하는 부분입니다. MVC 개발 방법론은 실제로 하나의 코드를 세가지 영역으로 분리하여 협업 혹은 유지보수에 유리한 환경이 될 수 있도록 하여줍니다.

하지만 아이폰 개발을 하는 상당수가 개인 개발자인것을 생각해 보면 어찌보면 무색한 부분이긴 하군요. Property와 Synthesizie를 이야기 하면서 왜 갑자기 MVC이야기가 나왔을까요? 이들 사이에 밀접한 연관이 있기 떄문입니다. 실제로 Property&Synthesize는 MVC의 Model에 해당합니다. Property는 어플리케이션에 필요한 데이터를 신뢰할 수 있고 안전하게 보존하는데 필요한 룰을 제공합니다. Synthesize는 Property에서 선언한 데이터들을 외부에서 합법적으로 접근할 수 있는 통로를 편리하게 제공하여 줍니다.

우선 다음을 예제 코드를 보도록 하겠습니다. 아래에 대한 의문이 있으시다면 [이글]을 먼저 읽어주세요.

#import <Cocoa/Cocoa.h>

@interface Model : NSObject {
	NSString *data;
}
@property(copy, readwrite) NSString *data;
@end
#import "Model.h"

@implementation Model
@synthesize data;
@end

위와 같이 작성한 코드는 이제 다른 객체에서 다음과 같이 사용할 수 있습니다.

#import <Foundation/Foundation.h>
#import "Model.h"

int main(int argc, const char * argv[]) {
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	Model * model = [[Model alloc] init];

	// synthesize를 통해 생성된 setter, getter사용법
	[model setData:@"Hello Eye!"];
	NSLog([model data]); // Hello Eye!

	// dot 문법 사용하기
	model.data = @"Bye Eye!";
	NSLog(model.data); // Bye Eye!

	[pool drain];
	return 0;
}

위의 예제에서 알 수 있듯이 model객체의 data 인스턴스 변수에 접근하기 위해서는 synthesize를 통해 생성된 getter(data)와 setter(setData)를 통해 가능합니다. 혹은 C에서 익숙한 객체와 변수사이에 점을 찍는 방식도 사용가능합니다. 하지만 여기서 중요한점은 Property입니다. Model.h의 property선언 부분을 다음과 같이 고쳐볼까요.

@property(copy, readonly) NSString *data;

바뀐점은 readwrite에서 readonly로 바뀌었습니다. 실행해 보면 에러가 발생하는 것을 알 수 있습니다.

error: object cannot be set – either readonly property or no setter found

property와 synthesize를 이용해서 MVC에서 추구하는 데이터를 신뢰할 수 있고 안전하게 사용할 수 있는 방법을 손쉽게 구현할 수 있다는 것을 알게 되었습니다. 여기서 괜히 궁금한것이 생겼습니다. synthesize를 통해서 생성된 setter, getter가 해당 변수를 보호하는 것일까요 property를 통해 정의된 변수 그 자체가 보호하는 것일까요?

이 궁금증을 해소하기 위해 setter를 하나만 만들어 보기로 할까요. 코드에 다음을 추가합니다.

// 현재 @property설정에 readonly로 되어있다고 가정
- (void)setCustomData:(NSString *)myData;
- (void)setCustomData:(NSString *)myData {
	self.data = myData;
}

이제 내가 만든 setCustomData메서드에 메시지를 전달해 보겠습니다.

Model * model = [[Model alloc] init];
[model setCustomData:@"Hello Eye!"];

이 코드를 실행해 보면 아무런 문제가 발생하지 않습니다. 해당 변수가 보호받는것이 아님을 알 수 있습니다. 앞으로는 코드를 작성할 때 @property로 지정한 변수는 될수 있다면 @synthesize를 통해 접근하는 버릇을 들여야 할 것 같습니다.