1. 헤더 파일과 소스 파일의 분리
Objective-C에서는 클래스를 작성할 때 일반적으로 인터페이스 부분(헤더)과 구현 부분(소스)을 별도의 파일로 나누어 작성한다. 헤더와 소스 파일의 이름은 내부의 정의된 클래스의 이름으로 정해지며, 헤더 파일은 h, 소스 파일은 m 확장자를 사용한다.
2. 헤더 파일 .h
기본적으로 헤더 파일은 다음과 같은 형태로 구성된다.
1 - 상속하고자 하는 부모 클래스를 지정하는 부분. 일반적으로 사용하는 #include가 아닌 #import 지시어를 사용하는 것이 특징이다. #include는 기본적으로 #include와 같지만, 다른 점은 중복선언을 자동으로 처리해주는 것이다. 일반적으로 C나 C++에서 헤더 파일을 선언할 때는 중복선언과 관련된 처리를 해야 하는데 Objective-C에서는 이것이 자동으로 이루어지므로 별도의 작업이 필요하지 않다.
2 - @class는 해당 클래스를 import하지 않고 선언만 해서 사용할 수 있도록 해준다. 해당 클래스의 타입만 이용할 수 있고 인스턴스 변수와 메소드를 모두 이용하려면 #import를 사용해야 한다.
3 - 클래스를 선언하는 부분. 앞의 예에서 보면 @interface에서 시작해 @end까지다. 클래스의 이름 뒤에 부모 클래스의 이름(앞의 예에서는 Shape)을 지정해야 하고, 부모 클래스를 지정할 필요가 없을 때는 NSObject를 지정한다.
4 - 클래스의 인스턴스 변수를 선언하는 부분. NSString은 문자열을 나타내는 타입인데 파운데이 프레임워크에서 제공하는 다양한 클래스 중 가장 많이 쓰이는 것 중 하나다. 클래스에서 변수를 선언하는 경우에는 이와 같이 항상 포인터 타입으로 선언하게 된다. 이에 비해 NSInteger는 포인터 타입으로 선언하지 않는다. 그 이유는 NSIntefer가 클래스가 아닌, 기본 데이터 타입이기 때문이다. NSInteger는 정수를 나타내는 타입이며 실제로 C의 정수형 데이터 타입인 int를 재정의하고 있다.
5 - 클래스의 메소드를 선언하는 부분. 클래스 메소드와 인스턴스 메소드의 두 부분으로 나뉜다.
alloc 메소드는 호출의 주체가 myRectangle이 아닌 Rectangle이다. 이처럼 클래스의 인스턴스가 아닌 클래스 자체로부터 호출되는 메소드를 '클래스 메소드'라고 한다. 클래스 메소드는 메모리를 할당하고 초기화하는 일련의 과정 없이 언제든지 호출할 수 있다. 위의 예에서 alloc 메소드는 루트 클래스인 NSObject에 선언되어 있으므로 따로 선언할 필요가 없는 것이다.
반면에 setName:, setWidth:height:, draw 메소드는 호출의 주체가 Rectangle이 아닌 myRectangle이라는 것에 주목하다. 이처럼 클래스 자체가 아니라 클래스의 인스턴스로부터 호출되는 메소드를 '인스턴스 메소드'라고 한다. 위의 예에서 볼 수 있듯이 인스턴스 메소드를 호출하려면 반드시 메모리를 할당하고 초기화를 해야한다.
클래스 메소드와 인스턴스 메소드를 실제로 사용할 때 다음과 같은 차이가 있다. 클래스 메소드는 실제로 메모리에 할당되고 초기화되는 클래스 인스턴스 없이 바로 호출되므로 인스턴스 변수를 일체 사용할 수 없다. 그러므로 인스턴스 변수가 필요 없는 기능(일반적으로 메모리 할당 및 상태 변경을 하지 않는 메소드)을 구현하는데 사용된다. 반면에 인스턴스 메소드는 내부의 인스턴스 변수를 사용할 수 있다. 대부분의 메소드는 인스턴스 메소드의 형태로 사용된다.
그렇다면 두 메소드는 어떻게 구별할 수 있을까. 클래스 메소드는 맨 앞에 +, 인스턴스 메소드는 -로 시작하는 것을 보고 구분할 수 있다.
메소드를 선언할 때 리턴 타입이나 인자의 타입을 명시하지 않으면 기본 데이터 타입인 id로 인식된다.
C 나 C++와 같은 언어에서 구현한 모습
3. 소스 파일 .m
소스 파일은 기본적으로 다음과 같은 형태를 따른다.
1 - 클래스를 선언하는 헤더 파일을 포함하는 부분.
2 - 클래스의 구현이 시작되는 부분. @implementation에서 시작되어 @end에서 끝난다.
3 - 헤더 파일에서 선언한 메소드를 실제로 구현하는 부분. 이 중에서 세 번째의 setWidth:height: 메소드 구현을 살펴보면 헤더 파일에서 선언한 인스턴스 변수인 width와 height를 사용한다. 즉, 이 메소드를 통해 클래스 인스턴스 변수의 값을 바꿀 수 있다.
draw 메소드의 구현에서는 super 지시어가 사용되고 있다. 여기에서 super는 부모 클래스를 의미한다. 즉, 이 메소드가 실행되면 부모 클래스의 draw 메소드가 호출되어 실행된다(메소드 오버라이딩). 이에 비해 동일 클래스의 메소드를 호출하려면 self 지시어를 사용해야 한다.
출처 - 도전! 아이폰4 프로그래밍
Objective-C에서는 클래스를 작성할 때 일반적으로 인터페이스 부분(헤더)과 구현 부분(소스)을 별도의 파일로 나누어 작성한다. 헤더와 소스 파일의 이름은 내부의 정의된 클래스의 이름으로 정해지며, 헤더 파일은 h, 소스 파일은 m 확장자를 사용한다.
2. 헤더 파일 .h
기본적으로 헤더 파일은 다음과 같은 형태로 구성된다.
1 - 상속하고자 하는 부모 클래스를 지정하는 부분. 일반적으로 사용하는 #include가 아닌 #import 지시어를 사용하는 것이 특징이다. #include는 기본적으로 #include와 같지만, 다른 점은 중복선언을 자동으로 처리해주는 것이다. 일반적으로 C나 C++에서 헤더 파일을 선언할 때는 중복선언과 관련된 처리를 해야 하는데 Objective-C에서는 이것이 자동으로 이루어지므로 별도의 작업이 필요하지 않다.
2 - @class는 해당 클래스를 import하지 않고 선언만 해서 사용할 수 있도록 해준다. 해당 클래스의 타입만 이용할 수 있고 인스턴스 변수와 메소드를 모두 이용하려면 #import를 사용해야 한다.
3 - 클래스를 선언하는 부분. 앞의 예에서 보면 @interface에서 시작해 @end까지다. 클래스의 이름 뒤에 부모 클래스의 이름(앞의 예에서는 Shape)을 지정해야 하고, 부모 클래스를 지정할 필요가 없을 때는 NSObject를 지정한다.
4 - 클래스의 인스턴스 변수를 선언하는 부분. NSString은 문자열을 나타내는 타입인데 파운데이 프레임워크에서 제공하는 다양한 클래스 중 가장 많이 쓰이는 것 중 하나다. 클래스에서 변수를 선언하는 경우에는 이와 같이 항상 포인터 타입으로 선언하게 된다. 이에 비해 NSInteger는 포인터 타입으로 선언하지 않는다. 그 이유는 NSIntefer가 클래스가 아닌, 기본 데이터 타입이기 때문이다. NSInteger는 정수를 나타내는 타입이며 실제로 C의 정수형 데이터 타입인 int를 재정의하고 있다.
5 - 클래스의 메소드를 선언하는 부분. 클래스 메소드와 인스턴스 메소드의 두 부분으로 나뉜다.
alloc 메소드는 호출의 주체가 myRectangle이 아닌 Rectangle이다. 이처럼 클래스의 인스턴스가 아닌 클래스 자체로부터 호출되는 메소드를 '클래스 메소드'라고 한다. 클래스 메소드는 메모리를 할당하고 초기화하는 일련의 과정 없이 언제든지 호출할 수 있다. 위의 예에서 alloc 메소드는 루트 클래스인 NSObject에 선언되어 있으므로 따로 선언할 필요가 없는 것이다.
반면에 setName:, setWidth:height:, draw 메소드는 호출의 주체가 Rectangle이 아닌 myRectangle이라는 것에 주목하다. 이처럼 클래스 자체가 아니라 클래스의 인스턴스로부터 호출되는 메소드를 '인스턴스 메소드'라고 한다. 위의 예에서 볼 수 있듯이 인스턴스 메소드를 호출하려면 반드시 메모리를 할당하고 초기화를 해야한다.
클래스 메소드와 인스턴스 메소드를 실제로 사용할 때 다음과 같은 차이가 있다. 클래스 메소드는 실제로 메모리에 할당되고 초기화되는 클래스 인스턴스 없이 바로 호출되므로 인스턴스 변수를 일체 사용할 수 없다. 그러므로 인스턴스 변수가 필요 없는 기능(일반적으로 메모리 할당 및 상태 변경을 하지 않는 메소드)을 구현하는데 사용된다. 반면에 인스턴스 메소드는 내부의 인스턴스 변수를 사용할 수 있다. 대부분의 메소드는 인스턴스 메소드의 형태로 사용된다.
그렇다면 두 메소드는 어떻게 구별할 수 있을까. 클래스 메소드는 맨 앞에 +, 인스턴스 메소드는 -로 시작하는 것을 보고 구분할 수 있다.
메소드를 선언할 때 리턴 타입이나 인자의 타입을 명시하지 않으면 기본 데이터 타입인 id로 인식된다.
C 나 C++와 같은 언어에서 구현한 모습
3. 소스 파일 .m
소스 파일은 기본적으로 다음과 같은 형태를 따른다.
1 - 클래스를 선언하는 헤더 파일을 포함하는 부분.
2 - 클래스의 구현이 시작되는 부분. @implementation에서 시작되어 @end에서 끝난다.
3 - 헤더 파일에서 선언한 메소드를 실제로 구현하는 부분. 이 중에서 세 번째의 setWidth:height: 메소드 구현을 살펴보면 헤더 파일에서 선언한 인스턴스 변수인 width와 height를 사용한다. 즉, 이 메소드를 통해 클래스 인스턴스 변수의 값을 바꿀 수 있다.
draw 메소드의 구현에서는 super 지시어가 사용되고 있다. 여기에서 super는 부모 클래스를 의미한다. 즉, 이 메소드가 실행되면 부모 클래스의 draw 메소드가 호출되어 실행된다(메소드 오버라이딩). 이에 비해 동일 클래스의 메소드를 호출하려면 self 지시어를 사용해야 한다.
출처 - 도전! 아이폰4 프로그래밍
'프로그래밍 > Object-C' 카테고리의 다른 글
CGRect (0) | 2011.09.01 |
---|---|
아이폰 터치 애플리케이션 예제 (1) | 2011.08.31 |
화면사이즈 얻기 (0) | 2011.06.28 |
TableView 구성 (0) | 2011.06.27 |
화면 상단의 Status Bar 없애기 (0) | 2011.06.27 |