개요
언어를 처음 공부할 때처럼 그언어의 규칙, 특징, 간단한 문법에 대해서 알아보겠다.
Objective-C란?
옵젝시는 스위프트 이전에 애플 세상에서 사용하던 프로그래밍 언어이다.
애플 세상에서 옵젝씨가 돌아가기 위해서는 기본 클래스와 운영체제를 컨트롤하는 Foundation과
UIKit과 AppKit이라는 GUI 컨트롤 프레임워크가 필요하다.
객체의 개념을 뺀다면 기본적으로 C언어와 유사하다.
기본적인 문법은 같으므로 객체지향적인 부분부터 보겠다.
클래스 정의
옵젝시에서 클래스 정의는 interface 섹션과 implementation 섹션으로 나눌 수 있다.
말 그대로 선언과 구현부로 나눠진 것인데 보통 interface는 헤더파일에 implementation은 소스파일에 작성한다.
interface
@interface exHo : NSObject
{
int ho;
}
- (void) printHo;
- (int) getHo;
- (void) setHo: (int) n;
@end
@interface와 @end는 시작과 끝을 의미한다.
옵젝시에서 @로 시작하는 단어는 컴파일러 지시자로 컴파일러에게 특정 작업을 할것이라고 알려주는 역할을한다.
메소드 맨 처음의 -는 인스턴스 메소드임을 알려준다. 클래스 메소드는 + 표시로 시작한다.
implementation
@implementation exHo
- (void) printHo
{
NSLog(@"ex: %d\n", ho);
}
- (int) getHo;
{
return ho;
}
- (void) setHo: (int) n
{
ho = n;
}
@end
사용
int main(int argc, const char * argv[]) {
@autoreleasepool {
exHo *ho = [[exHo alloc] init];
[ho printHo];
[ho setHo:10];
[ho printHo];
}
return 0;
}
옵젝시에서 오브젝트는 힙공간에 생성된다. 따라서 포인터 변수로 선언을 해야한다.
포인터가 없다면 컴파일러는 스택영역에 오브젝트를 만드는 것이라고 생각하는데 옵젝시에서는 오류이다.
메소드를 실행하기 위해 옵젝시는 메시징이라는 시스템을 이용하는데 이는 Smalltalk라는 언어에서 따온것이다.
메시징을 사용하면 함수를 호출하는 대신 메시지를 오브젝트에 보내게 되는데 [receiver message]형태이다.
따라서 위의 예시에서는 ho라는 객체에 printHo라는 메시지를 보내는 것이다.
Receiver과 message는 컴파일 시간에 서로 연결되지 않는다.
Receiver는 클래스의 인스턴스를 가리키는 포인터이다.
즉 Message는 메소드 이름만 의미하고 어떤 클래스라는 것은 모른다. 그리고 런타임에 메시징을 통해 연결된다.
따라서 없는 메소드를 적는다면 컴파일은 되어 실행까진 될것이다. 런타임 오류가 나겠지만
메모리 관리
다른 언어들처럼 힙 메모리를 다썼으면 반환을 해줘야한다.
옵젝시에서는 RC를 사용하는데 스위프트의 ARC랑 비슷한 개념같다.
레퍼런스 카운트를 증가 감소시키는 메소드는 retain과 release가 있다.
NSString
옵젝시에서는 NSString 인스턴스 상수를 문자열 상수로 사용한다.
CString의 개념으로 @를 붙이면 된다.
id
id는 포인터를 포함한 자료형이다.
예를들어 NSString * a == id a 인 셈이다.
bool과 BOOL
bool은 C99 표준의 true / false를 구분하는 자료형이고
BOOL은 옵젝시의 타입으로 YES / NO를 사용한다.
unsigned char를 typedef하여 만든 자료형이다. 옵젝시에서는 이걸 쓰도록하자.
SEL
이 자료형은 seletor의 줄임말로 옵젝시의 메소드 이름을 담을 수 있다.
메소드 이름은 selector라고도 불리는데 여러 메소드 중에서 하나의 코드를 선택해서 실행할 때가 있기 때문이다.
문자열 처리에 드는 성능상의 이슈로 SEL을 사용할 때가 있다.
메소드 이름을 SEL 변수에 담기 위해서는 컴파일러 지시자 @selector()를 사용한다.
SEL ho = @selector( hohoho );
NSLog
NSLog는 Foundation 프레임워크에서 정의된 문자열 출력함수로 터미널 창에 콘솔로그를 남긴다.
출력할 때 서식 문자열은 C문자열 대신 NSString을 사용한다.
NSLog는 자동으로 마지막에 줄바꿈을 넣는다. NSLog에서 %@를 사용하면 해당오브젝트의 description을 출력한다.