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
Other Sources
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];
}
@end
Xcode
에서 수정한 파일을모두 저장한 후
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;