카테고리 | 게시글 작성 날짜 | 게시글 최근 수정 날짜 | 작성자 |
C/C++ | 2022.03.31. 22:24 | 2023.08.09. 22:09 | Dev.Yang |
🛠 메서드 (Method)
🛠 Objective-C 동작 방식
Objective-C 언어는 C언어를 근간으로 동작하고 있으며 추가적으로 아래의 4가지 조건을 통하여 작동하고 있습니다.
- 첫번째는 인스턴스 변수 (Instance Variable)는 구조체 (Struct)에 저장됩니다.
- 새 클래스와 그에 속한 인스턴스 변수를 정의하면, 이 인스턴스 변수들은 사실 구조체 안에 저장이 됩니다. 실제로는 객체는 인스턴스 변수로 멤버들이 구성 된 구조체로 볼 수 있습니다.
- 구조체의 상속받은 멤버 중에 보호 멤버 isa (루트 객체에게서 상속 받은 정보)가 있는데, 이것이 객체가 속한 클래스를 식별하며 이 멤버가 구조체의 일부이므로 계속 객체에 저장되어 있습니다.
- 두번째는 객체 변수 (Object Variable)는 사실 포인터 (Pointer)입니다.
- 세번째는 메서드 (Method)는 함수이고, 메시지 표현식은 함수 호출입니다.
- 메서드는 사실상 함수이고, 메서드를 호출하면 수신자의 클래스에 연결 된 함수를 호출합니다.
- 네번째는 id형은 일반 포인터 형입니다.
- 객체는 메모리 주소인 포인터로 참조되기 때문에 id 변수에 자유롭게할당할 수 있으며, id를 반환하는 메서드는 결과적으로 메모리의 어느 객체를 가리키는 포인터를 반환합니다.
🛠 카테고리 (Category)
카테고리 (Category)는 클래스 정의를 그룹짓거나, 연관된 메서드를 카레고리로 쉽게 모듈러화 작업을 할 수 있게하는 기능입니다. 또한, 원본 소스 코드에 접근하거나 서브클래스를 생성하지 않고도 기존의 클래스의 정의를 쉽게 확장하는 방법도 제공합니다.
추가적으로 카테고리 (Category)는 클래스에 인스턴스 변수를 추가할 수 없으며 메소드만 추가할 수 있습니다. 대신 클래스 메소드와 인스턴스 메소드를 모두 선언할 수 있습니다.
카테고리 (Category)에 대한 예제 소스코드는 아래와 같습니다.
@interface Fraction : NSObject
@property int numerator, denominator;
- (double) convertToNum;
- (void) print;
@end
@interface Fraction (MathOps)
- (Fraction *) add: (Fraction *) f;
- (Fraction *) minus: (Fraction *) f;
- (Fraction *) sub: (Fraction *) f;
- (Fraction *) div: (Fraction *) f;
@end
🛠 id Type
id 데이터 형은 어떠한 형태의 객체든지 저장할 수 있는 일반 객체형 타입입니다.
🛠 클래스 메서드 (Class Method)
+ (int) print;
함수 반환형의 맨 앞에 "+" 부호를 가진 메서드를 의미합니다.
🛠 인스턴스 메서드 (Instance Method)
- (int) print;
함수 반환형의 맨 앞에 "-" 부호를 가진 메서드를 의미합니다.
🛠 블럭 (Block)
Objective-C에서의 블럭 (Block) 구문은 일종의 코드 묶음을 나타내며 Swift에서의 클로저 (Closure)와 유사합니다.
Objective-C에서의 Block 특징은 아래와 같습니다.
- 변수나 데이터 구조에 포함 시킬 수 있습니다.
- 함수의 파라미터로 전달 할 수 있습니다.
- 반환 값 (Return Value)으로 사용할 수 있습니다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능합니다.
🗂 Basic Block Source Code
아래의 예제 소스코드와 같이 symbol (^) 기호를 사용하여 Block 정의를 시작합니다.
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};
simpleBlock();
🗂 Blocks Take Arguments and Return Values Source Code
매개변수와 반환 값을 가지는 Block에 대한 예제 소스코드는 아래와 같습니다.
double (^multiplyTwoValues)(double, double) = ^(double firstValue, double secondValue) {
return firstValue * secondValue;
};
double result = multiplyTwoValues(2,4);
NSLog(@"The result is %f", result);
int (^addNumbers)(int, int) = ^(int num1, int num2) {
return num1 + num2;
};
int sumResult = addNumbers(5, 7); // result는 12가 됩니다.
NSLog(@"The result is %d", sumResult);
🗂 Use Type Definitions to Simplify Block Source Code
일반적으로 타입 정의를 통하여 자주 사용되는 Block 소스코드 예제입니다.
typedef void (^ResponseBlock)(NSData *data, NSError *error);
@property (nonatomic, strong) ResponseBlock responseBlock;
- (void)startRequestWithCompletion:(ResponseBlock)responseBlock;
순환 참조 방지하기 (Avoid Strong Reference Cycles when Capturing self)
Objective-C에서의 Block 구문은 객체를 강함 참조 (Strong Reference)로 객체를 소유하고 있기 때문에 순환 참조가 발생하여 메모리 누수 (Memory Leak)가 발생할 수 있습니다. 그렇기에 아래와 같이 강함 참조를 약한 참조를 가지는 객체를 생성하여 전달 해주면 순환 참조를 방지할 수 있습니다.
순환 참조 방지를 위한 예제 소스코드는 아래와 같습니다.
- (void)configureBlock {
XYZBlockKeeper * __weak weakSelf = self;
self.block = ^{
[weakSelf doSomething]; // capture the weak reference
// to avoid the reference cycle
}
}
🚀 REFERENCE
'#컴퓨터 과학 [Computer Science] > C/C++' 카테고리의 다른 글
[C/C++] C++ 백터와 배열의 차이점 (C++ Vector and Array Difference) (0) | 2020.02.23 |
---|---|
[C/C++] 시리얼 통신 (Serial Communication) (0) | 2019.09.04 |
[C/C++] INI (Initialization) 파일 (0) | 2019.08.22 |
[C/C++] 전송 제어 프로토콜 (TCP, Transmission Control Protocol) (0) | 2019.06.19 |
C/C++ Computer Language (0) | 2019.05.06 |
댓글