'hello world'에 해당되는 글 1건

최초 작성일 : 2010/03/20 09:59 


Hello World 정리

처음으로 맥을 접하고 처음으로 아이폰을 접하고 처음으로 Objective-c를 접해봤다.
아직도 전체적인 구조를 파악할 수 있지는 못하고 다만 단편적인 하나 하나에 대한
의미를 알아가는 단계이기에 부족하기도 하고 또 잘못된 내용도 있을지 모르겠다.
이제 겨우 가장 기초적은 샘플 하나를 분석해 본 것 뿐이므로 많은 기대를 하지
않는 것이 좋겠다. 

특히 인터페이스 빌더의 설명같은 경우 애플리케이션을 구현하면서
공부한 것이 아니라 역으로 이미 만들어진 애플리케이션을 인터페이스 빌더로
열어 확인한 내용이다보니 더더욱 분석하기가 어려웠다.

오늘의 이 내용이 내일 더 나은 결과를 위한 밑거름이 될거라 생각하며
첫 예제 분석에서 중요하다고 생각되는 몇가지를 정리하면서 분석을 마친다.


NSAutoreleasePool : 
메모리 자동 관리를 위한 클래스. 
NSAutoreleasePool의 인스턴스가 생성되고 release되는 블럭 사이에서 팩토리 함수로 생성한
대부분의 객체 또는  autorelease 메시지를 받은 객체들은 모두 NSAutoreleasePool가
관리를 하게 되며 NSAutoreleasePool의 인스턴스가 release되는 순간 NSAutoreleasePool이
관리하던 모든 객체들이 메모리에서 해제된다.
최초 main.m에 자동 코딩되는 내용은 지우지 않는 것이 좋다.

UIApplicationMain :
UIKit 프레임워크에 선언된 함수로 main.m 내에서 호출되어 애플리케이션을 객체를 생성하고
위임(delegate)하며 이벤트 사이클을 설정한다.

아이폰의 애플리케이션은 기본적으로 이 함수 호출로부터 시작한다.

delegate : 
애플리케이션이 객체간 메시지를 전달하는 방법 중 하나
많은 UIKit 프레임워크의 클래스들이 delegation을 사용한다.
사용자로부터 어떤 액션을 받게 되면 그 액션에 대한 내용을 delegate 프로토콜을 구현한 
클래스로 넘기게 되고 이 클래스에서 실제로 어떤 응답을 처리해야 할지 구현하게 된다.

Hello World 샘플의 경우 다음과 같은 delegation이 이루어지고 있다.

UIApplication에 대한 delegation
HelloWorldAppDelegate.m은 UIApplicationDelegate프로토콜을 사용하고 있는데
UIApplicationDelegate는 UIApplication에 대한 delegate 프로토콜이며 애플맄이션의 실행과
종료, 메모리 부족에 대한 경고, URL 리소스의 사용, status-bar의 방향 변경 및 
기타 시스템 관련 이벤트를 처리한다.

UITextField 대한 delegation
MyViewController.m은 UITextFieldDelegate프로토콜을 사용하고 있으며
이것은 UITextField에서 발생하는 이벤트에 대한 응답 처리를 담당한다.
textFieldShouldReturn는  이 프로토콜에서 정의된 함수로 텍스트필드에서
return키가 입력되었을 경우의 이벤트를 처리한다.

UIResponder :
이벤트에 대한 응답 처리를 위한 인터페이스를 정의한 클래스.
UIApplication이나 UIView와 같은 클래스들의 부모 클래스이고 이 예제에서 사용된
MyViewController의 부모클래스인 UIViewController클래스도 UIResponder를 상속받고 있다.

일반적으로 터치(touch) 이벤트와 동작(motion) 이벤트 2가지가 있는데
MyViewController에 구현된 touchesBegan 함수는 이 UIResponder에 선언된 함수고
화면상에 한 개 이상의 손가락이 눌렸을 때의 이벤트를 처리한다.

protocol : 
다중 상속 처리를 위한 함수 선언들의 집합체로 java의 interface와 유사하다.
Objective-c는 기본적으로 다중 상속이 불가능한데 protocol은 2개 이상을
사용할 수 있다.

기본적으로 프로토콜을 사용한 클래스에서는 프로토콜에 선언한 함수를 모두 구현해야 하나
다음의 옵션으로 선택적으로 구현 가능하다.

@optional : 구현하지 않아도 됨
@required : 반드시 구현해야 함
키워드 없음 : 반드시 구현해야 함

Hello World 예제의 MyViewController에서 사용된 UITextFieldDelegate 프로토콜은
모든 함수들이 @optional로 지정되어있어 이 예제에서는 textFieldShouldReturn함수
하나만 구현되어있다.

property :
@property 키워드는 접근자(accessor. getter)와 변경자(mutator, setter)를 
자동으로 생성해준다.

선언부(.h파일)에 @property로 변수를 지정해 놓으면 별다른 접근자 함수 선언 없이
구현부(.m파일)에 접근자 함수를 구현할 수 있다.

더욱 간편하게는 선언부에서 @property로 지정한 변수에 대해 구현부에서
@synthesize키워드를 이용해 지정해 놓으면 함수 구현까지 자동으로 이루어진다.

@class :
어떤 클래스에서 참조하여 사용하고자 하는 클래스를 지정할 때 사용하는 키워드
일반적인 #import와 다른 점은 #import가 이미 참조할 클래스의 선언부가 필요한 반면
@class로 지정을 해 놓으면 실제적인 클래스 선언 없이 클래스 이름만으로 해당 클래스를
사용하겠다고 컴파일러에게 알려줄 수 있다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^