자료 저장소

 
Objective-C는 표준 ANSI C를 확장한 객채지향 언어이다.

* 문법에 대해서는 별도 문서 참조. 
 
 
 확장자
 
 .h 헤더파일
 .m 소스파일(C, Objective-C를 기술 가능)
 .mm 소스파일(Objective-C에서 c++클래스를 호출하고자 하는경우에만 사용할것)
 
* 헤더 파일을 소스에 임포트 할때는 #include대신 #import를 사용할 것.
 
 클래스 선언
 
 
클래스의 interface 는 .h에 정의하고 implementation은 .m에 정의 한다.
인터페이스 정의는 @interface로 시작하며 @end로 끝난다.
 
 
 Strong typing과 Weak typing

<Strong typing : 클래스 타입을 확실히 적어주는 것>
MyClass *myObject1;  //Strong typing앞에는 *를 붙여준다
 
<Weak typing : 확실히 모를때 클래스 타입 대신 id라고 적어준다>
id       myObject2; 

Strong typing 만 사용해온 개발자들은 id와 같은 불확실한 타입을 사용함으로써 많은 문제점이 생길꺼라 생각하지만 
사실 이는 Objective-c 프로그래밍을 유연하게 만들어주는 장점중 하나이다.


 메소드 정의 방법
 

 (-) 기호로 시작되는 메소드 타입 식별자는 인스턴트 메소드 임을 의미한다. (+)로 적으면 클래스 메소드.
 메소드명 뒤의 (:)콜론은 이 메소드가 파라매터를 가진다는 것을 의미한다.
 파라매터가 없는 경우 (:)콜론 이후는 생략 가능하다. (아하, API문서 읽기가 어렵더라니... 이런 뜻이었구나)

<호출 하는 예>
[myArray insertObject:anObject atIndex:0];

또한, Objective-C에서는 쓸모없는 임시 변수를 선언하지 않아도 되게끔 메소드의 리턴값을 파라메터로 직접 넘길 수 있다.
괄호 안에 괄호([ [] ])를 넣는 방법.
<예>
[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];

.(도트) 문법도 제공하는데, accessor methods(단순히 클래스 멤버에 억세스 하기 위해 만들어진 메소드, getter or setter)를 호출할때 사용된다.
위의 예제를 .(도트) 문법으로 표현해 보면 아래와 같아진다.
[myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0];

물론 .(도트) 문법은 myAppObject.theArray = aNewArray; 와 같이 사용할 수도 있다.


 클래스 implementation 

<예>
@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
 
 
 프로퍼티 선언

프로퍼티란 accessor methods(클래스 멤버에 접근하기 위한 메소드)를 편하게 implementation 하는 방법이다.

인터페이스안에 메소드와 같이 정의 하면 된다.
<예>
@property BOOL flag;
@property (copy) NSString *nameObject;  // Copy the object during assignment.
@property (readonly) UIView *rootView;  // Declare only a getter method.

위와 같이 선언하면 같은 이름으로 데이터를 꺼내올수 있고, 앞에 set을 붙인 이름으로 데이터를 세팅 가능하다.
set을 붙일때는 프로퍼티명의 첫글자는 대문자가 된다. 예: nameObject 는 setNameObject로 접근.

그리고 나서 클래스 implementation 에서 아래와 같은 선언을 하면 컴파일러에 의해 메소드가 자동 생성된다.
<예>
@synthesize flag;
@synthesize nameObject;
@synthesize rootView;

또는 붙여 쓸수도 있다.
<예>
@synthesize flag, nameObject, rootView;

결국 이런 기능을 이용함으로써 개발자는 accessor methods를 위한 불필요한 코딩을 줄일 수 있다.


 
 String

위에서 언급한 바와 같이 Objective-C는 c의 확장임으로 c의 String을 그대로 사용할 수 있다.
하지만 대부분의 Objective-C 프레임워크에서는 c-style String대신 NSString이라는 독자적인 클래스를 사용한다.

이는 가변길이 문자의 사용, 유니코드 대응, printf와 같은 포멧기능 등의 많은 이점이 있으며 자주 사용하는 클래스이기 때문에
단지 "(더블 쿼테이션) 앞에 @만 붙여줌으로써 생성이 가능하다.

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

 
 Protocols와 Delegates

프로토콜은 다른 클래스에 의해 implement되는 인터페이스로써 그 자체는 클래스가 아니다. 
프로토콜은 필수 또는 옵션 메소드를 선언 할 수 있으며,
아래와 같이 클래스의 인터페이스 선언과 매우 비슷하나 다만 슈퍼클래스를 가지지 않는다.
<예>
@protocol MyProtocol
    - (void)requiredMethod;
@optional
    - (void)anOptionalMethod;
    - (void)anotherOptionalMethod;
@required
    - (void)anotherRequiredMethod;
@end

프로토콜을 사용한다는 것은 그가 가지는 인터페이스를 준수하겠다는 선언이며, 
주로 클래스간의 데이터 전달을 목적으로 하는 클래스에 사용된다.

프로토콜에 대한 자세한 내용은 별도 문서로 있으며, 후에 읽어볼 필요가 있을것이다. (Protocols 문서)

 
이상이 Objective-C에 대한 간단한 소개였으며 앞으로 읽어볼 문서들중에 쉽게 접하게 될 특징들이다. 
물론 이것이 전부는 아니며 자세한 내용은 The Objective-C Programming Language에 나와있다.





'프로그래밍 > Objective C' 카테고리의 다른 글

APPLE :: XML 파싱  (0) 2010.11.10
APPLE :: IPhone On OpenCV  (0) 2010.11.03
APPLE :: Object-C Array  (0) 2010.11.03
APPLE :: Objective-C의 기본문법  (0) 2010.11.01
APPLE :: Objective-C 요약정리 / iPhone SDK 기초 강좌  (0) 2010.09.27
댓글 로드 중…

최근에 게시된 글