오브젝트C2010. 6. 21. 09:30
Learning Objective-C: A Primer 한글 번역

Objective-C 는 복잡한 객체지향 프로그래밍을 지원하록 설계된 간단한 컴퓨터 언어입니다. Objective-C는 클래스들의 동적 확장을 지원하도록 하는 것 뿐 아니라, 클래스들, 메소드들, 그리고 프로퍼티를 정의하는 신택스를 제공함으로써 표준 ANSI C를 확장하였습니다. 클래스 신택스와 설계는 대부분 최초의 객채지향 프로그래밍 언어 중 하나인 스몰토크에 기반하고 있습니다.

만약 이전에 개발자가 객체 지향 언어를 이용하여 프로그래밍을 해본 경험이 있다면, 다음 정보들은 Objective-C 의 기본 신택스를 배우는데 도움이 될 것입니다. Encapsulation, inheritance, 그리고 polymorphism 과 같은 많은 전통적인 객체지향 컨셉들은 모두 Objective-C에 나와 있습니다. 하지만 몇가지 중요한 차이점이 있는데, 그 차이점들은 본 문서에도 나와있고 더욱 자세한 정보들도 필요에 따라 구하실 수 있을 것입니다.

만약 객체지향 언어를 이용해서 프로그래밍해본 경험이 없다면, 적어도 관련된 컨셉들에 대해서 기본적으로 이해해야 할 필요가 있습니다. 객체들의 사용과 객체 지향 구성 개념은 iPhone 응용프로그램의 설계에 필수적이고, 어떻게 그들이 interact하는가를 이해하는 것은 응용프로그램을 작성함에 있어서 매우 중요합니다. 객체 지향 개념에 대해서 오버뷰를 원하신다면, Object-Oriented Programming with Objective-C 문서를 보시기 바랍니다.

Objective-C 언어와 신택스에 대한 더욱 자세한 소개를 원하시면 Objective-C 2.0 Programming Language 를 보시기 바랍니다.

less..

Objective-C: A Superset of C

Objective-C는 C 프로그래밍 언어의 ANSI 버전의 superset이고 C와 동일한 기본 신택스를 지원합니다. C code를 이용하는 것과 마찬가지로 개발하는 코드의 구현에서 퍼블릭 선언들을 분리하기 위해서 header 파일들과 source 파일들을 정의하게 됩니다. Objective-C header 파일들은 표 1에서 보이는 바와 같은 file 확장자를 사용합니다.


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];

Classes

대부분의 다른 객체지향 언어에서와 마찬가지로, Objective-C 는 일부 데이터와 그 데이터를 이용해 동작하는 액션들을 encapsulate한 기본 Construct 를 제공합니다. 객체는 간단히 말해서 클래스의 동적인 인스턴스이고, 클래스에 의해서 선언된 멤버 변수의 in-memory 카피를 가지고 클래스의 메소드에 대한 포인터를 갖고 있습니다.

Objective-C에서 클래스의 specification은 두개의 별개의 부분을 필요로 하는데, 이는 인터페이스와 임플리먼테이션입니다. 인터페이스 부분은 클래스 정의와 멤버 변수와 해당 클래스에 관련된 메소드들의 정의를 포함합니다. 임플리먼테이션 부부은 클래스의 메소드들을 위한 실제 코드를 담고 있습니다. 그림 1은 MyClass라 불리오는 클래스를 정의하는 신택스를 보여줍니다. 이는 NSObject 베이스클래스로부터 상속을 받은 클래스입니다. 클래스 선언은 언제나 @interface 컴파일러 디렉티브로 시작하고 @end 디렉티브로 끝납니다. 다음으로는 클래스 이름과 부모 클레스의 이름이 나옵니다. 클래스의 멤버 변수들은 중괄호에 의해서 제한된 코드 블럭 내에서 선언됩니다. 다음으로 나오는 멤버 변수 들럭은 클래스에 의해서 선언되는 메소드들의 목록입니다. 세미콜론 문자는 각 멤버 변수와 베소드 선언의 끝을 나타닙니다.

그림 1. 클래스 선언


그림 2는 앞서 나온 예제인 MyClass 의 임플리먼테이션을 보여줍니다. 클래스 선언과 동일하게, 클래스 구현은 두개의 컴파일러 디렉티브들 (@implementation 과 @end)로 확인됩니다. 이러한 디렉티브들은 컴퍼일러가 연관된 클래스와 메소드들을 연관짓는데 필요한 scoping 정보를 제공하게 됩니다. 그러므로, 하나의 메소드의 정의는, 코드블록에서 포함된 것을 제외하고는, 인터페이스에서 연관된 정의와 동일해야 합니다.

그림 2. 클래스 임플리먼테이션

다음 예제는 MyClass 클래스를 위한 String typing과 weak typing 변수 선언을 보여줍니다.


그림 3. 메소드 선언 신택스

개발자가 메소드를 호출할 때, 개발자는 연관된 객체에 "메세징"을 통해서 그렇게 할 수 있습니다. 이러한 경우에서 메세지는 메소드가 필요로하는 파라메서 정보와 함께, 메소드 시그니쳐가 됩니다. 당신이 객체에 보내느 모든 메시지는 동적으로 디스패치되고, 그럼으로써 Objective-C 클래스들의 polymorphism behavior 를 용이하게 합니다. 다시 말해서, 자식클래스가 부모 클래스의 하나와 같은 시그니쳐를 갖는 메소드를 정의했다면, 자식클래스는 메시지를 먼저 받고 메시지를 부모에게 전달하지 말지를 선택할 수 있습니다.

메시지들은 대괄호([, ])로 싸여습니다. 대괄호 안에서 메시지를 받은 객체는 왼편에 있고 (메시지에 필요로하는 어떠한 파라메터와 함께) 메시지는 오른편에 있게 됩니다. 예를 들어, insertObject:atIndex: 메세지를 myArray 변수에 있는 객체에게 보내려고 한다면, 다음과 같은 신택스를 사용할 수 있습니다.


[myArray insertObject:anObj atIndex:0];

임시 결과를 저장하기 위한 무수한 로컬 변수를 선언하는 것을 피하기 위해서, Objective-C는 개발자가 메시지들을 네스트하도록 허용합니다. 각각의 네스트된 메시지들로 부터의 리턴값은, 다른 메시지의 파라메터 혹은 타겟으로 쓰일 수 있습니다. 예를 들어, 당신이 값을 찾아오도록 하는 메시지를 이용해서 이전 예제에서 사용된 어떤 변수들을 대체하려 할 수 있다. 그렇다면 만약 array 객체에 접근하여 해당 객체를 array 에 삽입하는 myAppObject 라 불리오는 또하나의 객체를 가지고 있다면, 당신은 이전 예제를 다음과 같이 보이게 작성할 수 있습니다.


NSMutableArray* myArray = nul; // nul 은 기본적으로 NULL 과 같습니다.

// 새로운 배열을 만들고 이를 myArray 변수에 할당합니다.
myArray = [NSMutableArray arrayWithCapacity;0];


Properties

프로퍼티들은 접근자 (accessor) 메소드들을 대채하는데 사용되는 편의 노테이션입니다. 프로터티들은 작성하는 클래스 정의에서 새로운 멤버 변수들을 생성하지 않습니다. 프로퍼티들은 단순히 이미 존재하는 멤버 변수들을 접근하는 메소드들을 정의하는 데 사용되는 shorthand입니다. 멤버 변수들을 표출하는 클래스들은 getter 그리고 setter 메소드들을 이용하는 대신에 프로퍼티 노테이션을 이용하여 그렇게 할 수 있습니다. 클래스들은 역시 "가상" 멤버 변수들 (즉, 동적으로 계상되는 데이터와 실제로는 멤버 변수들에 저장되지 않는 데이터들의 조각) 을 표출하는데 프로퍼티들을 사용할 수 있습니다.

실전적으로 마하자면, 프로퍼티들은 작성해야 하는 중복된 코드의 양을 줄입니다. 대부분의 접근자 메소드들은 공일한 방법으로 구현되지 때문에, 프로퍼티들은 클래스에서 포출하는 각각의 멤버 변수들에 대한 별개의 getter와 setter를 제공할 필요를 제거합니다. 대신 개발자는 프포퍼티 선언을 이용해서 원하는 behavior 를 명시해야하고, 그런 후 컴파일 타임에 해당 선언에 기반을 둔 실제 getter 와 setter 메소드들을 종합적으로 다루게 됩니다.

프로퍼티 선언들이 실제 메소드들을 생성하는 결과를 낳기 때문에, 개발자는 작성하는 클래스 인터페이스에서 메소드 선언와 함께 그들을 포함하게 됩니다. 기본 정의는 @property 컴파일러 디렉티브를 사용하고, 이의 뒤에 프로퍼티의 타입 정보와 이름이 뒤따르게 됩니다. 개발자는 역시 사용자 옵션을 가지고 프로퍼티를 설정할 수 있고, 이는 접근자 메소드들이 어떻게 행위하는지를 정의합니다. 다음 예제는 몇개의 간단한 프로퍼티 선언들을 보여줍니다.


myObject.flag = YES;
CGRect viewFrame = myObject.rootView.frame;

앞선 예제들에서 객체와 프로퍼티의 이름들이 꾸며낸 것임에도 불구하고, 이는 프로퍼티들의 유연성을 보여줍니다. 마침표 신택스는 실제로 메소드 호출들의 연관된 셋을 실제로 가려줍니다. 각각의 읽을 수 있는 프로퍼티는 프로퍼티와 같은 이름을 갖는 메소드들에 의해서 구현됩니다. 각각의 쓰기가능한 프로퍼티는 프로퍼티 이름의 첫번째 문제가 대문자로 시작하는 setPropertyName: 형식의 추가적인 메소드에 의해서 구현됩니다. (이러한 메소드들은 프로퍼티들의 실제 구현들이고 개발자가 멤버 변수들에 의해서 구현되지 않는 클래스들의 속성들을 위한 프로퍼티 정의를 포함할 수 있는 이유가 됩니다.) 앞선 예제 코드를 프로퍼티 대신 메소드를 이용해서 구현한다면 다음 코드와 같이 작성해야 합니다.


The Objective-C 2.0 Programming Language의 "Properties"를 읽어보시기 바랍니다.

Protocols and Delegates

프로토콜은 어떠한 클래스에서든지 구현될 수 있는 메소드들을 정의합니다. 프로토콜들은 클래스 자체는 아닙니다. 프로토콜들은 단순히 다른 객체들이 구현해야하는 책임을 갖는 인터페이스를 정의합니다. 개발자가 클래스들의 하나에서 하나의 프로토콜의 메소드를 구현할 때, 개발자의 클래스는 그러한 프로토콜을 만족하기위해서 언급됩니다.

iPhone OS에서 프로토콜은 delegate 객체들을 구현할 때 자주 사용됩니다. delegate 객체는 또 다른 객채와 함께, 혹은 또 다른 객체를 위해서 동작하는 객체입니다. 프로토콜간의 상호작용을 찾기 위한 최고의 방법은 delegate들과 다른 객채들을 예제에서 살펴보는 것입니다.

UIApplication 클래스는 응용프로그램에서 필요로하는 behavior 를 구현합니다. 개발자가 자식클래스 UIApplication 이 응용프로그램의 현재 상태에 대해서 간단한 알림들을 받도록 강제하는 대신에, UIApplication 클래스는 그러한 알림들을 자신에게 할당된 delegate 객체의 특정 메소드들을 호출함으로써 전달합니다. UIApplicationDelegate 프로토콜의 메소드들을 구현하는 객체는 이러한 알림들을 받을 수 있고 적절한 응답을 제공합니다.

프로토콜의 선언은 클래스 인터페이스와 매우 비슷하게 보입니다. 하지만 프로토콜은 부모 클래스를 가지고 있지 않고, 멤버 변수들을 정의하지 않는 다는 점이 차이점입니다. 다음 예제는 하나의 메소드를 갖는 간단한 프로토콜 선언을 보여줍니다.


The Objective-C 2.0 Programming Language의 "Protocols"를 읽어볼 필요가 있다는 것을 뜻합니다.

For More Information

앞서 언급된 정보들은 기본적으로 개발자가 Objective-C 언어의 기본에 익숙해지도록 의도하고 있습니다. 여기서 다른 주제는 개발자가 문서의 나머지를 읽어감에 따라 겪게 될 대부분의 언어 특징을 반영하는 것이었습니다. 이는 단지 언어 전반에 대한 특징이 아니기 때문에 The Objective-C 2.0 Programming Language에서 언어에 대해서 좀더 읽어보기를 장려합니다.

 

 


출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110085740932

'오브젝트C' 카테고리의 다른 글

[펌] 프로토콜과 카테고리 : 오브젝티브 C에 대해서..  (0) 2010.06.21
[펌] Objective-C: Tip 모음  (0) 2010.06.21
Learning Objective-C: A Primer 한글 번역  (0) 2010.06.21
[펌] Objective-C 코딩 스타일  (0) 2010.06.21
[펌] Objective-C class의 특징  (0) 2010.06.21
Objective-C 온라인 강의 주소  (0) 2010.06.20
Posted by 오늘마감

댓글을 달아 주세요