함수 선언은 컴파일러에게 함수의 이름, 반환 유형 및 매개변수에 대해 알려준다. 함수 정의는 함수의 실제 본문을 제공한다.
Objective-C에서는 메소드가 다양한 파라미터를 받을 수 있고, 파라미터 이름은 메소드 이름의 일부분으로 포함된다.
- (리턴타입)메소드이름:(매개변수1 타입)매개변수1 이름
또다른매개변수:(매개변수2 타입)매개변수2 이름
...;
- (int)숫자반환함수:(int)매개변수1 그리고:(int)매개변수2;
// max:withNumber: 함수 선언
- (int)max:(int)num1 withNumber:(int)num2;
헤더 파일에는 클래스의 인터페이스와 메소드 선언을 포함한다. 이 헤더 파일은 클래스의 메소드를 다른 파일에서 사용할 수 있도록 공개하는 역할을 한다.
구현 파일에서는 헤더 파일에 선언된 메소드들을 실제로 구현해 내부 동작을 정의한다.
다른 파일에서 클래스의 메소드를 호출하려면, 호출하는 파일이 해당 메소드의 선언을 알고 있어야 한다. 이를 위해 호출하는 파일에서 클래스의 헤더 파일을 포함해야 한다.
// 헤더 파일 - MyClass.h
@interface MyClass : NSObject
- (int)max:(int)firstNumber withNumber:(int)secondNumber;
@end
// 구현 파일 - MyClass.m
@implementation MyClass
// 메소드 구현
- (int)max:(int)firstNumber withNumber:(int)secondNumber {
if (firstNumber > secondNumber) {
return firstNumber;
} else {
return secondNumber;
}
}
@end
// 호출부
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// MyClass의 인스턴스 생성
MyClass *myObject = [[MyClass alloc] init];
// max:withNumber: 메소드 호출
int result = [myObject max:7 withNumber:12];
// 결과 출력
NSLog(@"The maximum value is: %d", result); // 출력: The maximum value is: 12
}
return 0;
}
전역 함수는 클래스에 속하지 않는 독립적인 함수로 객체의 상태와 무관하게 작업을 수행할 수 있다.
// 전역 함수 선언
void printGreeting(void) {
NSLog(@"Hello, World!");
}
// 전역 함수 호출
int main(int argc, const char * argv[]) {
@autoreleasepool {
printGreeting(); // 함수 호출
}
return 0;
}
클래스에 속하는 함수
Objective-C는 메소드 오버로딩을 지원하지 않는다. 대신, 메소드의 이름과 파라미터(메소드의 서명)를 사용해서 다양한 메소드를 정의할 수 있다. 메소드의 서명이 다르면 서로 다른 메소드로 간주된다.
특정 객체의 인스턴스에 소속된 함수
// MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
// 인스턴스 메소드 선언
- (void)displayMessage;
@end
// MyClass.m
#import "MyClass.h"
@implementation MyClass
// 인스턴스 메소드 구현
- (void)displayMessage {
NSLog(@"This is an instance method.");
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyClass *myObject = [[MyClass alloc] init];
[myObject displayMessage]; // 인스턴스 메소드 호출
}
return 0;
}
클래스 메소드는 클래스 자체에 대해 동작하며, + 기호로 정의, 객체를 생성하지 않고도 호출할 수 있다.
// MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
// 클래스 메소드 선언
+ (void)printClassMessage;
@end
// MyClass.m
#import "MyClass.h"
@implementation MyClass
// 클래스 메소드 구현
+ (void)printClassMessage {
NSLog(@"This is a class method.");
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "MyClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[MyClass printClassMessage]; // 클래스 메소드 호출
}
return 0;
}