어제는 울 마눌님과의 기념일이어서 공부하지 못했다 ㅎ
오늘 두배로 해야지 ..
개념정리를 하면서 다 아는 사실이라 더 새로운 걸 하면서 공부하고 싶지만
많은 부분을 다시 되짚어 볼 수 있었다. 아무튼 넘 조급히 생각하지 말고 천천히 가자.
1. Delegation
* 위임(Delegation)은 하나의 객체가 위임자(Delegate)로 지정된 다른 객체로 주기적으로 메세지를
보내서 해당 메시지를 처리할 수 있다면 처리하여 달라고 요구하거나 특정 이벤트가 발생하면
그 이벤트를 지정된 다른 객체로 던달하여 처리할고 요구하는 패턴을 말한다.
2. Model-View-Controller (MVC)
* 아이폰 애플리케이션은 객체지향 프로그램의 디자인 모델인 MVC 디자인 패턴을 기본으로 한다.
Model : 애플리케이션 데이터를 저장하고, 이 데이터를 조작하는 로직을 정의한다.
View : 사용자 인터페이스(윈도우나 버튼)에서 볼 수 있는 객체들의 집합으로 정의한다.
Controller : 위의 모델과 뷰를 조율하는 역할을 한다.
여기서 주로 혼동하는 것이 뷰이다.
보통 뷰를 Interface Builder의 xib 또는 nib 파일이라 생각하기 쉽지만,
그것이 아니라 Interface Builder에서 만든 것들을 지원하거나
UI를 그리기 위한 소스 파일들 (.h파일과 .m파일)을 말한다.
3. Target-Action
* 다른 객체에 메세지를 보냄으로써 객체 제어를 가능하게 해준다.
* 이벤트 처리를 위해 가장 많이 쓰인다.
4. 애플리케이션 프로젝트 템플릿
* xcode상에서 새로운 프로젝트를 생성할 때 선택할 수 있는 템플릿은 여러 종류가 있다.
* 각 템플릿은 애플리케이션을 개발하기 위한 기본 환경을 제공한다.
기본 환경이라 함은 애플리케이션이 동작하기 위한 기본적인 함수들과 그 사용법
(소스 코드 내에 주석 처리되어 있음)을 말한다.
프로젝트 템플릿의 종류
Navigation-based Application
내비게이션 컨트롤러를 기반으로 하는 프로젝트.
계층구조로 더 깊은 단계로 들어갔다가 나올 수 있는 형태의 프로그램을 만들 수 있다.
Setting 창에서 General로 한단계 더 들어간 후 다시 About 을 눌러서
가장 깊은 단계까지 들어 갔다가도 다시 이전 단계로 이동할 수 있는 형태이다.
OpenGL ES Application
게임 등을 개발하기 위해서 3D 엔진인 OpenGL ES를 사용할 수 있다.
Tap Bar Application
아이폰 시계 애플리케이션처럼 탭바 기반 애플리케이션을 개발할 수 있다.
Utillity Application
날씨나 증권 애플리케이션과 같은 위젯형태 애플리케이션을 만들 수 있다.
창 하나에서 필요한 정보를 모두 보여주는 형태의 프로그램이다.
필요한 설정은 화면이 뒤집어 지면서 뒷면에서 이루어진다.
사용자 입력을 거의 받을 필요가 없는 날씨 등의 정보를 보여주는 데 적합하다.
View-based Application
창에 뷰가 하나 추가된 기본형태를 갖는 프로젝트를 만들어준다.
Window-based Application
뷰도 없이 창 하나만 존재하는 가장 기본적인 형태다.
스스로 뷰를 추가하는 등의 작업을 한다.
* 참고 앱의 타입
힉(HIG)에는 아이폰 용 앱의 주요한 3가지 타입에 대한 설명이 있다.
각 타입은 각기 다른 목적을 갖고 있으며, 사용자에게 다른 경험을 제공한다.
프로덕티비티 앱(Productivity App)
정보 관리를 도와주는 앱이 이에 해당한다.
정보는 주로 계층 구조를 이루고 있기 때문에 좀 더 세부적인 정보를 원하는 경우는
드릴다운(drill down - 더많은 정보를 얻기 위해 관련 아이콘이나 텍스트를 클릭하여
마치 뚫고 들어가 듯이 검색하는 것)해서 찾아갈 수 있도록 한다.
네비게이션-베이스 애플리케이션이 이에 해당한다.
유틸리티 앱 (Utility App)
사용자의 입력이나 환경 설정을 최소화하고, 특정 정보를 보여주는 주식, 날씨 앱 등이
여기에 속한다.
일반적으로 프로덕티비티 앱보다는 유틸리티 앱이 UI 컴포넌트를 더많이 갖고 있으며
힉(HIG) 가이드 라인에 유의해야 한다.
유틸리티 애플리케이션 템플릿이 이에 해당한다.
몰입형 앱 (Immersive App)
주로 게임이 여기에 해당한다.
몰입형 앱의 특징은 UI 컴포넌트를 직접 구현할 수 있다는 것이다.
따라서 이런 경우에는 힉(HIG) 가이드 라인의 제약을 덜 받는다.
어떠한 플랫폼을 선택하든지 IB와 코드의 추가/수정으로 변형될 수 있으며
플랫폼은 기본형을 제공할 뿐이지 꼭 그렇게 개발해야 한다는 규약은 아니다. (그저 편리성을 위한 것 뿐)
5. 뷰 컨트롤러 (View Controller)
* 뷰 컨트롤러 객체는 대부분의 아이폰 애플리케이션에서 핵심적은 역활을 한다.
* 뷰를 관리하고 메모리 사용 및 뷰 사이의 내비게이션 관리에 도움을 준다.
생성방법 부터 기본적인 기능
생성방법
- xcode에서 [file] -> [New File..] 을 선택 (New File 창에서 새로운 파일을 프로젝트에 추가할 수 있다.)
- 새로 열린창을 보면 'iPhone OS' 항목과 'Mac OS X'로 구분되는데 추가하고자 하는 파일 클래스에
따라 선택하여 생성해야 한다.
- 뷰컨트롤은 'iPhone OS' 하단의 'Cocoa Touch Classes' 항목에서 'UIViewController subclass'를 선택하면 된다.
- <Next> 버튼으로 파일이름을 지정하게 된다. 여기서 해당 클래스 파일에 대한 헤더파일(.h)을 추가할지
선택하게 되어 있는데 이 옵션을 체크하면 파일이 자동으로 생성된다.
- <Finish> 버튼으로 생성이 완료된다. 하지만 개발의 편의성을 위하여 class 폴더로 모아주는 것이 좋다.
생성은 이렇게 하면 되고(아직 익숙치 않다.) 이제 뷰컨트롤러 객체를 기존의 프로그램에 추가하고 다루어보자.
* 뷰 컨트롤러에 객체 추가하기
새로 생성된 뷰 컨트롤러 파일은 뷰 컨트롤러 클래스만을 추가 했을 뿐 애플리케이션과 연결은 되지 않았다.
생성한 뷰 컨트롤러 클래스와 애플리케이션을 연결하려면 다음과 같은 과정이 필요하다.
- 프로젝트 생성시 자동 생성된 Delegate.h 파일에 다음 내용을 추가한다.
1. 인터페이스 선언 전에 방금 만들어 둔 ViewController를 추가한다.
@class NameViewController; //가상으로 NameViewController라는 클래스를 위에서 생성했다 생각하자.
2. 인터페이스의 멤버 변수를 선언하는 부분에 변수를 선언한다.
NameViewController *nameviewController; //변수이름은 걍 편하게 지으면 된다.
3. @end 지시문 전에 변수에 대한 setter, getter를 지정한다.
@property (nonatomic, retain) NameViewController *nameviewController;
* 참고 여기 Delegate.h 파일 위에 보면 기본적으로
#import <UIKit/UIKit.h>
라고 임포트되어 있는 것을 볼 수 있다.
iPhone OS에 가장 중요한 프레임워크라고만 알고 있었지만 궁금증이 도져 한번 정리해 보고 가려 한다.
UIKit의 소개
* UIKit은 파일 크기로 보나 역할로 보나 iPhone 최대의 프레임웍이라고 할수 있다.
* UIKit 은 윈도우와 텍스트상자의 생성에서 부터 멀티터치 제스츄어 처리와 하드웨어 센서 등에
이르기까지 모든 사용자인터페이스(User Interface) 관련 함수를 담당한다.
* 모든 iPhone 프로그램에서 동일한 UIkit API를 사용할 수 있다. - 어떻게 사용할 수 있는가에 대한 이해 중요
* UIKit 은 단순한 사용자 인터페이스 kit이 아니라, iPhone GUI 프로그램 실행 시 사용하는 런타임 foundation(기초) 이기도 하다.
* 프로그램이 실행되면, main() 함수가 UIKit 내의 UIApplication 객체를 인스턴스화 (instantiate) 시킨다.
이 UIApplication 클래스는 iphone 에서 user interface를 가진 모든 프로그램들의 base 클래스(부모클래스) 이며,
프로그램들이 iPhone의 상위 함수들에게 접근할 수 있도록 해준다.
그밖에도 suspend(잠자기), resume(깨우기) 와 termination(종료) 같은 일반적인 어플리케이션 레벨의 서비스들이
UIApplication 객체의 함수로 제공된다.
* UIKit 을 사용하기 위해서는 필수적으로 UIKit 프레임웍과 링크되어야 한다.
UIKit 프레임 웍은 말하자면, 일종의 공유 라이브러리라 할 수 있다.
구체적인 것은 사용하면서 알아갈 수 밖에 없다.. (정리할려고 여러 검색후 읽어보았지만
중요하다는 것만 알뿐 팍팍 이해되지 않는다. 알듯말듯한 드런기분....
나중에 좀 더 개발에 익숙해지고 사용량이 많이자면 다시 정리하겠다.)
여기서 또 검색중 얻어 걸린 것으로 아이폰 계층구조를 함 보고 넘어가겠다.
Apple에서는 iPhone 기술이 계층구조를 이루고 있다고 설명한다.
가장 아래층인 Core OS 계층을 시작으로 Core Services, Media, Cocoa Touch 계층으로 구성되어 있다.
iPhone 운영체제 계층 그림
프로그래머 입장에서 더 단순하게 iPhone 운영체제(OS)를 C와 Cocoa 두 개의 계층으로 나누기도 한다.
iPhone 프로그래밍 계층
C 계층은 운영체제 계층 -Core OS, Core Services-을 포함한다.
운영체제 계층에서는 BSD UNIX 스타일의 C 함수를 이용하여 low-level 파일 I/O, 네트워크 소켓, POSIX 쓰레드,
SQLite 등을 사용할 수 있다.
역시 C 계층에 포함된 Media 계층은 운영체제 계층 바로 상위에 있지만 역시 low-level 계층에 속하며,
OpenGL ES, Quartz, COre Audio 같은 C-API (Application Programming Interface)를 제공한다.
C 계층 바로 위에 있는 Cocoa 계층은 iPhone 프로그래밍을 쉽게 할 수 있도록 한다.
Cocoa Touch
iPhone 을 위한 Cocoa 가 Cocoa Touch 이며, 말 그대로 Cocoa 에 터치 이벤트 처리가 추가되었다는 의미이다.
Cocoa Touch는 iPhone 개발에 필요한 기본 클래스를 제공한다.
iPhone 프로그램에서 항상 사용하는 두 개의 Cocoa Touch 프레임 워크가
Foundation 과 UIKit 프레임 워크이다.
프레임 워크란 비슷한 일을 수행하는 코드의 묶음이다.
Foundation 프레임워크는 스트링, 파일 I/O 등의 표준 프로그래밍에 필요한 기본 인터페이스를 제공한다.
UIKit 프레임워크는 UIView 클래스 등의 iPhone 인터페이스를 제공한다.
Foundation FrameWork
Foundation 프레임워크는 하위 레벨의 코어(core) 기능을 포함하는 Objective-C 클래스를 제공한다.
강력한 iPhone 애플리케이션을 만들기 위해 꼭 알아야 하는 많은 유용한 클래스를 제공한다.
(collection, 날짜, 시간, 바이너리 데이터, URL, 쓰레드, 소켓 등의 low-level C 기능을
high-level 의 wrapping 함수인 Objective-C 클래스를 이용하여 더 쉽게 사용할 수 있도록 제공한다.)
팁) Apple Foundation 프레임 워크 레퍼런스에서 Foundatin 프레임워크의 모든 클래스와 프로토콜 확인이 가능
다시 본론으로 돌아가자 ViewController 객체 추가를 하였다.
다은은 뷰 컨트롤러 인스턴스 생성이다.
- 뷰 컨트롤러 인스턴스 생성하기
* 인스턴스 생성은 구현파일(.m 파일)에서 진행된다.
여기서는 Delegate.m 파일이 되겠다 .
1. 헤더파일에 임포트한다.
#import "NameViewController.h"
2. 뷰 컨트롤러에 대한 함수 접근자를 사용한다고 컴파일러에 알려주는 구문을 추가한다.
뭔말이 이리 어렵데... 헤더파일에서 선언한 프로퍼티에 대한 메소드를 생성하라고 컴파일러에게 명령한다.
(getter/setter가 자동으로 설정된다.)
@synthesize nameviewController;
3. applicationDidFinishLaunching 함수에서 aViewController라는 NameViewController 클래스 타입의 객체를
생성한다. 이 인스턴스는 'ControllerView'라는 nib 이름으로 초기화 되도록 설정해준다.
applicationDidFinishLaunching :
애플리케이션의 구동(이말이 맞나- 시작이라해도 맞을듯) 완료를 델리게이트에게 알려준는 함수.
파라미터는 application을 쓴다 (The delegation application object)
-(void) applicationDidFinishLaunching :(UIApplication*)application{
NameViewController *aViewController = [[NameViewController alloc] initWithNibName:@"ControllerView"
bundle:[NSBundle mainBundel]];
// 객체를 생성해준다. 여기서는 초기화시 닙파일을 'ControllerView'라고 지정하여 생성해준 것이다.
NSBundle 클래스 : 프로그램 안에서 사용되는 코드와 리소스를 모아놓은 곳 캡슐화(애플리케이션을 위한 폴더라고 생각하자)
[NSBundle mainBundle] 은 현재 애플리케이션의 실행 파일이 있는 번들을 리턴한다. 번들 초기화 정도?
self.nameviewController = aViewController ;
// 매소드의 위치를 지정해준다.
[aViewController release] // alloc으로 생성해 주었으므로 레퍼런팅 카운트를 -1하여 메모리 해제를 해줘야한다.
UIView *controllerView = [nameViewController view];
// nameViewController 의 View를 가져온다.
[window addSubview:controllerView];
// 현재 프로젝트의 window에 생성된 view를 가져온다.
[window makeKeyAndVisible];
// 이게 뭘까? 대략 윈도우 화면에 뷰를 띄어주는 용도인 것 같다.
apple library : Makes the receiver the key window and makes that window visible.
}
4. 객체가 해제될 때 메모리를 해제해 준다.
[nameViewController release]; //retain으로 선언하여
[window release];
'개발 > App Developer' 카테고리의 다른 글
Enumeraion (0) | 2010.08.31 |
---|---|
10.07.06 개발노트 (0) | 2010.08.31 |
10.07.08 GDB 간단 명령어 및 breakpoint 사용법 (0) | 2010.08.31 |
010.07.09 개발노트 (0) | 2010.08.31 |
스텍(Stack), PUSH, POP (0) | 2010.08.31 |