본문 바로가기
#컴퓨터 과학 [Computer Science]/C/C++

[ObjectiveC] Objective-C 요약

by cy_mos 2022. 3. 31.
반응형
카테고리 게시글 작성 날짜 게시글 최근 수정 날짜 작성자
C/C++ 2022.03.31. 22:24 2023.08.09. 22:09 Dev.Yang

 

🛠 메서드 (Method)

Learn Objective-C: Methods (in Detail) - https://www.binpress.com/objective-c-methods/


🛠 Objective-C 동작 방식

Objective-C 언어는 C언어를 근간으로 동작하고 있으며 추가적으로 아래의 4가지 조건을 통하여 작동하고 있습니다. 

 

  • 첫번째인스턴스 변수 (Instance Variable)는 구조체 (Struct)에 저장됩니다.
    • 새 클래스와 그에 속한 인스턴스 변수를 정의하면, 이 인스턴스 변수들은 사실 구조체 안에 저장이 됩니다. 실제로는 객체는 인스턴스 변수로 멤버들이 구성 된 구조체로 볼 수 있습니다.
    • 구조체의 상속받은 멤버 중에 보호 멤버 isa (루트 객체에게서 상속 받은 정보)가 있는데, 이것이 객체가 속한 클래스를 식별하며 이 멤버가 구조체의 일부이므로 계속 객체에 저장되어 있습니다.
  • 두번째객체 변수 (Object Variable)는 사실 포인터 (Pointer)입니다.
  • 세번째메서드 (Method)는 함수이고, 메시지 표현식은 함수 호출입니다.
    • 메서드는 사실상 함수이고, 메서드를 호출하면 수신자의 클래스에 연결 된 함수를 호출합니다.
  • 네번째id형은 일반 포인터 형입니다.
    • 객체는 메모리 주소인 포인터로 참조되기 때문에 id 변수에 자유롭게할당할 수 있으며, id를 반환하는 메서드는 결과적으로 메모리의 어느 객체를 가리키는 포인터를 반환합니다.

🛠 카테고리 (Category)

카테고리 (Category)는 클래스 정의를 그룹짓거나, 연관된 메서드를 카레고리로 쉽게 모듈러화 작업을 할 수 있게하는 기능입니다. 또한, 원본 소스 코드에 접근하거나 서브클래스를 생성하지 않고도 기존의 클래스의 정의를 쉽게 확장하는 방법도 제공합니다.

 

iOS 12-3 Objective-C 강좌 18-class extension

추가적으로 카테고리 (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)

Blocks (C language extension)

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

더보기
 

Learn Objective-C: Methods (in Detail)

The majority of the following text is derived from Apple’s authoritative guide on the Objective-C language—The Objective-C Programming Language*: Chapter 1: Objects, Classes, and Messaging.* Message Syntax You send a message to an object to have it do

www.binpress.com

 

프로그래밍 오브젝티브 C 2.0

오브젝티브-C의 안내서!스티븐 코찬의 『프로그래밍 오브젝티브-C 2.0』. 맥 OS X뿐 아니라, 아이폰 응용 프로그램을 개발할 때 사용하는 표준 프로그래밍 언어면서, 강력하고 단순한 객체 지향 프

book.naver.com

 

[Objective-C]클래스 확장 - Category, Extension

카테고리 카테고리는 클래스 선언 부분 중 특정 부분에 따로 이름을 붙이는 방법입니다. 자바에서 클래스를 하나의 묶음으로 선언해야 사용할 수 있지만 오브젝티브C에서는 클래스를 여러 개의

minsone.github.io

 

[Objective-C]Block 객체 사용하기

블록 객체는 C언어의 확장이며 비표준입니다.(wikipedia 참조) 다른 언어에서 클로저(closure) 또는 익명함수, 람다함수, 일급 객체(first-class object)라고 합니다. 우선 Objective-C에서 다루므로 블록 객체

minsone.github.io

 

Working with Blocks

Working with Blocks An Objective-C class defines an object that combines data with related behavior. Sometimes, it makes sense just to represent a single task or unit of behavior, rather than a collection of methods. Blocks are a language-level feature add

developer.apple.com

반응형

댓글