본문 바로가기

개발/Objective-C

Objective-C 기초


Objective-C(이하 OC)의 기초

- 파일 확장자

  • *.h : 선언이 들어가 있는 헤더 파일
  • *.m : OC 또는 C 소스 파일
  • *.mm : C++ 소스 파일


- #import

  • #include는 잊어라...#import를 쓰면 해당 *.h 파일이 한번만 포함되도록 해준단다


- Comments

  • 주석을 달때는 //을 쓰라고 한다


- Class

  • 객체를 표현하기 위한 선언
  • 멤버 변수 선언은 기존의 C++과 거의 흡사
  • 프로퍼티나 메소드 선언은 C++과 매우 다름
  • 자신은 self, 부모는 super로 접근 가능
  • 아래 선언 예제 즉 *.h 파일에 들어가는 내용


  • 아래는 구현 예제 즉 *.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

- Instance

  • 클래스 선언대로 만든 객체이다...실제로 메모리에 올라가는 넘
  • new가 없다...미치...- _-;; alloc을 쓰란다...또 alloc으로 메모리 잡은 다음에 반드시 init 메소드도 호출해줘야 된단다...언어가 약간 구세대 적인 듯...
  • 아래는 예제이다..

id anObject = [SomeClass alloc];
[anObject init];
[anObject someOtherMessage];

- Method

  • 객체가 가지는 함수
  • 인스턴스 메소드 : 클래스로 선언된 변수 즉 인스턴스를 그 적용 범위로 갖는 메소드(메모리에 올라갔다고 생각하면 쉽다)
  • 클래스 메소드 : 인스턴스로 실행될 필요가 없는 메소드(이른바 static method 라는 것으로 산술 함수 모음을 클래스로 정의 한다던가 할 때 유용하다. 가끔 생성자를 스태틱으로 따로 만들어서 사용하는 경우가 있는데...본인은 그런 구조가 머리 아프게 하는 원인 중 하나라고 본다...뭐 고수들이 만든 코드니 이유가 있겠지만...)
  • 리턴 타입을 명기 하지 않으면 (id) 타입을 리턴 한다고...(포인터로 이해하면 되려나???)
  • override는 그냥 상속 받을때 같은 이름으로 만들면 된다고...
  • (주)사과에서 제공하는 문서엔 overloading에 대한 언급이 안보인다...안되는 모양...그냥 다른 이름으로 만들자...
  • 메소드 선언 형식은 아래 그림을 참조


    • 메소드 타입 : -는 인스턴스 메소드, +는 클래스 메소드
    • 리턴 타입 : void 니까 아무 것도 리턴 안함
    • insertObject:atIndex: : atIndex는 물론 2개의 :도 함수명에 속한다...특이하다...- _-;; 함수명 저따위로 만들지 말자...
    • (id), (NSUInteger) : 파라미터 데이터 타입

---------------------------------------------------------------------------------------

객체[Object]와 인스턴스[Instance]

객체와 인스턴스는 객체지향 프로그래밍에서는 거의 비슷한 개념으로 사용되지만 엄밀히 말하면 조금은 차이가 있는 개념이다.
객체지향 프로그래밍이 생성된 원인이 사람의 사고와 가장 비슷하게 프로그래밍을 하기 위해서라고 할 수 있다.
즉 우리 실생활의 모든 것들이 전부 객체로 이루어진 것이다.
넓은 의미에서의 객체라는 것은 보고 만질 수 있고, 이해할 수 있으며 생각이나 행동이 추구하는 바를 의미한다.
즉 객체라는 것은 우리가 인지 하고 있는 구체적인 사물이나 시스템이 될 수도 있고,
구체적이지만 물리적으로 경계가 모호한 강, 안개 등도 객체라 할 수 있는 것이다.
인스턴스란, 예로 우리는 하나의 청사진이 되는 클래스를 정의하면
이 클래스에서 각각 구별이 되는 인스턴스를 얼마든지 만들어 낼 수 있는 것이다.
사람이라는 클래스가 있다면 세계 50억명 이상의 각 개인들의 인스턴스가 있는 것이다.
인스턴스란 클래스의 정의를 통해 만들어진 객체를 의미하는 것이다.
class Test { Person p1;
// Person 타입의 객체
p1 = Person();
// 인스턴스
}
 
객체지향 프로그래밍적인 관점에서 객체는 클래스의 타입으로 선언되었을 때를 의미하는 것이고,
객체가 메모리에 할당되어 실제 사용될 때를 인스턴스라고 하는 것이다.
즉, 인스턴스는 추상화 개념 또는 클래스 객체, 컴퓨터 프로세스 등과 같은 템플릿이 실제 구현된 것이다.
인스턴스화는 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음,
그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해, 인스턴스를 만드는 것을 의미한다.
 
-몇몇 필자들은, 객체지향 프로그래밍에서 클래스를 인스턴스화 한다는 것이,
클래스의 구체적인 인스턴스, 즉 객체를 만드는 것이라고 말한다.
그 객체는 컴퓨터 내에서 실행시킬 수 있는 실행 파일이다.
 
-객체지향 프로그램 언어인 자바에서는, 클래스로부터 인스턴스화된 객체를,
객체라는 말 대신에 역시 클래스라고 부름으로써 많은 사용자들을 혼란스럽게 한다.
즉 자바에서는, 특정한 클래스를 만들기 위해 클래스를 인스턴스화하며, 그것도 컴퓨터 내에서 동작하는 실행 파일이다.
-객체지향 프로그래밍 개념이 나오기 이전의 데이터 모델링이나 프로그래밍에서는,
인스턴스화라는 것이 관계형 데이터베이스 테이블 내에 새로운 엔트리를 만듦으로써
추상화된 객체로부터 실재(데이터가 들어있는) 객체를 만드는 것도, 한 가지 용례였다.

---------------------------------------------------------------------------------------

 

 


- Messaging

  • 고상한 명칭이지만 객체의 멤버 함수를 호출하는 것을 말한다
  • 대괄호([])로 묶어 주면 된다
  • C, C++ 형식을 사용해도 되는 모양이다...- _-;;;;;
  • 아래 예제

[myArray insertObject:anObject atIndex:0];

  • 아래 세 예제는 모두 같은 내용이다

[[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0];
[myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0];
myAppObject.theArray = aNewArray;

- Property

  • 객체의 멤버 변수. 그 중 외부에서 접근 할 수 있는 것 들 이라 생각하면 됨
  • 아래 예제

@property BOOL flag;
@property (copy) NSString *nameObject;  // Copy the object during assignment.
@property (readonly) UIView *rootView;  // Declare only a getter method.

  • 구현부에서 아래 예제처럼 해주면 프로퍼티와 같은 이름의 getter 멤버 함수와 set<프로퍼티명> 의 이름으로 setter 함수를 자동으로 만들어 준다

@synthesize flag, nameObject, rootView;

  • 프로퍼티에 접근할 때 겟터, 셋터 멤버 함수를 통하여 접근하도록 하는 것은 추후 코드 수정에 편이를 가져오지만 귀찮기 그지 없는...뭐 몇 줄 줄어든다고 보면 되겠다...
  • 프로퍼티 접근 함수를 직접 작성하거나 실행 중에 함수 id를 대입 한다던가 하려면 @synthesize 대신에 @dynamic이라고 해주면 된다.
  • 위의 예제 중 @property 바로 뒤에 () 안에 든 것 들이 있다. 이것을 통하여 프로퍼티의 성질을 정의 할 수 있다.
  • 아래 예제

@property (getter=suckAss, setter=fuckAss, readwrite, copy) NSObject *ass;

  • 뭐 뭐 들어갈 수 있는지는 아래와 같으며 asign, retain, copy는 택일...프로퍼티가 객체 형일 때 객체 id를 넘겨 받느냐, retain 함수 리턴 값을 받느냐, 아니며 새로 하나 만들어서 거기다 복사해서 넣느냐의 차이다


 속성 내용
 getter=getter명, setter=setter명
 겟터, 셋터 함수명을 내맘대로
 readonly  읽기 전용. 셋터 따위 안만듬
 readwrite  기본값. 겟터, 셋터 둘 다 만듬
 assign  기본값. 포인터를 받는다고 보면 됨
 retain  아래 자세히 설명. 사실 상 거의 안쓸 분위기
 copy  복사!
 atomic  기본값. 멀티쓰래드 상에서 안전 접근위해 주절주절...
 nonatomic  안전불감 주절주절...안써!
  • 객 체의 retain 함수는 자기 id를 리턴하긴 하는데 대신 레퍼런스 카운트...그러니까 누가 날 쓰고 있다는 카운트를 하나 증가 시킨다...하지만...귀찮은 메모리 관리는 가비지 콜렉터를 당근 온시켜서 알아서 하게 할게 분명하니...가비지 콜렉터를 켜놓으면 동작하지 않는다고 한다...닥 (copy) 아니면 안쓰는거다...

     --- 하지만 xcode에서는 레퍼런스 카운팅으로 메모리를 관리해주기 때문에 필수적이다. 중요~!


- String

  • 기본적인 문자열 표현은 C언어와 같다
  • NSString이라는 문자열 처리 클래스가 존재하며 아마도 주로 이놈만 쓰게 될 것
  • NSString으로 문자열 생성 예제는 아래와 같다

// Create an Objective-C string from a C string
NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

- Protocol

  • Java 해본 사람은 개념 잡기 쉽다...한마디로 가상함수만 가지고 있는 클래스 비스무리 한것으로 보면 된다.
  • 프로토콜은 메소드 선언만을 가지고 있다
  • 클래스를 선언 할때 이 프로토콜을 정의 해주면 프로토콜에 선언만 되어 있는 메소드를 꼭 구현해줘야 한다. 안하면 컴파일 시 에러가 난다는 얘기
  • 그다지 좋아 보이지 않는데...여튼 용법은 더 공부해 볼 일이다...차라리 자바의 가상 함수가 더 좋아 보인다
  • 아래는 선언 예제 @optional 아래 넘들은 안해줘도 그만...@required 아래 넘들은 필수...아무것도 안쓰면 @required가 된다

@protocol MyProtocol
 
- (void)requiredMethod;
 
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
 
@required
- (void)anotherRequiredMethod;
 
@end

  • 아래 처럼 클래스를 선언하면 해당 클래스는 구현부에 Formatting, Prettifying 두 프로토콜이 가지고 있는 메소드 들을 구현해주어야 한다

@interface Formatter : NSObject < Formatting, Prettifying >
@end

- Category

  • 메소드를 추가한 클래스 변종을 만들어 내는 방법이다
  • 기존 클래스에 카테고리 명만 붙여서 메소드 추가한 변종을 만 들 수 있다
  • 메소드만 가능하다...변수는 안됨
  • 아래 예제는 ClassName이라는 클래스에 CategoryName이라는 카테고리명을 붙여서 변종을 만들어낸 예이다

#import "ClassName.h"
 
@interface ClassName ( CategoryName )
// method declarations
@end

  • 위 예제는 *.h파일에 들어간다...구현 파일에는 아래와 같이 사용되게 된다

#import "ClassName+CategoryName.h"
 
@implementation ClassName ( CategoryName )
// method definitions
@end

  • 카테고리 명을 주기 귀찮으면 ()만 써놔도 된다...이를 Extension이라 부르며...왜 명칭을 따로 하는지는 모르겠다...- _-;;


- for

  • 다른 언어에서 종종 지원되는 어레이를 뒤지는 기능이 가능하다
  • 아래는 예제 투척...in 뒤에 있는 어레이 숫자만큼 돈다...

NSArray *array = [NSArray arrayWithObjects:
        @"One", @"Two", @"Three", @"Four", nil];
 
for (NSString *element in array) {
    NSLog(@"element: %@", element);
}
 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    @"quattuor", @"four", @"quinque", @"five", @"sex", @"six", nil];
 
NSString *key;
for (key in dictionary) {
    NSLog(@"English: %@, Latin: %@", key, [dictionary valueForKey:key]);
}
NSArray *array = [NSArray arrayWithObjects:
        @"One", @"Two", @"Three", @"Four", nil];
 
NSEnumerator *enumerator = [array reverseObjectEnumerator];
for (NSString *element in enumerator) {
    if ([element isEqualToString:@"Three"]) {
        break;
    }
}
 
NSString *next = [enumerator nextObject];
// next = "Two", 뒤집어서 "Three"에 멈췄으니 다음은 "Two"다...

- Exception

  • 양날의 검이자 전가의 보도인 익셉션 핸들링이 된다...
  • 예제 투척...

Cup *cup = [[Cup alloc] init];
 
@try {
    [cup fill];
}
@catch (NSException *exception) {
    NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
}
@finally {
    [cup release];
}

  • 익셉션을 발생시킬 수도 있다. 아래 예제

NSException *exception = [NSException exceptionWithName:@"HotTeaException"
                            reason:@"The tea is too hot"  userInfo:nil];
@throw exception;

- Selector

  • 뭔지 잘 이해가...실제 코드를 보면서 다시 공부해봐야 할 듯...


- Types

  • 기본적으로는 C와 같다
  • 기타 등등은 아래...


 Type  Definition
 id  포인터라 이해하면 되는 듯
 Class  클래스 포인터...걍 id만 쓰자 좀...
 SEL  좀 더 공부 해봐야 알 듯...
 IMP  멤버 함수 포인터...id만 쓰자니깐...
 BOOL  YES, NO라는 점에 주의하자...


* 기존 C++ 프로그래머들은 C에 가까운 코딩을 해왔기 때문에(뭐라고? 제대로 배운 사람들은 아니라고? 아님 말고...) 자바를 좀 파본 사람들이 더 쉽게 접근하지 않을까 싶은...기본은 기본이고...실제 용례들을 더 자세히 알아봐야 겠다

 

정리가 잘되어 있어 퍼왔음. 


* 많은 내용이 책 또는 검색 후 개인적인 생각을 포함하여 개인용도로 쉽게 찾아보기 위해 정리한 것입니다.

본의 아니게 정리도중 출처를 읽어버린 경우가 있어 출처를 밝히지 못한 곳도 있으니 양해바랍니다.

문제가 될 경우 댓글 달아주시면 삭제/보완처리를 하겠습니다.

감사합니다.

 

'개발 > Objective-C' 카테고리의 다른 글

오브젝의 시작 - 맥부기 펌  (0) 2010.11.10
오브씨 카테고리 추가  (0) 2010.11.10
OBJECT-C 아키텍쳐  (0) 2010.09.06
delegate  (0) 2010.09.06
Object-c에서의 delegate  (1) 2010.09.06