[Objective C] Class 구조 파악 및 선언하기
자 옵젝씨의 시간이다.
오브젝티브 C의 포스팅은 프로그래밍 오브젝티브-C 2.0 책의 내용을 정리한 시리즈 형식으로 정리될 예정이다.
Objective C 언어의 Class는 선언부, 구현부로 나뉘어져 있으며 이렇게 작성한 클래스를 사용하기 위해서는 main인 프로그램부분에서 사용하여야 한다.
클래스의 선언부와 구현부를 작성하는 법을 알아보고, 프로그램 부분에서 객체의 인스턴스를 만들어 인스턴스 메서드를 호출해보는 예시를 들어보겠다.
1. @interface
선언부이다.
클래스를 새로 정의할 때 해야할 일이 몇가지 있는데
첫째로 Objective-C 컴파일러에게 클래스가 어디서 왔는지 알려줘야 한다.
두번째로는 이 클래스의 객체를 다룰 때 사용할 작업 또는 메서드를 정의해야한다.
이러한 과정을 @interface 라는 부분에서 수행된다.
@interface 는 보통 다음과 같은 형태로 선언된다.
@interface Fraction: NSObject
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
@end
클래스 이름 뒤에 : 세미콜론 다음에 어떠한 부모클래스를 상속받는지 명시해줘야 하고,
@interface 와 @end 사이에 클래스 매서드를 정의하여 해당 클래스에 어떤 메서드가 있는지 명시해줘야 한다.
메서드의 선언 규칙은 다음과 같다.
2. @implementation
구현부이다.
@interface에서 선언한 메서드의 실제 코드를 담고있다. 앞서 선언한 메서드들의 구현을 해주는 부분이다.
또한 이 부분에서 해당 클래스의 객체가 담을 데이터의 종류도 선언해준다. 인스턴스 변수를 선언해줄 수 있다.
@interface에서 선언한 메서드를 구현하고 인스턴스 변수를 선언하는 형태는 다음과 같다.
@implementation Fraction {
int numerator;
int denominator;
}
- (void) print {
NSLog(@"%i/%i", numerator, denominator);
}
- (void) setNumerator: (int) n {
numerator = n;
}
- (void) setDenominator: (int) d {
denominator = d;
}
@end
3. 클래스 인스턴스 선언, 메서드 호출해보기
해당 클래스를 사용하려면 main에서 선언하고, 메서드를 호출해야한다.
클래스를 선언하고 사용하기 앞서, Objc 언어에선 클래스와 인스턴스에 메서드를 적용할 때 다음 문법을 사용한다.
[ ClassOrInstance method ];
여는 대괄호 다음에 클래스나 클래스의 인스턴스 이름이 나오고, 공백 이후에 수행할 메서드가 나온다.
위에서 구현한 Fraction 클래스의 인스턴스를 사용하면 아래와 같다.
int main(int argc, const char * argv[]) {
@autoreleasepool {
Fraction *myFraction = [Fraction alloc];
myFraction = [myFraction init];
[myFraction setNumerator:3];
[myFraction setDenominator:2];
NSLog(@"The value of myFraction is: ");
[myFraction print];
}
return NSApplicationMain(argc, argv);
}
실행결과
4. @interface 와 @implementation 분리하기
@interface 부분과 @implementation 부분을 하나의 파일에 구현해도 되지만, 효과적이고 깔끔한 코드를 위해 @interface 부분을 헤더로 분리하는 작업이 필요할 것이다.
실제로 예시 작성하느라 위의 코드들은 main.swift에 저장되어있는데, 가독성이 심각하게 안좋으니 헤더를 분리를 해보겠다.
1. Control + N 을 눌러 헤더파일을 생성해주자.
헤더파일에 들어갈 소스코드는 따로 추가된 내용 없이 @interface 부분과 #import <Foundation/Foundation.h> 부분을 분리해주면 된다.
//
// Fraction .h
// objc
//
// Created by 이진하 on 2022/04/12.
//
#import <Foundation/Foundation.h>
@interface Fraction: NSObject
- (void) print;
- (void) setNumerator: (int) n;
- (void) setDenominator: (int) d;
@end
2. Control + N을 눌러 Objc-C 파일을 생성한다.
@implementation 부분을 붙여넣어주면 된다.
다만 기존 코드와 다른점은 전 단계에서 만들었던 헤더파일을 임포트 해주어야 한다.
//
// Fraction.m
//
// Created by 이진하 on 2022/04/11.
//
#import "Fraction.h"
@implementation Fraction {
int numerator;
int denominator;
}
- (void) print {
NSLog(@"%i/%i", numerator, denominator);
}
- (void) setNumerator: (int) n {
numerator = n;
}
- (void) setDenominator: (int) d {
denominator = d;
}
@end
이제 해당 클래스를 쓰려는 곳에서 #import "Fraction.h" 코드와 함께 사용해주면 된다.