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