2ndweek introduction to iphone...
TRANSCRIPT
Introduction to iPhone OS사운드 콘텐츠 응용_2주차
Dept. of Multimedia Science, Sookmyung Women’s University. Prof. JongWoo Lee
Index
• iPhone SDK
- Xcode 시작하기
- Interface Builder 시작하기
- 사용자와 상호작용하기
• Objective-C
Dept. of Multimedia Science, Sookmyung Women’s University. Prof. JongWoo Lee
iPhone SDK
iPhone OS
• iPhone OS의 구조
- Core OS
✓ Free BSD 기반의 UNIX 운영체제를 기반
- Core Services
✓ Core Foundation :파일 엑세스, 네트워크 소켓, 런루프에 대한 접근 제공
✓ Core Data: 데이터 베이스 엔진, SQLite형식으로 데이터를 저장✓ Address Book: 사용자의 주소록에 접근할 수 있는 API
- Media
✓ Quarts : Core Graphics, OPenGL ES, Quartz Core 가 포함✓ Core Audio: Audio Toolbox, Audio Unit, AVFoundation, OpenAL
✓ Media Player
- Cocoa Touch
✓ user application 개발에 있어 기반이 되는 기술✓ UIKit framework는 화면 표시를 담당하는 View 객체, 버튼, 슬라이더 같은 control들로 구성
iPhone 개발환경
- iPhone SDK
- Xcode
애플이 제공하는 통합 개발환경(IDE, Integrated Development Environment)
- Interface Builder
사용자 인터페이스를 디자인하는 툴
- iPhone Simulator
• 개발에 필요한 도구
iPhone SDK(1/2)
• iPhone SDK 설치
- 아이폰 개발자 웹 페이지 주소: http://developer.apple.com/iphone/ (계정생성필수)
- iOS 4.0으로 업그레이드 되면서 이전버전을 모두 포함한 Xcode 3.2.3버전과 iPhone SDK 4를 함께 다운받을 수 있음
- DMG 파일은 맥 OS에서 실제 디스크 이미지(MS 윈도우에서 ISO파일)
iPhone SDK(2/2)
• iPhone SDK 설치
- Xcode and iPhone SDK for Snow Leopard 클릭
- 진행단계에 따라 설치
- SDK는 기본값으로 /Developer 위치에 설치됨
- 설치된 Xcode는 /Developer/Application에 위치
클릭!
Hello World를 띄워보자!
Xcode 시작하기Hello World를 띄워보자!
Xcode 시작하기
Xcode 실행하기• Xcode 실행
- /Developer/Application에 위치
- 아래의 Dock에서 finder클릭
- Macintosh HD/Developer/Applications/Xcode 클릭
- 실행 후, 바탕화면 아래의 Dock에 Xcode아이콘이 추가됨
Xcode - 프로젝트 생성(1/2)
• 새로운 프로젝트 생성
- File메뉴의 [New Project...]선택
가장 간단한 템플릿인
View-based Application을 선택
• 새로운 프로젝트 생성
- 프로젝트 이름으로 Hello World를 입력하고 원하는 폴더에 저장
Xcode - 프로젝트 생성(2/2)
• Xcode에서의 Hello World 프로젝트 기본 윈도우
Xcode - 기본 윈도우
Groups & files 창
프로젝트 관련 설정과 프로젝트를 구성하는 자원이 이곳으로 분류
클릭하면 숨겨진 하위 항목들이 나타남
Detail View 창
Groups & files창에서 선택한 세부정보를 보여 줌
편집창
어플리케이션의 소스코드를 작성하고 수정하는 곳
Xcode - Groups & Files 창
Classes
OtherSources
Resources
작성한 코드가 들어가는 곳
Objective-C 클래스가 아닌 소스코드를 담는 곳프로젝트명_Prefix.pch : 헤더들을 미리 컴파일, 프로젝트를 컴파일하는 데 드는 시간을 줄이기 위함main.m : main()함수가 있는 곳, 자동으로 생성되며 수정할 필요 없음
아이콘 이미지, 소리, 동영상 파일 등
Framework
MainWindow.xib : 기본 인터페이스 빌더 파일프로젝트명ViewController.xib : 인터페이스 빌더에서 사용하는 정보를 담고 있음Info.plist : 어플리케이션의 정보를 담는 Property list
코드는 물론 이미지나 소리 파일들과 같은 자원들이 담긴 특별한 종류의 라이브러리이 폴더에 추가된 프레임워크는 어플리케이션에 링크되고, 코드에서 객체, 함수, 자원을 사용할 수 있음
• Xcode에서의 Groups & Files 창
• 글씨나 버튼을 코딩을 통해 만들 수 있지만 iPhone 에서는 사용자 인터페이스 디자인을 위한 특별한 툴이 있다.
• Hello world를 띄우기 위해 이제 Interface Builder로 이동해 보자!
Hello_WorldViewController.xib를
더블클릭!
Hello World를 띄워보자!
Interface Builder 시작하기Hello World를 띄워보자!
Interface Builder 시작하기
• Hello_WorldViewController.xib를 더블클릭 후 첫 화면
Interface Builder 기본 윈도우
main 창 Inspector 창
다양한 사용자 인터페이스 요소들을 세팅을 조회하고 수정
Library 창
사용자 인터페이스 창에 드래그될 사용자 인터페이스(라이브러리) 컴포넌트들의 목록
View 창
사용자 레이아웃을 꾸미는 공간
• Hello_WorldViewController.xib창 - nib파일의 메인 창
- 모든 nib파일은 File’s Owner와 First Responder라는 두 개의 아이콘으로 시작, 자동으로 생기며 지우지 못함
- File’s Owner
• 어느 nib파일에서든 첫 번째 아이콘• 디스크에서 로드된 nib 파일 객체를 나타냄
- First Responder
• 사용자가 현재 상호작용하는 객체• 예를 들어, 사용자가 현재 텍스트 필드에 데이터를 입력하는 중이라면 해당 텍스트 필드가 현재의 first responder
• 이는 사용자가 인터페이스와 상호작용할 때마다 바뀌기 때문에 현재 어떤 컨트롤이나 뷰가 first responder인지 알아내는 코드를 작성할 필요 없이 first responder와 통신할 수 있는 수단을 제공
- View 아이콘- UIView클래스의 인스턴스- 4개의 창이 열린 메인에서 제목표시줄에 View라고 적힌 창이 이 아이콘을 가리킴
Interface Builder 기본 윈도우
• 사용자 인터페이스를 구성하는 객체를 만들기 위해 적절한 곳!
예를 들어, 어플리케이션에 버튼을 추가하고 싶다면
- UIButton 타입의 객체 인스턴스가 필요✓ 코드 입력시,
UIButton *myButton = [[UIButton alloc] initWithFrame:aRect];
✓ Interface Builder 사용 시 인터페이스 객페 팔레트에서 메인 윈도우로 버튼을 끌어와
똑같은 작업을 할 수 있음
왜 Interface Builder를 사용해야 하는가?
버튼객체를 드래그
• View에 레이블 추가하기- Library 윈도우
✓ 코코아 터치 객체들의 모임✓ 항목을 라이브러리에서 nib파일 창으로 끌어놓으면 클래스 인스턴스가 어플리케이션에 추가됨
- 라이브러리 팔레트에서 Label이라는 이름의 객체를 찾아 View창으로 드래그✓ Label : 아이폰 화면에 나타나지만 사용자가 직접 수정할 수 없는 짧은 텍스트
- Label을 더블클릭하여 Hello, World! 를 입력
Interface Builder - 레이블 추가
• Interface Builder에서 저장하기- command+s를 눌러 저장
• Xcode로 돌아가- Build/ Build and Run을 선택
- 또는 아이콘을 클릭
• iPhone Simulator가 구동되며 어플리케이션을 실행
Hello World 어플리케이션 실행하기
아이폰 개발의 또다른 재미!
사용자와 상호작용 하기아이폰 개발의 또다른 재미!
사용자와 상호작용 하기
상호작용과 MVC모델• 아이폰 개발의 또다른 재미!
- Hello World 어플리케이션은 코코아 터치를 이용한 아이폰 개발의 간단하고 좋은 예제이지만 결정적인 기능이 빠짐
- 그것은! 사용자와 상호작용하기
• 모델- 뷰-컨트롤러(MVC; Model-View-Controller) 패러다임- 코코아 터치를 설계한 개발자들은 MVC라는 개념에 따라 코코아 터치를 설계- GUI 기반이 어플리케이션을 구현하는 코드를 각각 특성에 맞게 분할하여 작성- 모델 Model✓ 어플리케이션의 데이터와 비지니스 로직
- 뷰 View✓ 사용자에게 데이터를 보여주고 그것을 조작하기 위한 UI 요소를 나타냄
- 컨트롤러 Controller✓ 모델과 뷰를 서로 연결하고 사용자의 입력을 어떻게 처리할지 결정하는 어플리케이션 로직
그럼 이제,Hello World 프로젝트에 버튼을 생성하여
버튼에 따라 레이블이 바뀌는 액션을 추가해보자!
상호작용하는 Hello World
• Hello_WorldViewController.h 파일에 다음을 추가(굵은 글씨)
- 아웃렛: IBOutlet 이라 불리는 특별한 변수 수형을 사용하여 nib 파일 안의 객체를 참조 (nib 파일 내부의 객체를 가리키는 포인터)
- 액션 메소드: IBAction 이라는 키워드로 선언 액션 메소드라는 것을 인터페이스 빌더에 알려주고 컨트롤이 이 메소드를 호출하게 도와줌
#import <UIKit/UIKit.h>
//시작//UIViewController클래스를 상속받는 Hello_WorldViewController@interface Hello_WorldViewController : UIViewController { UILabel * statusText;}// Interface Builder에 nib 파일 안에 있는 객체와 연결되는 인스턴스 변수(멤버 변수) 임을 알려줌@property (nonatomic, retain) IBOutlet UILabel *statusText;!!
// 액션 메소드 선언// Interface Builder에 이 클래스가 아래의 액션 메소드를 가지고 있다고 알려줌- (IBAction)LbuttonPressed:(id)sender;- (IBAction)RbuttonPressed:(id)sender;
//끝@end
Hello_WorldViewController.h
• Hello_WorldViewController.m 파일에 다음을 추가(굵은 글씨)
#import "Hello_WorldViewController.h"
@implementation Hello_WorldViewController@synthesize statusText;
//왼쪽 버튼이 눌렸을 때 호출되는 액션 메소드 - (IBAction)LbuttonPressed:(id)sender {
// 버튼 레이블의 문자열을 읽어온다. NSString *title = [sender titleForState:UIControlStateNormal]; NSString *newText = [[NSString alloc] initWithFormat:@"%@ 사운드 콘텐츠 응용 입니다.", title]; statusText.text = newText;
// alloc으로 받은 문자열이므로 꼭 release로 반환해야 한다. [newText release];}//오른쪽 버튼이 눌렸을 때 호출되는 액션 메소드- (IBAction)RbuttonPressed:(id)sender { NSString *title = [sender titleForState:UIControlStateNormal]; NSString *newText = [[NSString alloc] initWithFormat:@"%@ 이종우 교수님 입니다.", title]; statusText.text = newText; [newText release];}
- (void)dealloc {! [statusText release]; [super dealloc];}
@end
상호작용하는 Hello World Hello_WorldViewController.m
• Hello_WorldAppDelegate.h 파일 (수정할 필요 없음-기본으로 생성 됨)
#import <UIKit/UIKit.h>
@class Hello_WorldViewController;
//<UIApplicationDelegate>라는 프로토콜을 따르는 클래스 @interface Hello_WorldAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window; Hello_WorldViewController *viewController;}
@property (nonatomic, retain) IBOutlet UIWindow *window;@property (nonatomic, retain) IBOutlet Hello_WorldViewController *viewController;
@end더 자세한
레퍼런스 브라우저로 이동
Delegate : 다른 객체를 대신해서 책임지고 어떠한 일을 해주는 클래스UIApplication은 UIKit 프레임워크에서 제공하는 클래스UIApplication이 하는 작업들은 감춰져 있기 때문에 대부분의 경우에는 UIApplication이 하는 일에 대해 신경쓰지 않아도 됨
상호작용하는 Hello World Hello_WorldAppDelegate.h
UIApplicationDelegate 글자 위로 option키를 누르면서 커서를 올리면 커서가 십자 모양으로 바뀌는데 그때 더블클릭을 하면 도큐멘테이션이 등장!
• Hello_WorldAppDelegate.m 파일 (수정할 필요 없음-기본으로 생성 됨)
#import "Hello_WorldAppDelegate.h"#import "Hello_WorldViewController.h"
@implementation Hello_WorldAppDelegate
@synthesize window;@synthesize viewController;
//어플리케이션이 모든 설정 작업을 마치는 즉시 사용자와 상호작용을 시작할 준비를 하는 메소드- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch.
// Add the view controller's view to the window and display. [window addSubview:viewController.view]; [window makeKeyAndVisible];
return YES;}
- (void)dealloc { [viewController release]; [window release]; [super dealloc];}
@endXcode에서 수정한 파일을
모두 저장한 후 Interface Builder로 이동!
상호작용하는 Hello World Hello_WorldAppDelegate.m
• Hello_WorldViewController.xib 파일 클릭- View 창에 레이블을 드래그하여 추가- Label Attributes 창을 통해 속성값 수정 가능- 만약 Attributes창이 보이지 않는다면,
command+1을 눌러 나타나게 함
상호작용하는 Hello World Hello_WorldViewController.xib
• 라이브러리 윈도우에서
Round Rect Button을 드래그하여
View에 가져오기
• 다음의 내용과 같이 수정하기
상호작용하는 Hello World Hello_WorldViewController.xib
이제 우리가 만든 구성 요소들이
상호간에 동작할 수 있도록 연동해 보자!
• File’s Owner 아이콘을 이용하여 아웃렛(IBOutlet)과 레이블 사이를 연결
• 컨트롤 키를 누른 상태에서 File’s Owner아이콘을 클릭
• 마우스 버튼을 누른 상태를 유지하며 View 창으로 끌어오면 파란 안내선이 나타나는데 레이블까지 드래그
• 레이블 위에 커서가 위치된 상태로 마우스를 놓으면 회색메뉴가 펼쳐지고 statusText를 선택
상호작용하는 Hello World Hello_WorldViewController.xib
• 액션 지정하기- View 창에서 “수강과목은”버튼이 클릭되있는 상태에서
command+2버튼을 눌러 connections inspector창을 연다.
- 다양한 이벤트 중 우리는 Touch Up Inside 이벤트를 사용한다.
- Touch Up Inside 오른쪽의 작은 동그라미를 클릭한채 File’s Owner 아이콘으로 드래그
- 작은 회색 메뉴가 나타나면 LbuttonPressed를 선택
- “담당교수님은” 버튼이 클릭되어 있는 상태에서 Touch Up Inside 동그라미를 클릭하여 드래그, RbuttonPressed를 선택
Touch Up Inside : 사용자의 손가락이 화면에서 떨어질 때, 떨어지기 전에 손가락이 접촉한 부분이 버튼의 안쪽이면 Touch Up Inside이벤트를 발생
상호작용하는 Hello World Hello_WorldViewController.xib
• Interface Builder를 저장한 후 Xcode로 돌아와 실행
버튼클릭! 버튼클릭!
상호작용하는 Hello World 완료!!
Objective-C
• 1980년대 과학자이자 소프트웨어 엔지니어인 브래드 콕스가 개발
• C프로그래밍 환경에 스몰토크의 특징을 도입하는 방식으로 디자인
• iPhone Framework Library의 대부분은 Objective-C로 작성됐지만 C언어도 수용할 수 있게 디자인되어 C/C++도 사용가능
• 자바, C#과 같은 많은 언어들이 Objective-C언어를 차용
Objective-C란?
• 확장자.h 헤더파일, class의 interface 정의
.m C, Objective-C코드로 implementation
.mm Objective-C에서 C++클래스를 호출하는 경우에 사용
• 메시징- 메소드는 전통적인 방식처럼 호출되는 것이 아니라 객체에 메시지를 보내는 형식- 다른 언어에서 오브젝트명.메소드명 이 [오브젝트 메소드]괄호에 둘러쌓이고 스페 이스로 구분하는 형식
- 파라미터를 가지는 경우; [오브젝트 메소드:파라미터]로 사용 예) [object method]; [object methodWithInput:input];
리턴값이 있는 경우 output = [object methodWithOutput] output = [object methodWithInputAndOutput:input];
- 클래스 메소드도 같은 문법으로 호출 가능 예) id myObject = [NSString string]; (id 타입이란? myObject가 어떤 오브젝트의 참조도 될 수 있다는 뜻)
같은 표현으로, NSString* myString = [NSString string]; (모든 Objective-C의 변소들은 포인터 타입이므로 *를 붙일 필요가 없음)
- myWidget 객체에 PowerOn이라는 메시지를 보내는 방법 예)
Objective-C returnValue = [myWidget powerOn];C++ returnValue = myWidget -> PowerOn();C returnValue = widget_powerOn(myWidget);
Objective-C의 특징
Objective-C의 특징
• 접근자- 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;
• 전처리기 선언 Import- #include 대신 #import문을 사용
Objective-C의 특징
• String- c의 String을 그대로 사용 가능- 그러나 대부분의 Objective-C framework에서는 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];
• 프로퍼티 property 선언- 인스턴스 변수와 메소드 사이의 매개체 역할
- interface 안에 메소드와 같이 정의 예) @property (nonatomic, retain) IBOutlet UILabel *statusText;! nonatomic - 쉽게 멀티스레드를 위한 코드를 삽입하지 않아 오버헤드를 줄임 retain - Objective-C의 독특한 메모리 관리 기법 중 하나
- implementation 파일에 @synthesize statusText;와 같은 선언을 하면 컴파일러에 의해 메 소드가 자동 생성됨
Objective-C의 특징
@interface MyClass : NSObject //인터페이스 정의 시작{
int count;id data;NSString* name;
}
- (id)initWithString : (NSString*)aName;+ (MyClass*)createMyClassWithString:(NSString*)aName;
@end //인터페이스 정의 끝
클래스명 슈퍼 클래스명
멤버변수 정의
메소드 정의
• 클래스 선언(.h)
클래스의 interface는 .h에 정의.m에 implementation
+메소드(클래스 메소드)- 메소드(인스턴스 메소드)
• 클래스 implementation(.m)@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
Objective-C의 특징• 메소드 정의 방법
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
리턴 타입
메소드 타입식별자 파라미터 타입
파라미터 명메소드식별자 명
- 호출하는 예 [myArray insertObject:anObject atIndex:0];
- 괄호 안에 괄호를 넣는 방법([ [] ]) 쓸모없는 임시 변수를 선언하지 않게 메소드의 리턴값을 파라미터로 직접 넘길 수 있음 [[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];
- .(도트)를 사용하는 방법 accessor methods(단순히 클래스 멤버에 엑세스 하기 위해 만들어진 메소드, getter or setter)를 호출할 때 사용 [myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0]; 위의 방법은 다음과 같이 사용 myAppObject.theArray = aNewArray;
알아두면 좋은 맥 단축키• 단축키
- command + space bar 한영변환
- command + s 저장
- command + a 전체선택, command + c 복사, command + v 붙여넣기
과제• iPhone OS 개발환경 구축 및 Hello World 프로젝트 수정