어제 아이폰을 iOS 5.1로 업그레이드를 하고 Xcode를 4.3.1로 업그레이드 하기 위해 앱스토어에서 설치를 클릭하고 퇴근을 했다. 오늘 오전에 와서 당연히 업그레이드 되어 있겠지 했는데 버전이 4.2로 그대로였다. 설치가 안되었나 해서 앱스토어로 다시 가보니 설치됨으로 나오고 설치를 할 수가 없었다. 뭐지? 터미널에서 개발툴을 삭제하고 리부팅을 했다. 그래도 역시나 설치를 할 수 없는 상태. 찾아 보니 어플리케이션 폴더에 Xcode가 있었다. 실행을 해보니 그때서야 설치가 되기 시작한다. 설치가 된 후에도 역시 어플리케이션 폴더에 있는 Xcode로 실행이 된다. 

이전에도 이렇게 설치를 했었나 하고 생각을 해봤는데 기억이 나지 않는다. 이 세상에서 나만 모르고 있었던 것 같다는 생각이 들었다. 설명을 보니 안정성이 향상되었다고 하는데 iOS 5.1 지원 외에는 눈에 띄게 달라진 점은 잘 모르겠다. 나이가 들어 그런건지 게을러서 그런건지 요즘은 업그레이드 쫓아 가기도 버겁다.
  
저작자 표시 비영리 변경 금지
신고

'이야기들 > 소소한 이야기' 카테고리의 다른 글

Xcode 재설치  (6) 2012.03.09
reCAPTCHA와 집단지성의 활용  (0) 2012.01.31
꿩 대신 닭?  (2) 2012.01.11
2012년...  (0) 2012.01.02
아이맥 구입  (8) 2010.04.25
아이폰 개발자 프로그램 갱신  (2) 2009.11.05

아이폰프로그래밍UIKIT핵심바이블
카테고리 컴퓨터/IT > 네트워크/보안 > 모바일프로그래밍 > 아이폰/아이패드
지은이 토코로 유타 (정보문화사, 2011년)
상세보기

2년여 Xcode를 사용할 일이 거의 없었다. 안드로이드 개발환경이 많았고 그외 윈도우즈 모바일, 스마트 TV등이었고 iOS와 관련된 프로젝트는 해볼 기회가 없었다. 이번달 초부터 아이폰 관련 프로젝트를 시작하면서 Xcode 4를 다운로드 받아 설치하고 실행해 보았다. 변경된 UI도 그렇지만 Objective-C, iOS SDK 모든게 낯설어 보였다.

어차피 거의 처음부터 다시 시작이고 이전 지인으로부터 메모리 사용량이 많을 시에는 인터페이스 빌더를 사용하지 않는 것이 메모리 관리가 더 편하다는 이야기를 들어 이 프로젝트에서는 인터페이스 빌더를 사용하지 않고 개발해 보기로 했다. 관련된 서적을 구입하러 서점으로 갔고 '아이폰 프로그래밍 UIKit 핵심 바이블(yes24에서 보기)'이란 책이 가장 눈에 띄여서 구입했다.

기본적인 내용으로 시작하는 1장 마지막에 '1.4 인터페이스 빌더와 완전 결별'이란 내용이 나온다. xib 파일을 삭제하고 설정파일을 편집하고 소스를 수정하여 앞으로 더이상 인터페이스 빌더를 사용하지 않고 개발하기 위한 준비다. 뒤로는 책 제목 그대로 사용자 인터페이스와 관련된 UIKit 프레임워크의 사용방법에 대해서 나온다. 툴 사용법이나 Objective-C에 대한 설명없이 바로 사용할 수 있는 소스코드와 설명 위주로 되어있어 짧은 시간에 다시 적응할 수 있게 되어 도움이 되었다.

처음 iOS에서 개발을 시작하거나 iOS에 대한 전반인 이해를 위한 분들을 위한 책은 아니다. 하지만 iOS 개발에 대해 약간의 지식이 있는 분들에게는 xib를 사용하거나 안하거나 iOS UIKit의 객체들을 사용하고 이해하는데 좋은 요약본이될 수 있다. 시간이 흐르면 그자리는 SDK의 문서들이 대체하지만 그전까지 또는 그후로도 가끔 옆에서 두고 참고할 수 있는 책인 것 같다.
저작자 표시 비영리 변경 금지
신고

보통 Table View의 Cell은 코드로 만드는 경우가 많습니다. 여기서는 인터페이스빌더에서 Table View Cell을 사용하는 간단한 샘플을 만들어 보겠습니다.





1. 프로젝트 생성과 AppDelegate 변경
Xcode를 실행하고 "New Project"를 클릭하여 "Window-based Application"을 선택하여 프로젝트를 생성합니다. 저는 그냥 IBCell이란 이름으로 프로젝트를 만들었습니다.

1) IBCellAppDelegate.h

@class TableViewController;


@interface IBCellAppDelegate : NSObject <UIApplicationDelegate> {


IBOutlet TableViewController *tableViewController;

    UIWindow *window;

}

2
인터페이스 빌더에서 연결을 위해 tableViewController의 아울렛 변수를 추가합니다.

2) IBCellAppDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application {

  

[window addSubview:[tableViewController view]];

    // Override point for customization after application launch

    [window makeKeyAndVisible];

}


메인 윈도우의 SubView로 tableViewController의 View를 추가합니다.

2. ViewController
1) 생성
UIViewController subclass로 TableViewController란 이름으로 클래스를 생성합니다. SDK 3 부터는 "With XIB for user interface"가 있어 선택할 경우 ViewController 오브젝트와 연결된 별도의 xib를 자동으로 생성하여 줍니다. 여기서는 편의를 위해 선택하지 않았습니다.
* 2009/06/26 추가
오늘 확인해 보니 Objective-C class 선택시에 하단에 Subclass of로 선택할 수 있는 클래스들이 나오네요. 버젼업되면서 왜 줄었나 했더니 여기로 들어 가 있었습니다. 위의 방법말고 아래에서 UITableViewController를 바로 선택하고 사용하시면 됩니다.
 

2) TableViewController.h

#import <UIKit/UIKit.h>



@interface TableViewController : UITableViewController {

IBOutlet UITableViewCell *myCell;

}


- (IBAction)goMyBlog:(id)sender;


@end


부모 클래스를 UIViewController에서 UITableViewController로 변경합니다. 그리고 인터페이스빌더에서 연결을 위해 myCell 아울렛 변수를 추가합니다. 그리고 버튼 클릭시 연결될 goMyBlog 액션 메소드를 선언합니다.

3) TableViewController.m

/* 버튼 클릭시 */

- (IBAction)goMyBlog:(id)sender {

NSURL *url = [NSURL URLWithString:@"http://www.cocoadev.co.kr/"];

[[UIApplication sharedApplication] openURL:url];

}


#pragma mark Table view methods


/* 색션 */

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return 1;

}


/* 색션 타이틀 */

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

return @"소개";

}


/* */

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

return myCell;

}


/* 높이 */

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

return [myCell frame].size.height;

}


버튼 클릭시 실행될 메소드와 tableView의 delegate, datasource 메소드를 구현합니다.



3. 인터페이스 빌더

1) Table View Controller

인터페이스 빌더를 실행하고 라이브러리의 Controlls의 Table View Controller를 MainWindow.xib로 드래그해서 가지고 옵니다. Class를 TableViewController로 지정합니다.



좌측과 같이 Table View의 Style 속성을 Grouped로 지정합니다.



2) Table View Cell

라이브러리에서 Table View Cell을 MainWindow.xib로 드래그해서 가지고 옵니다.




아래와 같이 TableViewController의 myCell 아울렛에 가져온 Table View Cell을 연결합니다.


사용자 삽입 이미지
라이브러리 윈도우에서 Image View, Label, Rounded Rect Button, Text View를 드래그 해서 Table View Cell에 가져다 놓습니다.



Cell의 높이를 늘리고 각각의 컨트롤들을 아래와 같이 배치합니다. 적당한 이미지를 Xcode 좌측의 Groups & Files 아래의 Resources 그룹으로 드래그해서 프로젝트로 가져옵니다. Image View의 Image 속성에서 해당 이미지를 선택합니다. 입력이 되지 않도록 Text View의 Editable 속성의 체크를 해제합니다.
사용자 삽입 이미지

버튼 클릭시 사파리에서 해당 URL로 이동하기 위해 Text View Controller의 goMyBlog IBAction과 연결합니다.


4. 확인
Xcode에서 Build & Go를 클릭하면 시뮬레이터에서 아래와 같이 확인하실 수 있습니다.
SDK 3을 대충 보기만 하고 처음 사용해 보았는데 곳곳에 바뀐 부분이 눈에 뛰네요. SDK 3도 처음이고 오랫만에 포스팅이라 틀린 부분이 있는지도 모르겠습니다.

저작자 표시 비영리 변경 금지
신고

'iOS' 카테고리의 다른 글

아이폰 OS 4  (8) 2010.04.09
NSXMLParser로 RSS 읽어오기  (21) 2009.08.05
인터페이스빌더 Table View Cell 사용하기  (0) 2009.06.25
cocos2d 개발환경 설정  (24) 2009.04.13
iPhone SDK 3.0 beta 2  (4) 2009.04.05
UITableView의 메모리 누수 현상  (4) 2009.02.05

iOS 2009.04.13 10:59
cocos2d-iphone 는 OpenGL ES를 기반으로 하는 게임, 에니메이션, 데모등을 위한 2D 라이브러리입니다. 기본적인 에니메이션부터 메뉴, 스코어 서버까지 지원하기 때문에 빠른 시간에 편리하게 사용할 수 있습니다. cocos2d-iphone 사이트에서 최신 버젼을 다운로드 받으실 수 있습니다.



1. cocos2d 설정
1) 빌드
다운로드를 받으신 후에 압축을 풀고 Xcode Project 파일을 클릭하여 Xcode를 실행합니다. Active Target을 cocos2d로 하고 Actvie SDK를 Device로 빌드 합니다.


Active SDK를 Simulator로 하고 다시 한번 빌드합니다.


cocos2d는 프로젝트 자체에 여러 샘플소스들을 많이 가지고 있습니다. Target을 해당 데모로 변경하여 실행을 확인해 보실 수 있습니다.

2) 라이브러리 복사
해당 폴더의 빌드 폴더를 보시면 2개의폴더에 각각 libcocos2d.a와 libChipmunk.a가 같이 빌드되어 있습니다.


원하시는 곳에 폴더를 만드시고 이 두 폴더의 파일들을 각각 다른 폴더로 가져다 놓습니다. 저는 /Developer/Library 밑에 Cocos2d란 폴더를 만들고 그 밑에 Device와 Simulator 폴더를 만들어 각각의 라이브러리 파일들을 가져다 놓았습니다.

3) 헤더파일 복사
/Developer/Library/Cocos2d 밑에 헤더파일들을 복사하기 위해 Include 폴더를 새로 만듭니다. Include 폴더의 하위로 Support 폴더를 만듭니다. 다시 cocos2d 폴더로 와서 보시면 하위에 똑 같은 이름의 cocos2d란 폴더가 있습니다. 이 폴더내의 *.h을 위에서 생성한 Include 폴더로 복사합니다. 하위의 Support 폴더내의 *.h 파일도 해당 폴더의 Support 폴더내로 복사합니다. (파인더에서 정렬을 종류로 하시면 헤더파일별로 쉽게 가져 올 수 있습니다.)


그리고 cocos2d 폴더의 external/Chipmunk/src에 있는 *.h 파일도 위와 같이 생성한 Include 폴더로 복사합니다. Chipmunk는 게임등에 사용되는 물리엔진으로 컴파일을 위해 헤더파일이 꼭 필요하며 실제 사용하지 않을 경우에는 라이브러리는 추가하지 않으셔도 됩니다.

4) fps_images.png 복사
cocos2d가 초당 프레임수를 출력할 때 사용하는 이미지를 해당 프로젝트의 Resource 폴더에 복사해 놓으셔야 됩니다. 이 이미지가 없을 경우에는 아래와 같은 실행오류가 발생합니다.


cocos2d 폴더의 Resources/Images에 있는 fps_images.png 파일을 적당한 위치에 복사해 놓습니다.



2. Xcode 설정
Xcode에서 New Project를 클릭하여 iPhone OS/Application의 Window-Based Application으로 프로젝트를 생성합니다. 프로젝트명을 cocos2d App로 입력합니다.

1) Search Paths 설정
좌측과 같이 Groups & Files에서 프로젝트를 우클릭한 후에 Get Info를 클릭하여 Project 정보창을 오픈합니다.

두번째 Build에서 Search Paths항목에서 Header와 Library를 각각 해당 폴더로 입력합니다.

아래와 같이 Header Search Paths, Library Search Paths가 입력되어 있는 것을 확인합니다.

2) cocos2d 라이브러리 링크
Linking 항목중 OPther Linker Flags에 -lcocos2d를 입력합니다.


libcocos2d.a를 드래그 해서 직접 추가하여 사용하셔도 됩니다. 하지만 시뮬레이터와 디바이스의 선택에 따라 각각의 라이브러리 파일이 필요하기 때문에 Active SDK가 변경될 경우에는 매번 파일을 변경해 주어야 합니다.

그렇기 때문에 설정에서 Configuration이 Debug일때는 Library Search Paths를 Simulator로 Release일 때는 Device로 설정합니다. 시뮬레이터로 개발시에는 Debug 모드로 개발하고 실제 기기에서 테스트시나 업로드시에는 Release 모드를 선택하면 해당 라이브러리 파일의 변경없이 편하게 사용하실 수 있습니다.

3) 프레임워크 추가
cocos2d가 사용하는 OpenGL ES, QuartzCore 프레임워크를 추가합니다. 좌측과 같이 cocos2d App 타겟에 우클릭하여 Get Info를 클릭합니다.



General 항목의 좌측 하단에 [+] 버튼을 클릭합니다.
아래와 같이 OpenGLES.framework와 QuartzCore.framework를 선택하고 Add를 클릭합니다.


4) fps_images.png 추가
좌측과 같이 이전에 복사해 두었던 fps_images.png를 Resources 항목으로 드래그해서 가져다 놓습니다.



5) 프로젝트 템플릿 추가
cocos2d를 사용할 때마다 매번 위의 설정을 하는 것은 번거로운 작업입니다. 그렇기 때문에 기본설정된 항목을 템플릿에 추가하여 사용하는 것이 편리합니다. cocos2d App 프로젝트 폴더를  /Library/Application Support/Deveoper/Shared/Xcode/Project Templates/ 밑에 Application 폴더를 만드시고 그 아래에 복사합니다.
이제 새 프로젝트를 선택하면 User Templates/Application에 cocos2d App 항목이 나오며 위에서 cocos2d를 위해 설정된 사항대로 편리하게 사용하실 수 있습니다.

cocos2d에 관한 자세한 내용과 자료는 cocos2d-iphone 사이트에서 확인하실 수 있습니다.

저작자 표시 비영리 변경 금지
신고

'iOS' 카테고리의 다른 글

NSXMLParser로 RSS 읽어오기  (21) 2009.08.05
인터페이스빌더 Table View Cell 사용하기  (0) 2009.06.25
cocos2d 개발환경 설정  (24) 2009.04.13
iPhone SDK 3.0 beta 2  (4) 2009.04.05
UITableView의 메모리 누수 현상  (4) 2009.02.05
UIView에서 텍스트 출력  (10) 2009.01.13

Xcode를 사용하면서 도움말을 잘 이용하시면 많은 궁금증과 의문점을 쉽게 해소할 수 있습니다. 모르는 것에 대해서 도움말 보다는 구글에서의 검색과 관련 커뮤니티에 질문을 올리는 것은 쉽고 편한 방법일 수는 있어도 장기적으로는 바람직하지  않습니다. 먼저 도움말을 찾아 보고 그래도 답을 찾을 수 없을 때에 비로소 후자의 방법을 택해야 합니다.

다소 늦고 귀찮은 것 같더라도 도움말을 이용하면 원칙에 가까운 답을 얻어 낼 수 있고, 검색하거나 다른 중요한 사항들도 알아낼 수 있습니다. 도움말은 영문으로 되어 있지만 대부분 코드와 간단한 문장이기 때문에 저같이 영어를 잘 몰라도 대부분 쉽게 이해할 수 있습니다.
 
Xcode를 처음 사용하시거나 프로그래밍을 처음 하시는 분들을 위해서 간단하게 도움말을 이용하는 방법을 알아 보겠습니다.

1. Documentation
Xcode의 Help메뉴에서 Document를 클릭하거나 단축키(Shift+Command+Option+?)를 입력하면 아래와 같이 도큐먼트 창이 오픈됩니다.


1) 도움말 다운로드
Xcode의 도움말은 해당항목들을 다운로드 받으신 후에 사용할 수 있습니다. 원하시는 도움말 항목에서 SUBSCRIBE나 GET 버튼을 클릭하여 로컬로 다운로드 받아야 해당 도움말이 활성화 되고 사용할 수 있습니다.

2) 검색어


검색을 위해서는 우측 상단의 Starts With에 검색할 키워드를 입력합니다. 검색어는 &(AND), !(NOT), |(OR) 연산을 지원합니다.

(string | value)  & !format
위와 같은 입력은 string 또는 value를 포함하고 format을 포함하지 않는 항목을 검색합니다.

4) 검색 대상


  • API - 심볼명(클래스, 메소드등)에서 검색합니다.
  • Title - 문서의 제목에서 검색합니다.
  • Full-Text - 문서의 전체 내용에서 검색합니다.

5) 문서 범위


All Doc Sets는 전체문서에서 검색을 하며 우측에는 DOC SETS에서 현재 검색 범위를 표시합니다.

6) 언어 선택


All Languages는 전체 언어(Objective-C, C/C++, Java, Javascript)에서 검색을 합니다. 우측에는 현재 선택된 언어들이 표시되어 있습니다.

전체언어 다음에 선택될 언어들은 위의 API Options 버튼을 클릭하여 선택할 수 있습니다.


7) 검색 조건


검색창에 입력한 문장이 검색될 조건을 지정합니다.

  • Starts With - 입력된 검색어로 부터 시작되는 항목을 출력합니다.
  • Contains - 입력된 검색어가 포함된 항목을 출력합니다.
  • Exact - 입력된 검색어가 일치된 경우만 출력합니다.

2. Research Assistant
Xcode의 Help메뉴에서 Show Research Assistant를 클릭하거나 단축키(Shift+Control+Command+?)를 입력하면 아래와 같이 Research Assistant가 오픈됩니다.


Research Assistant가 오픈되어 있으면 Xcode의 에디터에서 커서가 위치한 곳에 해당항목에 대한 도움말이 있으면 자동으로 위와 같이 간단한 도움말과 관련 API, 문서, 샘플등을 표시해주는 아주 유용한 툴입니다. 듀얼 모니터를 사용하시는 분들은 Xcode 사용시 다른 모니터에 뛰워 놓으시면 편리하게 확인하실 수 있습니다.

3. 기타
1) 도움말 바로가기 (Option + 마우스 더블클릭)
Xcode의 에디터에서 옵션키를 누른 상태에서 레퍼런스 내용을 확인할 단어에다 마우스로 더블클릭을 하면 해당내용이 도큐멘테이션에서 바로 출력이 됩니다.

2) 선언 보기 (Command + 마우스 더블클릭)
Xcode의 에디터에서 커멘드키를 누른 상태에서 변수나 메소드등의 심볼을 클릭하면 해당 변수/메소드가 선언(또는 구현)된 소스파일로 이동합니다.

이외에 Xcode와 도움말에 대한 자세한 내용은 ADCXcode Workspace Guide 문서를 참조하시기 바랍니다.

저작자 표시 비영리 변경 금지
신고

iOS 2008.11.22 14:33
오늘 맥을 켜니 아이튠즈와 함께 아이팟 터치 펌웨어도 2.2로 업그레이드 되었습니다. 애플 사이트에서 가져온 아이폰 펌웨어 2.2에서 변경된 내역은 아래와 같습니다.

* Enhancements to Maps
  • Google Street View*
  • Public transit and walking directions
  • Display address of dropped pins
  • Share location via email
* Decrease in call setup failures and dropped calls

* Enhancements to Mail
  • Resolved isolated issues with scheduled fetching of email
  • Improved formatting of wide HTML email
* Podcasts are now available for download in iTunes application (over Wi-Fi and cellular network)

* Improved stability and performance of Safari

* Improved sound quality of Visual Voicemail messages

* Pressing Home button from any Home screen displays the first Home screen

* Preference to turn on/off auto-correction in Keyboard Settings

사파리로 브라우징시에 간혹 튕기는 현상이 있었는데, 사파리의 안정화 부분 정도에만 눈길이 가네요. 캘린더에 TODO 기능과 iCal과의 동기화가 되었으면 좋겠는데, 애플에서 언제쯤 넣어줄지 모르겠습니다.

완료후에 iPhone DevCenter로 가보니 역시 SDK도 동일하게 2.2로 업그레이드 되었습니다. SDK를 새로 설치하니 Xcode도 3.1.1에서 3.1.2로 업그레이드 되었습니다.

IDE나 Core의 버젼이 올라갔지만 펌웨어에 맞추어 2.2로 업그레이된 것을 제외하고는 문서를 읽어보아도, 실행해서 대충 둘러 보아도 눈에 뛰게 변경된 점은 없는 것 같습니다.
저작자 표시 비영리 변경 금지
신고

3. 관련 자료

* 한글 자료와 영어
아쉽게도 이곳에서 소개하는 대부분의 자료들은 영문으로 되어 있습니다. 아이폰과 관련되어 나온 번역서적은 아직까지는 한권도 없습니다. (준비하고 있다는 이야기는 들었습니다) OS X 코코아 프로그래밍에 관련된 내용인 코코아 프로그래밍이란 책이 유일하게 번역되어 나온 관련 서적입니다.


코코아 프로그래밍
카테고리 컴퓨터/IT
지은이 아론 힐리가스 (인사이트, 2007년)
상세보기

아직까지는 코코아 프로그래밍이 대중화 되지 않아 한글로된 자료가 적지만, 점점 많아질 것으로 보아집니다. 하지만 빠르고 다양한 자료를 얻기 위해서는 영문 자료를 보시는 수 밖에 없습니다. 저도 모자라는 영어로 괴롭지만 자꾸 보다보면서 조금씩 익숙해지고 있습니다. 저같이 영어 공부를 게을리 하신 분들은 따로 영어를 공부하실 필요 없이 영문자료로 공부를 하셔도 좋을 것 같습니다.

* ADC (Apple Developer Connection)
사실 맥/아이폰 프로그래밍에 관한 자료를 구하는 곳은 사실 딱 한 곳, ADC만 알고 있어도 됩니다. 이곳에는 애플에서 제공하는 OS X 개발과 관련된 다양한 문서와 자료, 동영상, 소스코드들이 있습니다. 자료가 방대하지만 이곳을 문지방이 닳도록 드나드시며 근본적인 자료들을 보시는 것이 늦어 보이지만 빠른 길입니다.


1) 관련 사이트
맥/아이폰 개발과 관련된 국내외 사이트들과 블로그들입니다. 국내 사이트들도 아직은 다른 일반적인 개발환경에 비해서 자료와 회원들이 많지는 않습니다. 하지만 비슷한 관심분야를 가진 분들과 교류를 할 수 있고, 궁금하신 점들을 올리고 다른 분들의 의견이나 해답을 들을 수 있습니다. 아무래도 같은 한국어로 이야기하는 것이 명확하고 친근할 것 같습니다.

2.1) 사이트
* 국내

* 국외
  • Apple Developer Connection - 애플에서 제공하는 개발자 지원 서비스입니다.
  • Apple Discutssions - Developer Forum - 애플에서 제공하는 개발자 포럼입니다.
  • iPhone Development Forum - 애플의 아이폰 개발자 포럼이며, 현재는 개발자 프로그램에 등록된 회원만 접근할 수 있습니다.
  • Cocoalab - Become An Xcode란 문서로 유명한 사이트이며 관련 강좌와 소스들을 제공합니다.
  • iPhone Development Centra - 아이폰 개발에 관련된 튜토리얼, 포럼을 제공합니다.
  • iPhoneWebDev - 아이폰용 웹사이트 개발에 관련된 예제, FAQ를 제공합니다.
  • Cocoabuilder.com - Cocoa와 Xcode에 관련된 메일링 리스트를 제공합니다.
  • Apps Amuck - 31개의 아이폰 튜토리얼과 샘플코드를 제공합니다.
  • Cocoa Dev Central - 코코아 튜토리얼과 관련 링크들을 제공합니다.
  • CS 193E - 스텐포드 대학에서 제공하는 코코아 프로그래밍 강좌입니다.
  • CS 193P - 스텐포드 대학에서 제공하는 아이폰 프로그래밍 강좌입니다.

2.2) 블로그

아래는 맥, 아이폰 개발 관련 블로그들입니다. RSS로 등록해 놓으시면 유익하고 재미있는 포스팅들을 편하게 구독하실 수 있습니다.


이외에 Xcode, Cocoa, 맥프로그래밍 관련 국내외 사이트란 포스팅도 참고하세요.

2) 관련 서적
다음은 Cocoa, Objective-C, 맥/아이폰 개발에 관련된 서적들입니다. '코코아 프로그래밍'을 제외하고는 모두 원서이므로 아마존과 같은 외국 사이트 또는 국내의 구매대행 서비스를 하는 온라인 쇼핑몰에서 구입을 하셔야 합니다.

맥에서의 개발이든 아이폰에서의 개발이든 공통적으로 Xcode/인터페이스빌더의 사용법과 Objective-C, 파운데이션 프레임워크에 관해서 알고 있어야 합니다. 그렇기 때문에 당장 시작을 할 수는 없지만, 초반에 기본을 익히는데는 맥 프로그래밍 서적을 보셔도 큰 상관은 없을 것 같습니다.


* 코코아 프로그래밍
- 가격: 22,000원
- 출판: 인사이트
- 역자: 박진형

위에서 언급했던 현재까지 유일한 번역서적입니다. 코코아 프로그래밍에 관한 기본적인 사항을 익히기에 아주 좋은 책이지만, Xcode 2.*를 중심으로 소개하고 있기 때문에, 초보자들이 보기에는 Xcode 3.*을 사용하면서 약간의 차이점 때문에 혼돈되는 부분이 있습니다.


* Cocoa Programming for Mac OS X
가격: $31.49
출판: Addison-Wesley Professional
저자: Aaron Hillegass

아론 힐리가스가 쓴 코코아 프로그래밍의 가장 대표적인 서적입니다. 아이폰이 아닌 맥 프로그래밍에 관한 내용이지만 Xcode, 인터페이스 사용법과 Objective-C등 기본적인 내용을 익히기에 좋은 책입니다. 


* Xcode 3 Unleashed
가격: $26.99
출판 Sams
저자: Fritz Anderson

Step into Xcode의 다음 버젼으로 이전과는 달리 깔끔한 디자인으로 Xcode 3에 맞추어 새로 발간된 책입니다. 위의 아론 책과 유사한 입문서적인데 툴 로서의 Xcode 3 사용법에 치중하였습니다. 칼라로 되어 있기 때문에 보기에 편하고 좋습니다.


* Programming in Objective-C 2.0
가격: $26.69
출판: Addison-Wesley Professional
저자: Stephen G. Kochan

Objective-C 언어에 대한 책입니다. 저는 1.0 버젼을 가지고 있어 정확히 내용은 어떻게 변경되었는지는 모르겠습니다. Objective-C에 대해 체계적으로 공부하기에 좋은 책이며, 책의 절반 가량은 코코아에서 사용하는 파운데이션 프레임워크에 관해 설명하고 있습니다.


* The iPhone Developer's Cookbook
가격: $27.62
출판: Addison-Wesley Professional
저자: Erica Sadun

저도 읽은 적은 없지만 아이폰에서의 개발을 따라 해 볼 수 있는 좋은 책이라고 들었습니다. 쿡북이란 제목처럼 실제로 사용할 수 있는 다양한 소스들을 참조하고 따라해 볼 수 있을 것 같습니다.

(이미지 출처:아마존)

지금은 원서도 많지는 않지만 앞으로는 아이폰 개발에 관련된 책들이 많이 나올 것으로 보입니다. 새로 나온 iPhone, Cocoa 관련 책과 저자들이란 포스팅에서 신간 혹은 새로 나올 관련서적을 확인하실 수 있습니다.

3) 관련 문서
ADC에서는 OS X 개발에 기본이되는 많은 문서들을 제공하고 있습니다. 또한 많은 문서들은 pdf 버젼으로 다운로드 받을 수 있습니다. 자주 참조하는 문서들은 pdf 문서로 다운로드를 받아 편하게 읽어 볼 수 있습니다.

3.1) Getting Started 문서
제목 그대로 애플에서 제공하는 맥/아이폰 개발을 처음 시작하는 입문자를 위한 문서들입니다. 이 문서들은 요점만 제공하기 때문에 내용이 짧아 부담없이 읽어 보실 수 있습니다.

* Mac
ADC의 Gettting Started with Apple Technologies 란 문서를 보시면 맥 OS X 개발을 위한 다양한 자료와 링크를 확인하실 수 있습니다. 또한 세부 항목별로 Getting Started with *와 같은 링크를 제공하기 때문에 관심있는 분야별로 보다 상세하게 확인하실 수 있습니다.

* iPhone
iPhone Dev Center에서는 시작 페이지에서 아래와 같은 문서의 링크를 제공합니다. 각 문서들은 로그인 후에 접근할 수 있습니다.


3.2) Objective-C

3.3) Xcode & Cocoa

  • What's New in Xcode - Xcode 3.0과 3.1에서 업그레이드된 사항들입니다.
  • Xcode Workspace Guide - 툴로서 Xcode 사용법에 관한 메뉴얼입니다.
  • Xcode Overview - Xcode에 대한 간단한 설명과 함께 관련내용에 대한 세부 링크를 제공합니다.
  • Become An Xcoder - 처음 코코아 프로그래밍을 시작하는 사람들을 위한 튜토리얼입니다.
  • Cocoa Fundamentals Guide - 코코아 프레임워크에 관련된 전반적인 내용을 제공합니다.
  • Cocoa Application Tutorial - 간단한 코코아 어플리케이션을 만들어 보는 상세한  튜토리얼을 제공합니다.
  • Foundation Framework Reference - 코코아 프로그래밍을 위한 NS로 시작되는 다양한 파운데이션 프레임워크의 클래스들에 대한 설명 과 기본적인 함수, 데이터타입과 상수들에 대한 문서입니다. Xcode의 도움말에서도 확인하실 수 있으며, 제공하는 클래스들을 둘러 보기에 좋은 문서입니다.
  • Application Kit Framework Reference - AppKit은 위의 파운데이션 프레임워크와 함께 코코아 프로그래밍의 핵심 프레임워크로, 사용자 인터페이스(UI)를 위한 프레임워크입니다. 코코아에서 제공하는 다양한 사용자 UI 클래스들을 볼 수 있는 문서입니다.

3.4) 아이폰
ADC에서 아이폰 개발과 관련된 문서들은 링크는 가능하지만, 로그인 하지 않으면 메인 페이지에서 접근할 수 없는 정책에 따라 링크는 제공하지 않습니다. 하지만 아이폰 관련문서는 많지 않기 때문에 iPhone Dev Center로 로그인 후에 쉽게 찾으실 수 있습니다.

애플의 iPhone DevCenter의 메인화면에서 우측하단을 보면 iPhone Reference Library 색션에서 Required Reading 항목을 보면 아래와 같은 세개의 문서가 있습니다. 애플에서도 권장하는 기본적인 문서인만큼 꼭 읽어 보시는 것이 좋습니다.



이상 맥/아이폰 개발을 위한 자료들과 관련 사이트들을 간단히 알아 보았습니다. 급하게 써내려가서 빠지거나 틀린 내용들이 많이 있을 것 같습니다. 이는 추후에 수정해 나가겠습니다.

다음에는 마지막으로 아이폰 프로그래밍을 시작하는 방법에 대해 주관적인 제 생각을 포스팅 해 보겠습니다.
* 관련링크
iPhone 어플리케이션 개발을 위한 준비 - 1. 하드웨어
iPhone 어플리케이션 개발을 위한 준비 - 2. 소프트웨어
iPhone 어플리케이션 개발을 위한 준비 - 3. 관련 자료
iPhone 어플리케이션 개발을 위한 준비 - 4. 시작하기

저작자 표시 비영리 변경 금지
신고

2. 소프트웨어
아이폰 어플리케이션을 위해 준비해야될 소프트웨어는 Xcode와 iPhone SDK 입니다. 내용은 조금 길지만 요약하면 ADC 맴버쉽 프로그램에 가입 후에 Xcode와 iPhone SDK를 다운로드 받아 설치하시면 됩니다. 맴버쉽 프로그램 등록, 개발 툴 모두 무료입니다.

1) Xcode 와 iPhone SDK 설치
1.1) ADC 가입
Xcode와 iPhone SDK는 모두 무료로 제공됩니다. 하지만 다운로드 받기 위해서는 ADC (Apple Developer Connection) 멤버쉽 프로그램에 가입하셔야 됩니다. (Xcode는 설치CD에 포함되어 있지만, 최신버젼을 얻기 위해서는 다운로드 받아서 설치하시는 것을 권장합니다.)  ADC는 애플이 제공하는 개발에 관련된 각종 툴, 문서, 샘플코드등을 제공하는 서비스입니다. 현재는 아래와 같이 아이폰과 맥, 두개의 색션으로 분리되어 있습니다.


ADC 회원은 지원범위에 따른 여러 유료회원도 있지만, 무료인 온라인 회원으로 가입하셔도 개발툴과 관련 문서, 샘플코드를 사용할 수 있습니다. ADC회원가입과 Xcode, iPhone SDK 설치에 관한 자세한 내용은 Xcode 3 다운로드 및 설치란 포스팅을 참고 하시기 바랍니다.

1.2) Xcode
Xcode는 애플에서 제공하는 OS X에서 맥/아이폰 어플리케이션 개발을 위한 대표적인 개발툴입니다. GCC를 컴파일러로 사용하는 Xcode는 Objective-C, C/C++, Java, Ruby, Python등의 언어를 지원하며, GUI 어플리케이션뿐만 각종 커멘드라인 유틸리티, 프레임워크, 라이브러리, 드라이버등 맥과 아이폰에서 사용하는 다양한 실행 바이너리를 만들 수 있습니다.


* 인터페이스 빌더
Xcode는 맥과 아이폰의 GUI 디자인을 위한 툴로 인터페이스 빌더(IB)를 제공합니다. IB는 OS X 어플리케이션에서 사용하는 nib 파일을 생성해 줍니다. nib에 대한 자세한 설명은 nib 파일 둘러보기란 포스팅을 참조하시기 바랍니다.
 


1.3) 아이폰 시뮬레이터
Xcode 와 iPhone SDK를 설치하면 아이폰 시뮬레이터를 사용할 수 있습니다. 시뮬레이터는 아이폰이나 아이팟 터치가 없더라도, 맥에서 만든 어플리케이션을 실행할 수 있는 아이폰의 에뮬레이터 입니다. 마우스로 터치 UI를 시연해 볼 수 있으며, 회전도 가능합니다.



2) 아이폰 개발자 프로그램 가입
아이폰 어플리케이션을 개발 후에 배포 및 판매를 위해서는 반드시 아이폰 개발자 프로그램에 가입을 하셔야 됩니다. 스텐다드와 엔터프라이즈 두개의 프로그램이 있으며 각각 $99, $299의 비용이 들어 갑니다. (1년마다 같은 비용으로 자격을 연장하셔야 합니다) 차이점은 개발한 어플리케이션을 App 스토어에 등록을 하여 배포를 하는지 또는 직접 배포를 하는지의 여부입니다.


개발자 프로그램에 가입을 하시면 아이폰/아이팟 터치를 테스트 기기로 등록을 할 수 있습니다. Xcode를 이용해 이 등록된 기기로 어플리케이션을 업로드 하여, 실제로 동작을 테스트 해 볼 수 있습니다.

가입이 완료된 후에는 아이폰 개발자 프로그램 포탈에서 iPhone Developer Program Portal User Guide란 문서를 참조하시면, 추후 등록과정을 쉽게 진행하실 수 있습니다. 아이폰 개발자 프로그램 등록 완료란 포스팅에 등록에 관한 저의 간단한 후기가 있습니다.

* 아이폰 개발자 포럼
개발자 프로그램에 등록하시면 현제 베타로 운영중인 아이폰 개발자 포럼도 이용할 수 있습니다. 아이폰 개발자 포럼은 전세계 아이폰 개발자들의 커뮤니티로 주제별로 다양한 의견을 나누고 질문 또는 답변을 할 수 있습니다. 현재까지는 아이폰 개발과 관련되어 질문을 하고 궁굼한 내용을 검색을 하기에 가장 좋은 곳으로 생각이 됩니다.


아이폰 개발에 필요한 소프트웨어를 간단히 알아 보겠습니다. 다음 포스팅에서는 개발을 위해 필요한 정보, 자료등과 접근하는 방법에 대해서 알아 보겠습니다.
* 관련링크
iPhone 어플리케이션 개발을 위한 준비 - 1. 하드웨어
iPhone 어플리케이션 개발을 위한 준비 - 2. 소프트웨어
iPhone 어플리케이션 개발을 위한 준비 - 3. 관련 자료
iPhone 어플리케이션 개발을 위한 준비 - 4. 시작하기

저작자 표시 비영리 변경 금지
신고

이전에 Cocoa-Ruby 어플리케이션이란 포스팅에서 deepblue님께서 댓글로 MacRuby를 언급하셔서 존재한다는 것만 알고 있었습니다. 오늘 애플의 맥개발 센타에서
Developing Cocoa Applications Using MacRuby란 문서를 보았습니다.

대충 읽어보니 MacRuby는 루비로 Mac OS X 어플리케이션을 만들기 위한 애플의 오픈소스 프로젝트이며, 성능저하를 해결하고 완벽하게 통합시켰다고 합니다. 다운로드 받아서 간단하게 살펴 보았습니다.

1. 설치
http://www.macruby.org/files/에서 현재 최신버젼인 MacRuby 0.3.zip 파일을 다운로드 받습니다. 압축을 풀면 나오는 설치파일을 실행하면 간편하게 설치할 수 있습니다.

설치가 완료되면 Xcode를 실행하고 New Project... 메뉴를 클릭하면 아래와 같이 User Templates / Application에 MacRuby Application이 추가되어 있는 것을 확인할 수 있습니다.


2. 어플리케이션 작성
이전에 포스팅했던 Xcode3 첫 어플리케이션에 나오는 Objective-C로된 AppController를 MacRuby로 변경해 보겠습니다. 인터페이스 빌더에서의 작업은 완전히 동일하기 때문에 여기서는 소스코드만 살펴보겠습니다.

1) Objective-C
기존의 AppController의 Objective-C 소스는 아래와 같습니다.

* AppController.h
#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    IBOutlet NSTextField    *textLabel;
    IBOutlet NSTextField    *inputField;
  
    IBOutlet NSButton    *refreshButton;
    IBOutlet NSButton    *leftButton;
    IBOutlet NSButton    *rightButton;

    NSPoint    originalPoint;
}

- (IBAction)setLabel:(id)sender;
- (IBAction)moveLeft:(id)sender;
- (IBAction)moveRight:(id)sender;

@end

* AppController.m
#import "AppController.h"

@implementation AppController

- (void)awakeFromNib {
    NSImage *buttonImage = [NSImage imageNamed:NSImageNameRefreshTemplate];
    [refreshButton setImage:buttonImage];

    buttonImage = [NSImage imageNamed:NSImageNameGoLeftTemplate];
    [leftButton setImage:buttonImage];
  
    buttonImage = [NSImage imageNamed:NSImageNameGoRightTemplate];
    [rightButton setImage:buttonImage];
  
    originalPoint = [textLabel frame].origin;
}

- (IBAction)setLabel:(id)sender {
    [textLabel setStringValue:[inputField stringValue]];  
    [textLabel sizeToFit];
}

- (IBAction)moveLeft:(id)sender {
    [[textLabel animator] setFrameOrigin:originalPoint];
}

- (IBAction)moveRight:(id)sender {
    CGFloat xPos;
  
    xPos = [[[NSApp mainWindow] contentView] bounds].size.width;
    xPos -= [textLabel frame].size.width;
  
    NSPoint targetPoint = NSMakePoint(xPos, originalPoint.y);
    [[textLabel animator] setFrameOrigin:targetPoint];
}

@end


2) MacRuby
MacRuby로 변경한 코드는 아래와 같습니다.

* AppController.rb
class AppController
    attr_writer :textLabel, :inputField, :refreshButton, :leftButton, :rightButton
    originalPoint = NSPoint.new(0, 0)
   
    def awakeFromNib
        @buttonImage = NSImage.imageNamed(NSImageNameRefreshTemplate)
        @refreshButton.setImage(@buttonImage)
       
        @buttonImage = NSImage.imageNamed(NSImageNameGoLeftTemplate)
        @leftButton.setImage(@buttonImage)
       
        @buttonImage = NSImage.imageNamed(NSImageNameGoRightTemplate)
        @rightButton.setImage(@buttonImage)
       
        @originalPoint = @textLabel.frame.origin
    end
   
    def setLabel(sender)
        @textLabel.setStringValue(@inputField.stringValue)  
        @textLabel.sizeToFit
    end
   
    def moveLeft(sender)
        @textLabel.animator.setFrameOrigin(@originalPoint)
    end
   
    def moveRight(sender)
        @xPos = NSApp.mainWindow.contentView.bounds.size.width
        @xPos -= @textLabel.frame.size.width
  
        @targetPoint = NSPoint.new(@xPos, @originalPoint.y)
        @textLabel.animator.setFrameOrigin(@targetPoint)
    end
end

빌드하고 테스트를 해보면 Objective-C로 작성한 것과 완전히 동일하게 동작합니다. 문서를 보면 MacRuby는 실행시에 Objective-C 객체로 불러오고 Objective-C의 가비지콜렉터터를 사용한다고 합니다. 앞으로는 애플에서도 Cocoa-Ruby보다는 MacRuby에게 힘을 실어 주지 않을까 하는 생각이 듭니다. 또한 MacRuby는 기존 Ruby와는 별도로 macruby, macirb, macri macrdoc, macgem등 커멘드라인 유틸리티도 별도로 제공하고 있습니다.

자세한 자료와 튜토리얼등은 MacRuby 홈페이지에 잘 나와있습니다.
저작자 표시 비영리 변경 금지
신고

PickerView, ImageView, TableView를 이용한 간단한 예제입니다. 좌측의 테이블뷰나 하단의 피커뷰에서 moveIn, push, reveal, fade 효과를 선택하면 우측의 이미지가 해당 효과로 다음 이미지와 변환되는 간단한 샘플입니다. 피커뷰의 2번째 컴퍼넌트에서는 효과가 진행되는 방향을 설정합니다. fade 효과에서는 이 방향이 적용되지 않습니다.

(사용한 샘플 이미지에 대해선 사과 드립니다)

이 샘플은 애플의 아이폰 DevCenter의 샘플코드중에서 UICatalogView Transitions 를 참조하였습니다.

1. 프로젝트 생성

Xcode의 메뉴에서 File / New Project를 클릭합니다. iPhone OS / Application을 선택하고 View-Based Application 템플릿을 선택하고 Choose..를 클릭합니다.


적당한 프로젝트명을 입력하고 Save를 클릭하여 프로젝트를 생성합니다. 여기서는 Control2로 생성하였습니다.


2. 소스코드 수정
Control2ViewController의 소스와 헤더 파일에 아래의 푸른색으로 되어 있는 부분을 입력합니다. 설명은 간단한 주석으로 대체하겠습니다.

1) Control2ViewController.h
#import <UIKit/UIKit.h>

@interface Control2ViewController : UIViewController {

    IBOutlet UITableView *myTableView;
    IBOutlet UIPickerView *myPickerView;
    IBOutlet UIView *myView;
   
    UIImageView *imageView1;
    UIImageView *imageView2;
   
    NSArray *effectArray;
    NSArray *directionArray;
}

@end

2) Control2ViewController.m
#import "Control2ViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation Control2ViewController

static NSString *kCellIdentifier = @"MyIdentifier";
static NSString *kAnimationKey = @"transitionViewAnimation";

- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 에니메이션 효과들을 배열로 저장
    effectArray = [[NSArray arrayWithObjects:kCATransitionMoveIn, kCATransitionPush,
                    kCATransitionReveal, kCATransitionFade, nil] retain];
   
    // 에니메이션 시 진행방향을 배열로 저장
    directionArray = [[NSArray arrayWithObjects:kCATransitionFromLeft, kCATransitionFromRight,
                       kCATransitionFromTop, kCATransitionFromBottom, nil] retain];
   
    // 이미지 뷰 생성
    imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no1.png"]];
    imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no2.png"]];
   
    // 이미지 뷰 크기 설정
    CGRect rect;
   
    rect.origin = CGPointZero;
    rect.size = [myView frame].size;
       
    [imageView1 setFrame:rect];
    [imageView2 setFrame:rect];

    // 첫번째 이미지 뷰 추가
    [myView addSubview:imageView1];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}


- (void)dealloc {
    [imageView1 release];
    [imageView2 release];
   
    [effectArray release];
    [directionArray release];
   
    [super dealloc];
}

#pragma mark Animation methods

/** 에니메이션 실행 */
- (void)transitionView:(NSUInteger)effect
{
    UIView* newView;
    UIView* oldView;
   
    // 나올 뷰와 사라질 뷰를 설정
    if ([imageView1 superview] == myView) {
        newView = imageView2;
        oldView = imageView1;
    } else {
        newView = imageView1;
        oldView = imageView2;
    }
   
    // 이전 뷰를 삭제하고 새로운 뷰를 등록
    [oldView removeFromSuperview];
    if (newView && ([newView superview] == nil)) {
        [myView insertSubview:newView atIndex:1];
    }
   
    // 에니메이션 효과와 방향을 설정
    NSString *transition = [effectArray objectAtIndex:effect];
    NSString *direction = [directionArray objectAtIndex:[myPickerView selectedRowInComponent:1]];
   
    // 에니메이션
    CATransition *animation = [CATransition animation];
   
    // 변환효과 설정
    if (transition == kCATransitionFade) {
        [animation setType:kCATransitionFade];
    } else {
        [animation setType:transition];
        [animation setSubtype:direction];
    }
   
    // 변환속도 설정
    [animation setDuration:0.75];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
   
    [[myView layer] addAnimation:animation forKey:kAnimationKey];
}   


#pragma mark TableView delegate/dataSource methods

/** 테이블뷰의 선택이 변경되었을 경우 */
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // PickerView의 효과 컴포넌트 선택 변경
    [myPickerView selectRow:[indexPath row] inComponent:0 animated:TRUE];
   
    // 에니메이션 실행
    [self transitionView:[indexPath row]];
}

/** 테이블뷰 섹션 수 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

/** 테이블뷰 row count */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [effectArray count];
}

/** 테이블뷰 각 항목 타이틀 설정 */
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:kCellIdentifier] autorelease];
    }
   
    cell.text = [effectArray objectAtIndex:indexPath.row];
   
    return cell;
}

/** 색션 해더 타이틀 설정 */
- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section
{
    return @"Effect";
}


#pragma mark PickerView delegate/dataSource methods

/** 피커뷰의 선택이 변경되었을 경우 */
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // componet가 0(첫번째 컴퍼넌트)일 경우에만 처리
    if (component == 0) {
        // 테이블뷰의 선택된 row 변경
        [myTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:component]
                                 animated:NO
                           scrollPosition:UITableViewScrollPositionTop];
   
        // 에니메니션 실행
        [self transitionView:row];
    }
}

/** 피커뷰의 컴퍼넌트 수 설정 - 2(효과, 방향) */
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

/** 피커뷰의 각 컴퍼넌트의 row count */
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0)
        return [effectArray count];
    else
        return [directionArray count];
}

/** 피커뷰의 각 컴퍼넌트의 항목 타이틀 설정 */
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0)
        return [effectArray objectAtIndex:row];
    else
        return [directionArray objectAtIndex:row];
}

@end


3. 인터페이스 빌더

이제 인터페이스 빌더에서 UI를 생성하고 속성들을 연결해 보겠습니다.

Groups & Files의 Resources 폴더에서 Control2ViewController.xib를 더블클릭하여 인터페이스 빌더를 오픈 합니다.

1) 컨트롤 배치
라이브러리 윈도우에서 View, TableView, PickerView를 각각 드래그 해서 아래와 같이
View에 배치합니다.

2) Outlet 연결
xib 윈도우에서 File's Owner를 우클릭 합니다. 여기서 File's Owner는 Control2ViewController 입니다. 각 Outlet들을 위에서 생성한 컨트롤들과 연결합니다. myPickerView를 PickerView와 myTableView를 TableView와 myView를 View로 연결합니다.
 

이제 작업이 완료되었습니다. 빌드를 하고 테스트를 하여 봅니다. 아래는 전체 프로젝트를 압축한 파일입니다.


저작자 표시 비영리 변경 금지
신고

이번에는 CoreData를 이용하는 간단한 샘플을 만들어 보겠습니다. 이전에 Xcode 2.*대에서 이와 비슷한 어플리케이션을 만드는 "간단한 ToDo 어플리케이션 만들기"란 포스팅을 한적이 있습니다. 소스코드에 추가 없이 마우스 클릭만으로 간단히 만드는 예제였는데 Xcode 3에서는 그 마우스 클릭도 최소한으로 줄이고 자동화여, 누구나 쉽게 간단한 어플리케이션을 만들 수 있습니다.

Core Data에 대한 자세한 내용은 아래의  ADC 문서들을 참조하시기 바랍니다.



1. 프로젝트 생성
Xcode를 실행하고 새로운 프로젝트를 생성하기 위해 메뉴에서 File / New Project.. 를 클릭합니다. 아래와 같이 Mac OS X / Application 항목에서 Core Data Document-based Application을 선택하고 Choose...를 클릭합니다.
프로젝트명에 'BookList'를 입력하고 save 버튼을 클릭하여 완료합니다.


2.  Data Model
1) Data Modeling tool
좌측과 같이 Xcode의 Groups & Files아래에 BookList / Models에서 MyDocument.xcdatamodel을 더블클릭합니다.

아래와 같은 데이터 모델링 툴이 오픈됩니다.
2) Entity 추가
위의 이미지에서 붉은색 화살표가 가르키는 Entity 항목 하단의 + 버튼을 클릭하여 새로운 Entity를 추가합니다. 생성된 항목을 더블클릭하거나 우측의 설정창에서 Name: 항목의 입력창을 이용하여 아래와 같이 'Books'로 이름을 변경합니다.


3) Attribute 설정
* 추가
이제 Books에 속성(Attribute)를 추가합니다. Property창 하단의 + 버튼을 클릭하여 나오는 항목중 Add Attrribute를 클릭합니다. 2번 더 반복하여 3개의 속성을 생성합니다.

* 설정
속성들의 이름을 각각 titile, writer, press로 입력하고 아래와 같이 항목들을 설정합니다.




3. 인터페이스 빌더
Xcode에서 MyDocument.xib를 더블클릭하여 인터페이스 빌더를 오픈합니다. 먼저 윈도우에 기본으로 생성되어 있는 "Your document contetents here'  라벨을 삭제합니다.

그리고 라이브러리 윈도우의 Cocoa / Objects & Controllers / Core Data 항목에서 좌측과 같은 Core Data Entity를 드래그하여 윈도우로 가져다 놓습니다.



1) Core Data Entity 생성
윈도우로 드래그를 완료하면 설장창이 오픈됩니다. 아래와 같이 entity를 Books로 선택하고 Next 버튼을 클릭하고 각 단계별로 아래와 같이 진행합니다.
2) 윈도우 크기 조절
생성된 항목에 맞추어 아래와 같이 윈도우의 크기를 적당히 조절합니다.

4. Build & Test
현재까지의 작업만으로 기본적인 동작을 수행할 수 있는 작업이 완료되었습니다. 이제 빌드를 하고 어플리케이션을 실행하여 테스트 합니다.
어플리케이션이 실행되면 등록, 변경, 삭제, 검색 등과 파일 저장/오픈이 동작하는지 확인합니다.


저작자 표시 비영리 변경 금지
신고

'Xcode 3 > 튜토리얼' 카테고리의 다른 글

2. 간단한 Core Data 예제  (9) 2008.10.05
1. Xcode3 첫 어플리케이션  (17) 2008.09.26

OS X 10.5에는 Ruby(v 1.8.6)와 Rails(v 1.2.6)가 설치되어 있습니다. Ruby를 이용하여 Cocoa Application을 만드는 방법을 간단히 알아 보겠습니다. 실제 테스트를 해보니 Ruby와 Cocoa가 이정도까지 잘 결합될 수 있는 것이 신기하네요.

1. 프로젝트 생성
사용자 삽입 이미지
New Project를 클릭하고 프로젝트 템플릿의 Max OS X/Application에서 Cocoa-Ruby Application을 선택합니다. 프로젝트명에 'CocoaRuby' 또는 원하시는 프로젝트명을 입력하고 Save 버튼을 클릭합니다.




2. 기존 코코아 어플리케이션과 차이점
사용자 삽입 이미지
그룹에서 보시면 Objective-C의 main.m과 함게 새로 추가된 Ruby의 rb_main.rb 파일이 생성되어 있습니다.



1) main.m
#import <Cocoa/Cocoa.h>
#import <RubyCocoa/RBRuntime.h>

int main(int argc, const char *argv[])
{
    return RBApplicationMain("rb_main.rb", argc, argv);
}

Ruby를 위한 'RBRuntime.h'가 import되어 있습니다. 그리고 Cocoa에서 일반적으로 사용하는 'return NSApplicationMain(argc,  (const char **) argv);' 대신에 RBApplicationMain("rb_main.rb", argc, argv)로 대체되었습니다. 어플리케이션이 시작되면 'rb_main.rb' 루비 스크립트가 실행됩니다.

2) rb_main.rb
require 'osx/cocoa'

def rb_main_init
  path = OSX::NSBundle.mainBundle.resourcePath.fileSystemRepresentation
  rbfiles = Dir.entries(path).select {|x| /\.rb\z/ =~ x}
  rbfiles -= [ File.basename(__FILE__) ]
  rbfiles.each do |path|
    require( File.basename(path) )
  end
end

if $0 == __FILE__ then
  rb_main_init
  OSX.NSApplicationMain(0, nil)
end

* if $0 == __FILE__ then
현재 파일이 메인일 경우에 실행됩니다. 위의 'RBApplicationMain'에서 'rb_main.rb'을 실행하기 때문에 if내의 명령들이 실행됩니다.

* rb_main_init
Ruby에서 코코아와 기타 프레임워크에 접근을 위해 필요한 파일을 include 합니다.

* OSX.NSApplicationMain(0, nil)
기존의 NSApplicationMain을 실행합니다.


3. Ruby AppController 생성

AppController를 Ruby class로 만들어 보겠습니다. NewFile을 클릭하고 아래와 같이 Ruby 항목에서 'Ruby NSObject subclass'를 선택합니다.

사용자 삽입 이미지

FileName에 'AppController.rb'를 입력하고 Finish버튼을 클릭합니다. 아래와 같이 NSObject의 서브클래스로 AppController Ruby 클래스가 생성되어 있습니다. 푸른색으로 되어 있는 부분을 추가합니다.

require 'osx/cocoa'

class AppController < OSX::NSObject
    ib_outlet :inputText
    ib_outlet :outputText
   
    def buttonClicked(sender)
        OSX.NSLog("Button Clicked");
        @outputText.setStringValue("Hello~ #{@inputText.stringValue}")
    end
   
    ib_action :buttonClicked
end

* ib_outlet, ib_action
IBOutlet과 (IBAction) 대신에 Ruby에서는 ib_outlet과 ib_action을 사용하며 용도는 동일합니다.

* dot(.)
기존 프레임워크들의 클래스 메소드는 '.'를 이용해서 호출하고 함수들은 앞에 'OSX.'를 추가해서 호출합니다.


4. 인터페이스 빌더에서 작업
1) 윈도우
메인 윈도우에 라이브러리에서 Label, TextField, Button을 드래그 해서 아래와 같이 배치합니다.
사용자 삽입 이미지

2) AppController
사용자 삽입 이미지
라이브러리 윈도우에서 'Object'를 드래그해서 MainMenu.nib 윈도우에 드랍합니다.

Object의 Class를 앞에서 만들어 놓은 Ruby의 AppController로 선택합니다.




아래와 같이 inputText는 TextField에 outputText는 Label에 buttonClick는 buttonClicked에 각각 연결합니다.

사용자 삽입 이미지사용자 삽입 이미지

이제 완료되었습니다. 빌드를 하고 실행을 합니다. 아래와 같이 ruby를 입력하고 버튼을 클릭하면 Label이 변경되는 것을 확인할 수 있습니다.
사용자 삽입 이미지

Ruby 스크립트들은 어플리케이션 번들의 Resource 디렉토리 밑에 위치합니다. Ruby는 인터프리터 방식으로 실행되기 때문에, 배포 후에도 사용자들이 목적에 맞게 Ruby(*.rb) 파일을 수정하여 어플리케이션을 쉽게 변경할 수 있습니다.
 
사용자 삽입 이미지
신고

사용자 삽입 이미지
이번 포스팅에서는 인터페이스 빌더 3.1을 둘러 보겠습니다. 역시나 이전 Xcode 둘러보기와 같이 두서없고 깊이 없이 둘러만 보겠습니다.



1. XIB 파일
처음 Xcoe3.1을 실행하고 당황스러운 부분은 더블클릭해서 인터페이스 빌더를 실행해야 할 nib 파일이 없어졌다는 것입니다.

사용자 삽입 이미지
그대신 Resources 그룹을 보면 MainMenu.xib가 새로 추가되어 있습니다. 이 MainMenu.xib를 더블클릭 하면 이전과 같이 인터페이스 빌더가 실행됩니다.


아래는 텍스트 에디터에서 열어본 *.xib 파일의 내용입니다.

사용자 삽입 이미지

요즘 많은 툴들에서 사용하는 XML 포맷으로 되어 있지만, 애플에서는 절대 직접 수정하지 말라고 권하고 있습니다. xib 파일은 기본 3,305 라인이기 때문에 그다지 수정할 생각은 들지 않습니다. xib 파일은 아마 윈도우의 rc 파일의 역활을 하는 것 같습니다.

nib 파일은 Xcode에서는 찾을 수 없지만(하위 호환을 위해서 NIB Files 그룹이 존재 하는 것 같습니다) 빌드 후에는 패키지내에 포함됩니다.


2. XIB 윈도우
2.5 버젼과는 달리 Instance, Classes, Images, Sounds, Nib등의 탭이 없어지고, 이전의 Instance에 해당되는 부분만 있습니다. Application과 Font Manager가 추가되었습니다.

사용자 삽입 이미지

3. 라이브러리 윈도우

이전의 팔레트가 라이브러리 윈도우로 변경되었습니다. 이제 UI 컨트롤, 인스턴스를 추가하는 작업에 라이브러리 윈도우를 사용합니다. 이전과 같이 NIB 윈도우에서 Classes 탭을 이용하여 subclass를 추가할 수는 없는 것 같습니다. 하지만 인스턴스를 클래스(파일)로 만드는 것은 여전히 가능합니다. 아래가 라이브러리 윈도우 입니다.

사용자 삽입 이미지

Cocoa 어플리케이션에서 사용하는 오브젝트와 컨트롤들은 Cocoa 그룹 하단에 다시 세부로 분류되어 잘 정리 되어 있습니다. 지금은 용도를 알수 없는 아이템들이 많고 이전과 비교하여 추가된 부분이 많기 되었기 때문에 기회가 되면 따로 각 아이템의 용도를 공부한 후에 설명해야 될 것 같습니다.

사용자 삽입 이미지
아직 각 아이템들의 명칭을 잘 몰라서 라이브러리 윈도우에서 우클릭을 하면 나오는 보기 옵션에서 'View Icons And Lables'를 선택하여 이름도 같이 볼 수 있도록 선택해 놓았습니다.


4. AppController 인스턴스 생성
우선 AppController 인스턴스와 클래스 파일을 만들어 보겠습니다. 라이브러리 윈도우에서 Cocoa/Objecrts & Controllers(/Controllers) 에서 Object 아이템을 드래그해서 아래와 같이 xib 도큐멘트 윈도우로 가져다 놓습니다.
사용자 삽입 이미지
새로 만들어진 Object가 선택된 상태에서 Shift+Command+i를 클릭하여 인스펙트 윈도우를 오픈합니다. 아래와 같이 Identity 항목을 선택한 다음 Class에 AppController를 입력합니다. 그리고 Action과 Outlet 하단의 [+] 버튼을 클릭하여 아래와 같이 changeTextLabel과 textLabel, userInput을 각각 추가하였습니다.

사용자 삽입 이미지


5. Outlet, Action 연결
라이브러리 윈도우에서 Label, TextField, Push Button을 윈도우로 드래그 해서 아래와 같이 배치하였습니다.
사용자 삽입 이미지
연결은 오브젝트를 컨트롤 키와 함께 클릭하여 연결될 오브젝트로 드래그 하는 이전과 동일한 방법도 가능합니다. 이전과 다른 점은 인스펙터의 연결창이 오픈되는 것이 아니라 아래와 같이 연결될 Action 또는 Outlet의 목록만 출력됩니다.
사용자 삽입 이미지사용자 삽입 이미지

인터페이스 빌더 3에서는 더욱 편리한 방법이 있습니다. xib 도큐먼트 윈도우에서 AppController에 마우스 우클릭을 하면 아래와 같이 연결 판넬이 오픈됩니다.

사용자 삽입 이미지

textLabel의 우측에 원모양의 아이콘을 드래그 하여 Label에 연결합니다. 동일한 방법으로 userInput을 텍스트필드에 연결하고 Received Action의 changeTextLabel을 Set 버튼에 연결합니다.
  
사용자 삽입 이미지

모두 연결된 모습입니다. 해당 항목 앞의 x 아이콘을 클릭하면 연결이 삭제됩니다.
사용자 삽입 이미지

인스펙트 윈도우의 연결 항목에서도 현재 상태를 확인할 수 있습니다. 또한 이곳에서도 해당 아이템 우측의 원모양 아이콘을 드래그하여 해당 오브젝트와 연결 또는 x를 클릭하여 삭제 할 수 있습니다.
사용자 삽입 이미지


6. 소스코드와 연결
1) 클래스 파일 생성
이제 AppController 인스턴스의 클래스 파일을 만들어 보겠습니다. AppController 인스턴스를 선택한 상태에서 인터페이스 빌더 메뉴의 File/Write Class Files...을 클릭합니다. 아래의 창이 뜨면 Save 버튼을 클릭하여 저장합니다.
사용자 삽입 이미지
생성된 파일의 프로젝트에 포함시키기 위하여 체크를 하고 Add 버튼을 클릭합니다.
사용자 삽입 이미지
2) 슈퍼클래스 지정
Xcode에서 보면 AppController 클래스 파일을 확인할 수 있습니다. 인터페이스 빌더에서 위와 같이 생성한 클래스들은 헤더파일에서 슈퍼클래스를 지정해 주어야 합니다. 오랜지 색으로 되어 있는 부분을 NSObject로 변경하고 저장합니다.

#import <Cocoa/Cocoa.h>

@interface AppController : /* Specify a superclass (eg: NSObject or NSView) */ {
    IBOutlet NSTextField *textLabel;
    IBOutlet NSTextField *userInput;
}
- (IBAction)changeTextLabel:(id)sender;
@end

3) 코드와 동기화
이제 인스펙터에서 다시 확인하면 아래의 붉은색 사각형 부분과 같이 AppController.h라 바가 생겨 Xcode의 AppController 클래스와 연결되어 있음을 알려줍니다.

사용자 삽입 이미지

이전에는 소스코드에 변경사항이 생기면 Xcode에서 해당 클래스의 헤더파일을 드래그 하여 인터페이스 빌더의 nib 도큐먼트로 드랍 해서 변경사항을 적용시켜 주어야 했습니다. 하지만 이제는 Xcode에서 소스코드에 변경사항이 생기고 저장이 되면 인터페이스 빌더에 바로 반영이 되어 매우 편리합니다.

Xcode에서 미리 클래스 파일을 만들어 놓고 인터페이스 빌더에서 해당 클래스를 선택하는 것도 가능합니다.
사용자 삽입 이미지


AppContorller의 인스펙터에서 새롭게 Outlet을 추가해 보았습니다.
사용자 삽입 이미지

위와 같이 AppController.h의 상단에 MainMenu.xib 바 밑에 추가되기 때문에, 헤더파일에 반영이 되지 않은 것을 쉽게 확인할 수 있습니다. 소스코드에서 아래와 같이 myOutlet1을 추가한 후에 저장해 보았습니다.

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    IBOutlet NSTextField *textLabel;
    IBOutlet NSTextField *userInput;
    IBOutlet NSTextField *myOutlet1;
}
- (IBAction)changeTextLabel:(id)sender;
@end

사용자 삽입 이미지
다시 인터페이스 빌더의 AppController의 인스펙터에서 확인하면 좌측과 같이 변경된 사항이 자동으로 반영되어 있습니다.




7. 기타
1) Effect
눈에 뛰는 것은 인스펙터에 'Effect' 항목이 추가되었다는 것입니다. 코어에니메이션을 이용하여 사용자 UI에 화려한 효과를 주는 것으로 보입니다. 아래는 효과를 선택하는 화면이며,  보시는 바와 같이 다양한 효과가 있습니다. 재미있는 것이 많을 것 같은데 몇가지만 확인해 보았습니다.

사용자 삽입 이미지

코어에니메이션을 사용하기 위해서는 Content View를 체크해야 합니다. Context Filters에서 Color Invert와 Gaussian Blur 필터를 추가해 보았습니다.

사용자 삽입 이미지

* Color Invert + Gaussian Blur 필터 적용
사용자 삽입 이미지

* Color Invert 필터 적용
사용자 삽입 이미지

2) 크기조절과 정렬
사용자 삽입 이미지
윈도우 확대시에 컨트롤들의 위치와 크기를 조절하는 부분을 움직이는 gif로 만들어 보았습니다. (실제로는 훨씬 부드럽습니다)

하얀색으로 된 부분이 윈도우고 붉은색이 해당 콘트롤입니다. 윈도우 확대시 변화되는 모습을 시각적으로 보여 줍니다.


사용자 삽입 이미지
정렬 기능이 인스펙터에 추가되었습니다. Alignment 항목은 다른 오브젝트와 같이 선택되었을 때 적용이 가능합니다.

Placement는 가로 또는 세로로 정중앙에 위치하게 합니다.



Xcode와 마찬가지로 인터페이스 빌더 3.1에도 재미있고 신기한 기능들이 많이 추가 된 것 같습니다. 잠시 사용해 본 것이라 틀린 내용들이 있을 수 있습니다. 알려 주시면 수정하겠습니다.

이전 인터페이스 빌더를 보면 독특한 방식은 인상 깊었지만 무엇인지 약간 부족한 느낌을 받았습니다. 하지만 이번 3.1버젼은 비록 짧은 시간 일부분만 확인해 보았지만, 안정적이고 완성도가 많이 높아졌다는 느낌을 받았습니다.
신고

Xcode 3.1을 제가 사용해 보면서 눈에 뛰는 점들만 알아 보겠습니다. 사용 경험이 없어 틀린 내용이나 중요하지만 언급하지 않은 내용들이 많이 있을 수 있습니다. 틀린 내용들은 알려 주시면 수정하겠습니다.

제목 그대로 깊이 없고 두서 없는 '둘러보기'식 내용이니, 정확하고 체계적인 내용은 애플에서 제공하는 아래의 문서들을 확인해 보시기 바랍니다.



1. 인트로(Welcome) 화면
Xcode 시작시에 인트로 화면이 추가되었습니다. 보통 어플리케이션 사용시에 이런 Welcome이나 오늘의 팁 같은 기능들은 잘 사용하지 않습니다. 하지만 Xcode에서는 RSS로 새로운 소식들도 보여주고, 순간 관심이 가는 링크들을 클릭해서 내용도 읽어 보기 위해서 하단의 'Show at launch'를 체크해 놓고 시작할 때 마다 한번씩 새로운 소식들을 확인해 볼 수 있습니다. 화면은 아래와 같이 다섯개의 색션으로 되어 있습니다.

1) Getting Started
  • Create your first Cocoa application
  • Build your user interface
  • Store your application data
  • Optimize your application

위와 같이 4개의 내용으로 구성되어 있으며 각 제목을 클릭하면 해당 도움말이 열립니다. Xcode 3을 처음 실행하는 분들은 한번씩 읽어 볼만한 내용들입니다. Xcode는 소개화면에서 다섯개의 색션중 최종적으로 선택한 색션을 기억하고 있습니다. 'Getting Started'는 한번정도 볼만한 내용이므로 RSS 색션을 선택해 놓고 종료하면 다시 실행될 때 RSS 색션으로 열립니다.

2) iPhone Dev Center
아이폰 개발과 관련된 Video, Sample Code, Reference Library에 대한 링크로 구성되어 있습니다. 클릭하면 ADC의 해당 문서가 웹브라우져에서 열립니다. 모바일에서의 개발이 맥에서 개발보다 앞에 위치 있다는 것은 애플이 iPhone에 많은 기대를 가지고 있다는 것을 보여 주는 것 같습니다. 개발자도 iPhone 개발자들이 더 많은지는 잘 모르겠습니다.

3) Mac Dev Center
내용은 위와 동일하며 OS X에서 개발에 관련된 Video, Sample Code, Reference Library에 대한 링크로 구성되어 있습니다.

4) Xcode News [RSS]
맥 개발과 관련된 최신 뉴스를 확인할 수 있습니다. 하단의 Mac OS X, Mac OS X server, Core Foundation, Quicktime, Internet & Web, Games, Graphics & Imaging, Networking 링크를 클릭하면 해당 색션의 RSS를 등록할 수 있습니다. 애플에서 제공하는 개발 관련 RSS 목록은 'More RSS feeds...'를 클릭하거나 개발자 RSS Feeds 페이지에서 확인할 수 있습니다.

5) Mailling Lists
맥 개발과 관련된 메일링 리스트들입니다. 뉴스와 마찬가지로 RSS로 등록하여 확인할 수 있습니다. 애플과 관련된 전체 메일링 리스트들은 'More...'를 클릭하거나 Apple Mailing Lists 페이지에서 확인할 수 있습니다.

6) Tips
Xcode 사용에 관련된 팁들이 있습니다. 주로 Xcode 3에서 추가된 기능들에 관한 설명들이 있으며, 아쉽지만 내용이 다시 실행될 때 마다 변경되지는 않는 것 같습니다. 버젼업 때마다 변경되는 것인지 일정 기간을 두고 변경되는지도 모르겠습니다.


2. New Project
가장 먼저 New Project를 실행해 보았습니다. UI를 제외하고는 이전과 비슷해 보입니다.
사용자 삽입 이미지
iPhoneSDK를 설치하였기 때문에 템플릿중에 iPhone OS 항목이 있습니다. 이외에 MAC OS X의 Application항목에서 Cocoa-Python과 Cocoa-Ruby에 관련된 템플릿들이 많이 추가되었습니다.

사용자 삽입 이미지


3. 에디터
'TestXcode3'로 새로운 Cocoa Application 프로젝트를 생성하였습니다. 겉으로 단순히 보기에는 Xcode 2.5와 큰 차이점이 보이지 않습니다.
사용자 삽입 이미지
이 프로젝트에서는 텍스트 필드에 입력 받은 내용을 버튼을 클릭하면 라벨에 출력하는 간단한 어플리케이션을 만들어 볼려고 합니다. 먼저 AppController 클래스를 생성하였습니다.

1) 자동완성/제안 기능 향상
사용자 삽입 이미지
IB까지 입력하면 IBAction과 같이 출력 됩니다. 여기서 엔터를 입력하면 자동으로 IBAction이 입력됩니다. IBO까지 입력하면 좌측과 같이 IBOutlet이 출력되며 이상태에서 엔터를 입력하면 IBOutlet으로 완성됩니다. 프레임워크 와 사용자가 정의한 변수, 함수, 상수등의 모든 입력에서 적용됩니다.

사용자 삽입 이미지
메소드에서도 인자의 정보를 알 수 있어 편리합니다. 얼마 사용하지 않았지만 일반적으로 팝업을 뛰우는 방식과 비교해서 매우 빠르고 편리한 것 같습니다.
 
2) 블럭
* Focus ribbon

사용자 삽입 이미지
또 하나 재미있는 기능은 구역별로 범위를 확인하거나 감출 수 있다는 것입니다. 이런 기능을 가진 툴들은 보았지만 시각적인 효과에 있어서는  Xcode가 가장 인상적인 것 같습니다.

새로 추가된 좌측의 회색 바(Focus ribbon)를 보면 내부로 구역이 중첩될 수록 진하게 표시됩니다. 저 범위에 마우스를 가져가면 범위를 확인하거나 출력되는 삼각형 모양의 아이콘을 클릭하여 해당 범위를 감출 수 있습니다.


* Code folding
사용자 삽입 이미지
가장 바깥쪽의 @implementation 구역에 마우스 커서를 가져가면 좌측과 같이 해당 구역만 하이라이트되어서 보여집니다.

상하로 삼각형 모양의 아이콘이 범위의 시작과 끝을 알려 줍니다. 이 아이콘을 클릭하면 아래와 같이 @implementsion 내의 내용이 생략되어 보여집니다.






사용자 삽입 이미지
[''']가 구역내의 내용이 생략되었다는 표시입니다. 좌측의 삼각형을 클릭하면 다시 위와 같이 펼쳐집니다.

아래의 이미지들을 확대해서 위의 이미지와 비교해서 보시면 이 기능과 화면효과에 대해서 짐작이 가실 것입니다.
사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

사용자 삽입 이미지
또하나 입력시에 (), [], {}가 끝나는 부분에서 대응되는 시작위치를 알려 주는 기능이 좀 더 시각적으로 변경되었습니다.

4) Message bubbles
이제 빌드를 해보겠습니다. 아래가 빌드 후에 결과 화면입니다.

사용자 삽입 이미지

오류와 경고 메시지가 아주 이쁜(?) 모양으로 강조되어 출력됩니다. 첫번째 오류는 k++ 다음에 ';'를 생략해서이고, 그 아래의 경고는 헤더 파일에서 setLabelText의 선언을 구현과 다르게 해놓았기 때문에 출력되었습니다. 물론 이전과 같이 별도의 결과창도 존재합니다.

5) 스냅샷
스냅샷은 소스내의 변경사항을 간편하게 저장하고 복구할 수 있는 간편한 방법입니다. 소스를 변경하고 Control+Command+s 또는 메뉴에서 File/Make Snapshot을 클릭하면 현재의 상태가 저장됩니다.

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    IBOutlet NSTextField *inputText;
}

@end

AppController.h에서 위의 상태에서 스냅샷을 설정하고 다시 "- (IBAction)setLabelText:(id)sender;" 선언을 추가한 후에 다시 스냅샷을 설정합니다. 이제 File메뉴 밑의 Snapshot을 실행합니다.
사용자 삽입 이미지
위와 같이 처음 설정한 곳과 다음 설정한 곳의 차이점을 diff와 같이 보여 줍니다. 툴바의 'Restore' 버튼을 클릭하면 이전 상태로 복구됩니다. 이와 같이 CVS나 SVN을 사용하지 않는 혼자서 진행하는 간단한 프로젝트에 사용하거나 저장소와 병행하여 간편하게 사용할 수 있습니다.

6) 리펙토링
클래스나 변수, 함수의 이름을 변경하고 슈퍼클래스를 생성하고 메소드를 상위 클래스 또는 하위 클래스로 이동하는 작업을 편리하게 관리할 수 있습니다. 변경된 사항은 관련된 소스와 파일에 자동으로 반영됩니다.

사용방법은 변경할 아이템을 선택한 후에 Shift + command + j 또는 메뉴의 Edit에서 Refactor...를 선택하면 실행됩니다. 

* Rename
AppController 클래스의 이름을 변경해 보겠습니다. 선택사항을 확인한 후에 입력창에 변경될 이름을 입력합니다. Snapshot에 체크를 하면 변경된 내역이 스냅샷에 저장이 됩니다. 저는 아래와 같이 'MyAppController'로 입력하였습니다. 변경될 이름을 입력했으면 [Preview] 버튼을 클릭합니다.
사용자 삽입 이미지
하단에 변경될 파일들과 항목의 수를 알려 줍니다.
사용자 삽입 이미지
파일의 클릭하면 해당 파일에서 변경될 내역들을 이전 내용과 비교하여 확인할 수 있습니다. 이상이 없으면 Apply 버튼을 클릭하여 적용합니다.
사용자 삽입 이미지
Xcode에서 파일이름이 'MyAppController.*'로 변경되고 각 소스에 해당 내용이 변경되었음을 확인할 수 있습니다.

사용자 삽입 이미지

* Extract
선택된 내용을 새로 메소드나 함수를 생성하여 추가하여 줍니다. 'abc = newValue;'에 적용하면 아래와 같이 소스 코드가 변경됩니다. (사용방법은 Rename과 거의 유사하기 때문에 생략합니다)

변경전
- (void) setAbc: (int) newValue {
  abc = newValue;
}

 Extract 적용 후
- (void) extracted_method: (int) newValue  {
  abc = newValue;

}
- (void) setAbc: (int) newValue {
  [self extracted_method: newValue];
}

* Encapsulate
클래스 맴버 변수의 setter/getter를 자동으로 생성하여 줍니다. 'int abc;'로 멤버변수를 만들고 Encapsulate를 실행하면 헤더파일과 소스파일에 아래의 내용이 자동으로 추가됩니다.

*.h
- (int) abc;
- (void) setAbc: (int) newValue;

*.m
- (int) abc {
  return abc;
}

- (void) setAbc: (int) newValue {
  abc = newValue;
}

* Create Superclass
해당 클래스의 슈퍼클래스를 생성합니다.

* Move Up
선택된 변수와 메소드를 상위 클래스로 이동합니다.

* Move Down
선택된 변수와 메소드를 하위 클래스로 이동합니다.

* Modernize Loop
아래와 같이 반복문에 적용하면 Objective-C 2.0에 추가된 문법으로 변경하여 줍니다.
while ((item = [enumerator nextObject]) != nil) => while (item in itemArray)

Xcode 3에서 코딩은 아직 해보지 못했지만 몇 번 실행은 시켜 보았습니다. 인터페이스 빌더만 조금 변경된 것 같고 Xcode는 Objective-C 2.0외에는 그다지 변경된 내용이 없는 줄 았았습니다. 하지만 잠시 사용해 보았지만 구석구석 편리한 기능들이 많이 추가되고 개선된 것 같습니다. 다른 개발툴에도 있는 기능들이지만 사용하기 편리하고 보기 좋게 잘 만들어 놓은 것 같습니다.

용어도 잘 모르겠고 제 손에 걸린 것들만 언급을 해서 내용이 매우 부실하니, 시작시에 언급한 문서들에서 확인하시기 바랍니다. 몇 달 더 사용해 보고 '둘러보기'가 아닌 제목으로 다시 한번 포스팅 해보겠습니다.
신고

Xcode는 맥 OS X 어플리케이션과 아이폰용 어플리케이션을 개발할 수 있는 애플에서 무료로 제공되는 통합개발환경(IDE)입니다. Xcode 3는 Max OS X 10.5(레오퍼드) 이상에서만 사용할 수 있습니다.

Xcode는 OS X 설치 CD에 포함되어 있지만 ADC(Apple Developer Connection)에서 최신버젼을 다운로드 받으셔서 설치하는 것이 좋습니다.

1. ADC 회원 가입

사용자 삽입 이미지
ADC에서 Xcode등의 개발툴을 다운로드 받기 위해서는 ADC 회원에 먼저 가입을 해야 합니다. 유료회원에게는 더 많은 서비스와 지원이 제공되지만 무료 온라인 회원으로 가입을 해도 개발툴을 다운로드 받고 관련 문서와 샘플코드를 사용할 수 있습니다

아래는 한국 애플 스토어의 ADC 페이지에서 가져온 각 회원별 가격 및 지원내용입니다.

* ADC Premier 회원- 3,499달러 (364만원)
  • 월드와이드 개발자 컨퍼런스 티켓
  • ADC Software Seeding 프로그램
  • Mac OS X 및 Xcode 도구
  • 8가지 기술 지원
  • 10가지 ADC 하드웨어 할인
  • ADC Compatibility Labs 액세스
  • ADC Monthly Mailing/Download
  • ADC 비즈니스 및 마케팅 프로그램

* ADC Select 회원 - 499달러 (52만원)
  • ADC Software Seeding 프로그램
  • Mac OS X 및 Xcode 도구
  • 2가지 기술 지원
  • 1가지 ADC 하드웨어 할인
  • ADC Compatibility Labs 액세스
  • ADC Monthly Mailing/Download
  • ADC 비즈니스 및 마케팅 프로그램

* ADC Online 회원 - 무료
  • OS X 개발툴 다운로드
  • ADC의 개발 문서 및 샘플코드 다운로드

이외에 학생, 월간 메일링, 기술지원등의 제품이 더 있습니다. 유료 멤버쉽의 유효기간은 1년이며 1년마다 갱신을 해야 합니다. 자세한 정보는 ADC 제품 한국어 사이트에서 확인하세요.


2. 다운로드

가입이 완료되면 Xcode 다운로드 페이지에서 'Download Now' 버튼을 클릭하여 아이디, 패스워드를 입력하고 로그인 후에 Xcode를 다운로드 받습니다. 설치 파일 크기는 1GB 입니다.

사용자 삽입 이미지

현재(2008년 7월) 버젼은 2008년 7월 11일 등록된 3.1 버젼 입니다.


3. 설치
다운로드가 완료되면 Xcode*.dmg 파일을 마운트 한 후에 XcodeTools.mpkg를 실행합니다. 설치화면에서 약관에 동의를 하고 진행하면 아래와 같은 선택사항이 나옵니다.

사용자 삽입 이미지

기본으로 처음 세개의 패키지는 선택되어 있습니다. 그 아래의 체크되지 않은 'Mac OS X 10.3.9 Support'를 선택하면 OS X 10.3(팬서)를 지원하는 SDK와 GCC 3.3를 설치합니다. OS X 10.4(타이거) SDK는 기본으로 포함되어 있습니다. WebObjects를 선택하면 웹서버에서 실행되는 웹어플리케이션인 WebObjects를 지원하는 Java로 된 라이브러리와 툴등의 실행 환경을 설치합니다. 일반적으로 기본 선택사항대로 설치를 하면 무난할 것 같습니다.

사용자 삽입 이미지
완료되면 /Developer/에 관련된 파일과 디렉토리들이 설치됩니다. 그 아래의  Applications 디렉토리에서 Xcode 아이콘을 더블클릭하면 Xcode가 실행됩니다. 이 디렉토리에서 Interface Builder, Dashcode(버젼 2.0), Instruments등 Xcode의 중요 어플리케이션들을 찾을 수 있습니다.
 
사용자 삽입 이미지
사용자 삽입 이미지
자주 쓰는 개발에 관련된 어플리케이션들은 레오퍼드의 스택을 이용하여 독에 등록하면 빠르고 편리하게 사용할 수 있습니다.

적당한 위치에 개발툴이라는 디렉토리를 만들고 필요한 실행파일들의 가상본을 만들어서 해당 디렉토리로 옮겨 놓습니다. 그런 후에 개발툴 디렉토리를 독의 스택 위치로 드래그해서 가져다 놓습니다.







4. iPhone SDK 설치
사용자 삽입 이미지
iPhone 어플리케이션 개발을 위해서는 iPhone SDK를 설치해야 합니다. ADC의 다운로드 페이지에서 다운로드 받으실 수 있습니다. 파일 크기는 1.2GB이며 현재 버젼은 베타 8 (빌드넘버: 9M2199a)입니다.

다운로드가 완료되면 받은 dmg 파일을 더블클릭하고 iPhone SDK를 실행하여 설치하시면 됩니다. 설치가 완료된 후에 Xcode를 실행하고 New Project를 클릭하면 아래와 같이 iPhone OS 개발 환경이 추가되어 있는 것을 확인할 수 있습니다.

사용자 삽입 이미지

App Store에서 iPhone용 어플리케이션을 배포 또는 판매 하기 위해서는 애플의 iPhone Developer Program에 가입을 해야 합니다. Standard Programe은 99달러 Enterprise Program은 299달러 입니다. ADC 멤버쉽과 마찬가지로 역시 1년마다 갱신을 해야 합니다.

등록하면 아래와 같이 제작한 게임을 App Store에 등록하고 판매할 수 있으며, 판매되면 금액의 70%를 받습니다. 애플의 광고대로 신용카드 수수료를 따로 청구하지 않고 App Store를 통해 광고와 안정적인 호스팅을 제공하니 등록비용과 수수료가 그렇게 비싸다는 생각은 들지 않습니다. 

사용자 삽입 이미지

iPhone Developer Program에 자세한 내용은 ADC의 해당 페이지에서 확인하세요.
신고

iOS 2008.05.26 14:05
사용자 삽입 이미지
어제 iPhone SDK를 다운로드 받고 설치를 해보았습니다. SDK는 애플의 다운로드 페이지에서 받으실 수 있습니다. 실행환경은 OS X 10.5.2 이상의 인텔맥에서만 사용할 수 있습니다. 최신 버젼은 2008년 5월 8일에 올라 왔으며 파일크기가 1GB가 조금 넘었습니다.

 Xcode 3과 레오퍼드의 개발툴들을 잘 몰라서 설치 후 무엇이 추가되고 변경되었는지는 잘 모르겠습니다. 다만 Xcode와 Dashcode에서 차이점을 발견할 수 있었습니다.

1. Xcode
그러고 보니 아직 Xcode 3에서 한번도 New Project를 실행해 본적이 없었습니다. 그렇지만 아래의 iPhone OS란 메뉴가 SDK 설치로 새로 생겼을 것으로 짐작은 됩니다.

사용자 삽입 이미지

이름을 보니까 아이폰 SDK에서 사용하는 Cocoa는 'Cocoa Touch'로 부르는 것 같습니다. 일단 'Cocoa Touch Application'을 선택하고 프로젝트를 만들어 보았습니다.

사용자 삽입 이미지
프로젝트 명을 'iPhoneSDK'로 하였더니 좌측과 같은 파일들이 기본적으로 생성되었습니다.
 
기존 Cocoa 프로젝트에서 볼 수 있었던 파일들도 보이고 iPhoneSDKAppDelegate 클래스와 MainWindow.xib와 몇개의 프레임워크등 새로 추가된 부분들도 보입니다.

NIB Files가 비어 있어 순간 인터페이스빌더를 지원하지 않는가 생각했는데 MainWindow.xib를 더블클릭하니 인터페이스 빌더를 볼 수 있었습니다. nib의 n이 NeXTSTEP을 의미하는 것으로 알고 있는데 xib의 x가 OS X를 의미하는지는 모르겠습니다. (나중에 OS X 어플리케이션으로 만들어 봐도 nib 파일 대신 xib가 생겼습니다. 이 부분은 Xcode 3에서 변경된 것 같습니다.)

사용자 삽입 이미지
   
우측에 생략된 전체 이름은 'I PhoneSDK App Delegate' 입니다. 

사용자 삽입 이미지
라이브러리 팔레트에서는 좌측과 같이 사용할 수 있는 오브젝트나 컨트롤들의 목록이 있습니다. 이전에 아이폰의 사진에서 보았던 버튼이나 UI들도 보입니다.

몇개 끌고 와서 윈도우에 배치를 해 보았습니다. 실제 구현은 아직 모르기 때문에 무조건 빌드를 하고 실행을 해 보았습니다.





사용자 삽입 이미지
특이하게 애플은 일반적으로 사용하는 에뮬레이터가 아니라 시뮬레이터라고 이름을 붙였습니다. 아이폰 시뮬레이터를 살펴 보는데 아직 베타 버젼이라 그런지 제가 잘 못 해서 그런지 실행된 어플리케이션의 입력란에 포커스가 갈 경우에는 시뮬레이터가 다운되었습니다. 


아래의  좌측은 인터페이스 빌더에서 작업한 모습이고 우측은 빌드 후에 아이폰 시뮬레이터에서 실행된 모습니다.

사용자 삽입 이미지

자동으로 생성된 코드들은 아래와 같습니다. main에 추가 된것은 UIApplicationMain에 대한 호출입니다. 실제 작업은 그 이름과 같이 AppDelegate 클래스에서 수행해야 하는 것 같습니다. 아마 UIKit이 아이폰의 핵심 프래임워크 같습니다.

main.m
#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {
   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

iPhoneSDKAppDelegate.h
#import <UIKit/UIKit.h>

@interface iPhoneSDKAppDelegate : NSObject <UIApplicationDelegate> {
    IBOutlet UIWindow *window;
}

@property (nonatomic, retain) UIWindow *window;

@end

iPhoneSDKAppDelegate.m
#import "iPhoneSDKAppDelegate.h"

@implementation iPhoneSDKAppDelegate
@synthesize window;

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
    // Override point for customization after app launch
}

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

@end


2. Dashcode
혹시나 하는 마음에 Dashcode도 실행해 보았습니다. 아래와 같이 New Project에서 Web Application이란 추가된 항목이 있었습니다.

사용자 삽입 이미지

이전 포스팅에서 한번 보았던 RSS를 선택하고 새 프로젝트를 만들었습니다. 이전과 동일하게 속성의 Feed URL에 올블로그 주소만 입력하고 실행해 보았습니다. 아래와 같이 시뮬레이터가 실행되었습니다.

사용자 삽입 이미지
아마 Dashcode로 만든 어플리케이션은 사파리내에서 실행되는 거 같습니다. 웹어플리케이션이니까 당연히 웹플랫폼에서 실행되겠지만 주소창이나 브라우져의 UI들은 안 보여 줄 것으로 생각했는데 아닌 것 같습니다.

아직 Xcode 3도 모르고 간만 본 상태에서 조금 이른 생각 같지만 iPhone에서의 개발은 기존의 다른 모바일 플랫폼 보다 쉬운 것 같습니다. 신경써야 될 폰이 아이폰 딱 하나인 것도 개발자 입장에선 편할 것 같고요. 개발자료들도 ADC에 충분한 것 같으니 많은 어플리케이션들이 나올 것 같습니다.
SDK와 툴들을 대충 둘러 보면서 느낀 첫번째 생각은 우리나라에 나오기만 하면 꼭 아이폰을 사야 겠다는 것이었습니다. 비록 에뮬 환경에서 일부분만 본 아이폰이지만 화면과 UI가 환상이었습니다. 에뮬레이터로 핸드폰 뽐뿌 받기는 처음이었습니다.
신고

기타 2008.03.26 15:03
유튜브에서 본 Xcode 3로 계산기를 만드는 동영상입니다. (요즘 이렇게 눈요기만으로 레퍼드로 업그레이드를 참고 있습니다) 아직 완성된 것은 아니고 2부까지만 나온 것 같습니다.

보면서 두가지 생각이 들었습니다. 첫번째는 'Xcode 3을 써보고 싶다' 입니다. 두번째는 multiply, divide 타이핑을 하는데 오늘 오전에 본 댓글 때문에 뜨끔하더군요. ^^;

* Building a Cocoa Calculator Application with XCode 3 for Mac


* Building a Cocoa Calculator App Using XCode 3 (Part 2)
신고

사용자 삽입 이미지
샤크는 프로그램의 성능 측정 도구(프로파일러)입니다. 성능 튜닝은 사냥꾼의 동물적인 감각이 필요하고 상어가 먹이를 추적하는데 가장 앞선 동물이라 샤크라는 이름을 지었다고 합니다.

벌레들을 잡아 먹는 사마귀(mantis)로 이름을 지은 버그 추적 시스템처럼 상어(shark)도 재미있는 이름 같습니다.



0. 준비
실행은 /Developer/Applications/Performans Tools/Shark를 클릭하거나, Xcode의 Debug 메뉴에서 Lauch Using Performans Tool에서 Shark를 클릭하여 실행 합니다.

만약 해당 디렉토리에 Shark가 없다면 Xcode 설치시 CHUD Tools를 선택하지 않았기 때문입니다. Xcode 설치 파일을 이용해서 Shark를 설치하면 됩니다.

1. 테스트 코드 작성

테스트를 위해서 Xcode에서 아래와 같은 샘플코드를 작성합니다.

#import <Foundation/Foundation.h>

@interface Musik1 : NSObject {
}
@end
@implementation Musik1
-(void) run {
    int i, n;
    for (i = 0; i < 100; i++) {
        n = i * i;   
    }
}
@end

@interface Musik2 : NSObject {
}
@end
@implementation Musik2

 - (void) run {
    int i, n;
    for (i = 0; i < 1000; i++) {
        n = i * i;   
    }
}
@end

void Run()
{
    int i;
       
    for(i = 0; i < 10000; i++) {
        Musik1 *musik1 = [[Musik1 alloc] init];
        Musik2 *musik2 = [[Musik2 alloc] init];
       
        [musik1 run];
        [musik2 run];
   
        [musik1 release];
        [musik2 release];
    }
}

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

    // insert code here...
    Run();
   
    [pool release];
   
    return 0;
}

무식하게 돌아가는 코드를 작성해 보자 하고 생각없이 이름을 지었는데, 그냥 변경없이 포스팅에 사용하기로 했습니다. 나중에 다른 툴에서도 예제로 사용하기 위해 클래스를 두개 만들고 메모리를 할당하고 해제하는 코드를 넣었습니다.

소스는 10000번 돌면서 Musik1과 Musik2를 생성 해제 하면서 각각의 run 메소드가 실행됩니다. Musik1의 run 메소드는 다시 100번 돌고 Musik2는 더 무식해서 1000번 돌도록 하였습니다.

2. Shark 실행
이제 빌드를 하고 Xcode의 Debug 메뉴에서 Lauch Using Performans Tool/Shark를 클릭합니다. 아래와 같이 Shark가 실행된 모습을 보실 수 있습니다.

사용자 삽입 이미지

샤크에서 좌측의 Start 버튼을 클릭합니다. 아래와 같은 창이 뜨면 원하시는 옵션을 선택한 후 [OK]를 클릭합니다.

사용자 삽입 이미지

이제 프로그램이 런칭되어 분석을 시작합니다. 30초 내에 프로그램이 종료하지 않으면 자동으로 종료하고 분석된 결과를 보여줍니다. Config 메뉴에서 View Mini Config Editor를 선택하시면 실행 전에 제한시간과 다른 샘플링 옵션을 변경하실 수 있습니다.

사용자 삽입 이미지
재밌는 것은 분석중에는 아이콘에서 상어의 모습이 붉은 색으로 변합니다. 맹렬히 먹이감을 쫓고 있는 것 같습니다. 무섭습니다.


3. 샘플링 데이터 확인
1) 프로파일 브라우져
완료되면 아래와 같이 분석된 결과를 보여 줍니다. 우측 하단의 View 항목에서 표현 방식을 변경할 수 있습니다. Heavy는 항목별로 Tree는 말 그대로 트리 구조로 결과를 보여 줍니다. 아래의 이미지를 보시면 둘의 차이점을 확인하실 수 있습니다. 각 컬럼은 아래와 같습니다.

  • self - 행당 항목의 비율
  • Total - 하위 항목을 모두 포함한 전체 비율
  • Library - Symbol이 포함된 라이브러리
  • Symbol  - 심볼 (함수명)

사용자 삽입 이미지

위를 보시면 실행시간의 64.1%를 차지하는 [Musik2 run]을 중점적으로 점검해야 됨을 알 수 있습니다. [Musik2 run] 항목을 더블클릭하면 아래와 같이 해당 소스가 오픈됩니다. 우측 상단의 버튼들을 클릭하면 원본 소스, 어셈블리 또는 같이 볼수 있습니다.
 
2) 소스코드 브라우져
사용자 삽입 이미지

코드에서 직접 부하를 확인할 수 있습니다. [i] 아이콘이 있는 곳은 해당 코드에 대한 도움말이 있습니다. 아이콘을 클릭하면 전체 내용을 볼 수 있습니다. 아래는 Both 버튼을 클릭하여 원본 소스와 어셈블리를 같이 보여 주는 모습니다.

사용자 삽입 이미지

run 함수에서 'n=i * i(진한 갈색 부분)'에서 실행속도의 64.2%를 소비하고, 나머지 for 루프를 위한 'i++, i < 1000(연한 갈색)'에서 나머지를 소비하고 있는 것을 알 수 있습니다.

좌측의 'n = i * i' 에 해당되는PPC 어셈블리 코드를 간단히 살펴 보겠습니다. (우측 하단의 [Asm Help]를 클릭하시면 어셈블리 명령어 셋에 관한 간단한 설명을 보실 수 있습니다)

lwz r2, 28(r30) // 28(r30)의 메모리 값(i)을 r2 레지스터로 불러 옵니다.
lwz r0, 28(r30) // 28(r30)의 메모리 값(i)을 r0 레지스터로 불러 옵니다.
mullw r0,r2,r0 // r2, r0을 곱한 값을 다시 r0에 저장합니다.
stw r0, 24(r30) // 레지스터 r0의 값을 28(r30)의 메모리(n)에 저장합니다.

위는 제 PPC의 어셈블리 모습이며 인텔맥에서는 아래와 같습니다.
 
L3:
    .stabd    68,0,8
    movl    -16(%ebp), %eax
    imull    -16(%ebp), %eax
    movl    %eax, -12(%ebp)
    .stabd    68,0,7
    leal    -16(%ebp), %eax
    addl    $1, (%eax)
L2:
    cmpl    $99, -16(%ebp)

4) Chart 뷰
이제 Chart를 클릭하여 함수의 호출 경로가 기록되어 있는 call stack을 확인해 보겠습니다. Chart에서는 1ms마다 call stack을 기록한 내용을 그래프와 목록으로 확인할 수 있습니다. 그래프 또는 목록을 클릭하면 좌측에서 해당 시간의 call stack의 내용을 확인할 수 있습니다.
사용자 삽입 이미지

"우선 여기서 알수 있는 것은 제 맥이 엄청 느리다는 것입니다. 대부분의 맥에선 아래의 샘플링 시간이 보시는 것 보다 적게 나올 것입니다. 혹시 사용하는 맥이 너무 빨라 Shark가 붉게 변하는 모습을 못 보셨으면 반복 횟수를 늘리거나 다른 코드를 넣어 무식이의 run을 더 무식하게 만드시면 됩니다."

초기에 스택이 큰 것은 기동 시 초기화 루틴에서 부르는 것들입니다. 전체적으로 5로 나타나는 것은 대부분의 로드가 [Musik1(또는 2) run]일어 나기 때문에 위이미지의 좌측에서 보시는 것 처럼 start > _start > main > Run > [Musik1(또는 2) run]의 5단계이기 때문입니다.

우측 하단 View에서 CPU를 선택할 수 있는데 저는 PPC라 1개가 나오지만 인텔 코어듀오가 장착된 맥에선 2개의 CPU가 나올 것입니다.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Shark에서는 샘플링된 데이터를 파일로 저장할 수 있습니다. 현재 데이터를 저장하고 최적화를 수행하고 다시 Shark를 실행하여 이전 데이터와 비교해보며 최적화의 결과를 확인할 수 있습니다.

Shark에 대한 자세한 내용은 ADCShark User Guide 를 참조하시고, Shark 이외에 /Developer/Applications/Performans Tools/ 디렉토리에서 유용한 다른 툴들도 확인하실 수 있습니다.
신고

Xcode에서 생성해 주는 소스파일 상단의 주석을 보면 아래와 같이 __MyCompanyName__.로 되어 있는 부분이 있습니다.

사용자 삽입 이미지

터미널에서 아래와 같이 입력하시면 __MyCompanyName__을 변경하실 수 있습니다. 아래는 "cocoadev.co.kr"로 변경하는 예입니다.

> defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions -dict ORGANIZATIONNAME "cocoadev.co.kr"
또는
> defaults write com.apple.xcode PBXCustomTemplateMacroDefinitions '{ORGANIZATIONNAME = "cocoadev.co.kr" ; }'

이제 Xcode에서 소스 파일을 생성하면 아래와 같이 주석 부분이 변경되어 있습니다.

사용자 삽입 이미지

Xcode 2.5에서만 테스트 해보았고 3.X 버젼에서는 확인을 하지 못하였습니다.
신고

유닉스 계열에서는 실제 파일뿐만 아니라 소켓, 파이프, 장치등 모든 것을 파일로 간주하고 관리합니다. (pipe에서의 사용예는 제 블로그의 pipe를 이용한 간단한 프로세스간의 통신에서 확인하실 수 있습니다.)

NSFileHandle은 코코아 파운데이션 프레임워크에 포함된 저수준의 File Descriptor와  그와 관련된 open, close, read, write등의 관련된 함수들의 래퍼 클래스입니다.

코코아에서는 겍체의 아카이브를 지원하고 xml등 데이터 타입에 따라 파일이나 URL로 부터 편리하게 읽고 쓸 수 있게 하는 클래스들이 있기 때문에, 일반적인 파일에 관련된 작업에서는 NSFileHandle을 사용하여 직접 파일을 제어할 경우는 그다지 많지 않습니다.

NSFileHandle은 데이터를 읽고 쓰는데 1바이트 바이너리로 데이터를 저장하는 NSData를 사용합니다. NSData는 많은 클래스들에서 용도에 맞게 변경하는 초기화 메소드를 제공하므로 필요에 따라 사용하시면 됩니다.

1. 파일에서 텍스트 읽기
기존에 존재하는 test.txt 텍스트 파일을 읽어 출력하는 간단한 예입니다.

* 파일 핸들러 얻기  
fileHandleForReadingAtPath로 읽기전용으로 파일을 오픈합니다. 실패시에는 nil을 반환합니다.

* 파일읽기
readDataToEndOfFile로 파일의 전체를 읽어 오고 readDataOfLength로 특정 크기만큼 읽어 올 수 있습니다.

* 파일닫기
사용을 완료하였을 경우에는 closeFile을 이용해서 열려 있는 파일을 닫습니다.

NSFileHandle *readFile;

readFile = [NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
if(readFile == nil)
{
    NSLog(@"fail to read file");
    return 1;
}
   
NSData *data = [readFile readDataToEndOfFile];
NSString* text = [[NSString alloc] initWithData: data
                                                        encoding: NSUTF8StringEncoding];
NSLog(@"%@", text);

[text release];
[readFile closeFile];

2. 파일에 텍스트 쓰기
new.txt 텍스트 파일을 만들어 "new text..."란 텍스트를 입력하는 예입니다.

* 파일 생성
[[NSFileManager defaultManager] createFileAtPath:@"new.txt"
    contents: data attributes:nil];

두번째 인자인 contents에 data를 지정하여 data의 내용으로 파일이 생성됩니다. 빈 파일 생성시에는 nil로 설정합니다. 생성 후에 [writeFile writeData: data] 메소드를 이용하여 파일에 입력할 수 있습니다. NSFileManager에 관해서는 다음 포스팅에서 자세히 설명하겠습니다.

* NSFileHandle없이 파일 제어
[NSData dataWithContentsOfFile:@"new.txt"]

NSFileHandle을 거치지 않고 NSData에서 바로 파일을 읽어 올 수 있습니다. 반대로 저장도 가능합니다. 위에 언급한 것과 같이 클래스들이 파일에 관련된 메소드를 가지고 있습니다. NString도 NSData를 거치지 않고 아래와 같이 텍스트 파일에서 내용을 바로 읽어 올 수 있습니다.

NSString* readText =[NSString stringWithContentsOfFile:@"new.txt"
            encoding:NSUTF8StringEncoding error:NULL];

NSString* text = @"new text...";
NSFileHandle *writeFile;
NSData *data = [NSData dataWithBytes:[text cString]
    length:[text cStringLength]];   

[[NSFileManager defaultManager] createFileAtPath:@"new.txt"
    contents: data attributes:nil];

writeFile = [NSFileHandle fileHandleForWritingAtPath:@"new.txt"];
if(writeFile == nil)
{
    NSLog(@"fail to open file");
    return 1;
}
   
[writeFile closeFile];

/** 기록된 파일 확인 */
NSData* readData = [NSData dataWithContentsOfFile:@"new.txt"];
NSString* readText = [[NSString alloc] initWithData: readData
    encoding: NSUTF8StringEncoding];

NSLog(@"READ: %@", readText);

3. 기존 파일 변경
파일 포인터(offset) 이동
seekToFileOffset은 C에서 fseek, lseek와 같이 파일의 특정위치로 이동하게 해줍니다. 아래에 사용된 [writeFile seekToFileOffset: 2]는 파일 포인터를 두번째 바이트에 위치시키며 이후로 writeData로 기록할 때는 두번째 바이트 뒤로부터 파일에 쓰여집니다. 이와 유사하게 seekToEndOfFile는 파일의 마지막으로 파일포인터를 이동합니다.

아래는 위에서 생성한 new.txt 파일의 세번째 바이트 위치부터 test.txt 파일의 내용을 추가하는 예입니다.
NSFileHandle *readFile;
NSFileHandle *writeFile;

readFile = [NSFileHandle fileHandleForReadingAtPath:@"test.txt"];
if(readFile == nil)
{
    NSLog(@"fail to read file");
    return 1;
}

writeFile = [NSFileHandle fileHandleForWritingAtPath:@"new.txt"];
if(writeFile == nil)
{
    NSLog(@"fail to open file");
    return 1;
}

NSData *data = [readFile readDataToEndOfFile];

[writeFile seekToFileOffset: 2];
[writeFile writeData: data];

[readFile closeFile];
[writeFile closeFile];
신고