λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ₯– Bread Basics/Obj-c

Obj-C 곡식 λ¬Έμ„œ 정리 - ν”„λ‘œν† μ½œ

by BreadDev 2025. 4. 14.
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ΄λ²ˆμ—λŠ” Objective-C의 μ€‘μš”ν•œ κ°œλ… 쀑 ν•˜λ‚˜μΈ ν”„λ‘œν† μ½œ(Protocol)에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. ν”„λ‘œν† μ½œμ€ λ‹€λ₯Έ 객체 μ§€ν–₯ μ–Έμ–΄μ˜ μΈν„°νŽ˜μ΄μŠ€(interface)와 μœ μ‚¬ν•œ κ°œλ…μœΌλ‘œ, ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œ λͺ©λ‘μ„ μ„ μ–Έν•©λ‹ˆλ‹€.

ν”„λ‘œν† μ½œμ΄λž€?

ν”„λ‘œν† μ½œμ€ μ–΄λ–€ ν΄λž˜μŠ€λ“  κ΅¬ν˜„ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•©λ‹ˆλ‹€. 클래슀 μ •μ˜μ™€ 달리 ν”„λ‘œν† μ½œμ€ μ‹€μ œ κ΅¬ν˜„μ„ ν¬ν•¨ν•˜μ§€ μ•Šκ³ , 단지 λ©”μ„œλ“œ μ„ μ–Έλ§Œ μ œκ³΅ν•©λ‹ˆλ‹€.

ν”„λ‘œν† μ½œ(Protocol): ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  수 μžˆλŠ” λ©”μ„œλ“œ λͺ©λ‘μ„ μ„ μ–Έν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. ν΄λž˜μŠ€κ°€ "μ–΄λ–€ κΈ°λŠ₯을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€"λŠ” 계약과 κ°™μŠ΅λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œν† μ½œμ˜ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€

ν”„λ‘œν† μ½œμ€ λ‹€μŒ μ„Έ κ°€μ§€ μƒν™©μ—μ„œ 특히 μœ μš©ν•©λ‹ˆλ‹€:

1. λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  λ©”μ„œλ“œ μ„ μ–Έν•˜κΈ°

ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ κ°œλ°œμžκ°€ κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ„œλ“œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 마우슀 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν”„λ‘œν† μ½œλ‘œ κ·Έλ£Ήν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

- (void)mouseDown:(NSEvent *)theEvent;
- (void)mouseDragged:(NSEvent *)theEvent;
- (void)mouseUp:(NSEvent *)theEvent;

이 λ©”μ„œλ“œλ“€μ„ ν”„λ‘œν† μ½œλ‘œ μ„ μ–Έν•˜λ©΄, 마우슀 μ΄λ²€νŠΈμ— μ‘λ‹΅ν•˜κ³  싢은 μ–΄λ–€ ν΄λž˜μŠ€λ“  이 ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ³  λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 ν”„λ‘œν† μ½œμ΄ 클래슀 계측과 λ…λ¦½μ μ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 상속 계측이 μ•„λ‹Œ, λ™μΌν•œ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ”μ§€ 여뢀에 따라 그룹화될 수 μžˆμŠ΅λ‹ˆλ‹€.

2. 클래슀λ₯Ό μˆ¨κΈ°λ©΄μ„œ 객체의 μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έν•˜κΈ°

ν”„λ‘œν† μ½œμ€ 클래슀의 정체λ₯Ό 숨기고 싢은 **읡λͺ… 객체(anonymous object)**의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄:

  • ν”„λ ˆμž„μ›Œν¬λ₯Ό μ œκ³΅ν•˜λŠ” κ°œλ°œμžλŠ” 클래슀 μ΄λ¦„μ΄λ‚˜ μΈν„°νŽ˜μ΄μŠ€ 파일둜 μ‹λ³„λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우 μ‚¬μš©μžλŠ” ν”„λ‘œν† μ½œμ— μ •μ˜λœ λ©”μ‹œμ§€λ§Œ 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 원격 객체(λ‹€λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 객체)에 λ©”μ‹œμ§€λ₯Ό 보낼 λ•Œ, κ·Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό μ•Œ ν•„μš” 없이 ν”„λ‘œν† μ½œλ§Œ μ•Œλ©΄ λ©λ‹ˆλ‹€.
 
id formatter = [receiver formattingService];

μ—¬κΈ°μ„œ λ°˜ν™˜λœ κ°μ²΄λŠ” 클래슀 정체가 μ—†λŠ” κ°μ²΄μž…λ‹ˆλ‹€. ν”„λ‘œν† μ½œμ€ 이 객체가 응닡할 수 μžˆλŠ” λ©”μ‹œμ§€λ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€.

읡λͺ… 객체(Anonymous Object): 클래슀 이름을 κ³΅κ°œν•˜μ§€ μ•ŠλŠ” 객체둜, ν”„λ‘œν† μ½œμ„ 톡해 μ œκ³΅ν•˜λŠ” κΈ°λŠ₯만 λ…ΈμΆœν•©λ‹ˆλ‹€.

3. κ³„μΈ΅μ μœΌλ‘œ κ΄€λ ¨λ˜μ§€ μ•Šμ€ 클래슀 κ°„μ˜ μœ μ‚¬μ„± μΊ‘μ²˜ν•˜κΈ°

λ•Œλ‘œλŠ” λŒ€λΆ€λΆ„μ˜ μΈ‘λ©΄μ—μ„œ κ΄€λ ¨λ˜μ§€ μ•Šμ€ ν΄λž˜μŠ€λ“€μ΄ λͺ‡ κ°€μ§€ μœ μ‚¬ν•œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

- (NSXMLElement *)XMLRepresentation;
- initFromXMLRepresentation:(NSXMLElement *)xmlString;

μ΄λŸ¬ν•œ λ©”μ„œλ“œλ“€μ€ ν”„λ‘œν† μ½œλ‘œ 그룹화될 수 있으며, κ΅¬ν˜„ 클래슀 κ°„μ˜ μœ μ‚¬μ„±μ€ λͺ¨λ‘ λ™μΌν•œ ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€λŠ” μ‚¬μ‹€λ‘œ μ„€λͺ…될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ ν˜•μ‹μ  ν”„λ‘œν† μ½œ(Formal Protocols)

Objective-CλŠ” ν˜•μ‹μ  ν”„λ‘œν† μ½œμ„ μ„ μ–Έν•˜λŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€. ν˜•μ‹μ  ν”„λ‘œν† μ½œμ€ 언어와 λŸ°νƒ€μž„ μ‹œμŠ€ν…œμ— μ˜ν•΄ μ§€μ›λ©λ‹ˆλ‹€.

ν”„λ‘œν† μ½œ μ„ μ–Έν•˜κΈ°

@protocol μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜•μ‹μ  ν”„λ‘œν† μ½œμ„ μ„ μ–Έν•©λ‹ˆλ‹€:

@protocol ProtocolName
// λ©”μ„œλ“œ μ„ μ–Έ
@end

예λ₯Ό λ“€μ–΄, XML ν‘œν˜„ ν”„λ‘œν† μ½œμ€ λ‹€μŒκ³Ό 같이 μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@protocol MyXMLSupport
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

ν˜•μ‹μ  ν”„λ‘œν† μ½œ(Formal Protocol): μ»΄νŒŒμΌλŸ¬μ™€ λŸ°νƒ€μž„μ— μ˜ν•΄ κ³΅μ‹μ μœΌλ‘œ μΈμ‹λ˜λŠ” ν”„λ‘œν† μ½œμž…λ‹ˆλ‹€.

선택적 ν”„λ‘œν† μ½œ λ©”μ„œλ“œ

ν”„λ‘œν† μ½œ λ©”μ„œλ“œλŠ” @optional ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ νƒμ μœΌλ‘œ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기본적으둜 λͺ¨λ“  λ©”μ„œλ“œλŠ” ν•„μˆ˜(@required)μž…λ‹ˆλ‹€.

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

@optional: ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•  ν•„μš”λŠ” μ—†λŠ” λ©”μ„œλ“œλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.
@required: ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λŠ” ν΄λž˜μŠ€κ°€ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

πŸ“Œ λΉ„ν˜•μ‹μ  ν”„λ‘œν† μ½œ(Informal Protocols)

ν˜•μ‹μ  ν”„λ‘œν† μ½œ 외에도, μΉ΄ν…Œκ³ λ¦¬ μ„ μ–Έμ—μ„œ λ©”μ„œλ“œλ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ λΉ„ν˜•μ‹μ  ν”„λ‘œν† μ½œμ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@interface NSObject (MyXMLSupport)
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

λΉ„ν˜•μ‹μ  ν”„λ‘œν† μ½œμ€ 일반적으둜 NSObject 클래슀의 μΉ΄ν…Œκ³ λ¦¬λ‘œ μ„ μ–Έλ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ NSObjectμ—μ„œ μƒμ†λ°›λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œ 이름을 κ΄‘λ²”μœ„ν•˜κ²Œ μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΉ„ν˜•μ‹μ  ν”„λ‘œν† μ½œ(Informal Protocol): μΉ΄ν…Œκ³ λ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜λœ ν”„λ‘œν† μ½œλ‘œ, μ»΄νŒŒμΌλŸ¬λ‚˜ λŸ°νƒ€μž„μ— μ˜ν•œ κ°•μ œμ„±μ΄ μ—†μŠ΅λ‹ˆλ‹€.

λΉ„ν˜•μ‹μ  ν”„λ‘œν† μ½œμ€ 컴파일 μ‹œκ°„μ— νƒ€μž… μ²΄ν¬λ‚˜ λŸ°νƒ€μž„μ— ν”„λ‘œν† μ½œ μ€€μˆ˜ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” κΈ°λŠ₯κ³Ό 같은 μ–Έμ–΄ 지원을 많이 λ°›μ§€ λͺ»ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이점을 μ–»μœΌλ €λ©΄ ν˜•μ‹μ  ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œν† μ½œ 객체(Protocol Objects)

ν΄λž˜μŠ€κ°€ λŸ°νƒ€μž„μ— 클래슀 객체둜 ν‘œν˜„λ˜κ³  λ©”μ„œλ“œκ°€ μ…€λ ‰ν„° μ½”λ“œλ‘œ ν‘œν˜„λ˜λŠ” κ²ƒμ²˜λŸΌ, ν˜•μ‹μ  ν”„λ‘œν† μ½œμ€ νŠΉλ³„ν•œ 데이터 νƒ€μž…μΈ Protocol 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€.

μ†ŒμŠ€ μ½”λ“œμ—μ„œ @protocol() μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œν† μ½œ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);

ν”„λ‘œν† μ½œ 객체(Protocol Object): λŸ°νƒ€μž„μ— ν”„λ‘œν† μ½œμ„ λ‚˜νƒ€λ‚΄λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œν† μ½œ 채택과 μ€€μˆ˜

ν”„λ‘œν† μ½œ μ±„νƒν•˜κΈ°(Adopting a Protocol)

ν΄λž˜μŠ€κ°€ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜λ €λ©΄ μ„ μ–Έμ—μ„œ μƒμœ„ 클래슀 이름 뒀에 κΊΎμ‡  κ΄„ν˜Έ μ•ˆμ— ν”„λ‘œν† μ½œμ„ λ‚˜μ—΄ν•©λ‹ˆλ‹€:

@interface ClassName : ItsSuperclass <protocol list>

μΉ΄ν…Œκ³ λ¦¬λ„ λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ ν”„λ‘œν† μ½œμ„ μ±„νƒν•©λ‹ˆλ‹€:

@interface ClassName (CategoryName) <protocol list>

μ—¬λŸ¬ ν”„λ‘œν† μ½œμ„ λ™μ‹œμ— 채택할 수 있으며, ν”„λ‘œν† μ½œ λͺ©λ‘μ˜ 이름은 μ‰Όν‘œλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€:

@interface Formatter : NSObject <Formatting, Prettifying>

ν”„λ‘œν† μ½œ 채택(Adopting a Protocol): ν΄λž˜μŠ€κ°€ ν”„λ‘œν† μ½œμ— μ„ μ–Έλœ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  것을 μ•½μ†ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν”„λ‘œν† μ½œ μ€€μˆ˜ν•˜κΈ°(Conforming to a Protocol)

ν΄λž˜μŠ€κ°€ ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜κ±°λ‚˜ ν”„λ‘œν† μ½œμ„ μ±„νƒν•œ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μƒμ†λ°›μœΌλ©΄ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œλ‹€κ³  ν•©λ‹ˆλ‹€. 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” ν΄λž˜μŠ€κ°€ μ€€μˆ˜ν•˜λŠ” 것과 λ™μΌν•œ ν”„λ‘œν† μ½œ μ„ΈνŠΈλ₯Ό μ€€μˆ˜ν•©λ‹ˆλ‹€.

객체가 ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ conformsToProtocol: λ©”μ‹œμ§€λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€:

if (![receiver conformsToProtocol:@protocol(MyXMLSupport)]) {
    // 객체가 MyXMLSupport ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜μ§€ μ•ŠμŒ
}

ν”„λ‘œν† μ½œ μ€€μˆ˜(Conforming to a Protocol): ν΄λž˜μŠ€κ°€ ν”„λ‘œν† μ½œμ— μ„ μ–Έλœ λͺ¨λ“  ν•„μˆ˜ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

ν”„λ‘œν† μ½œμ„ μ΄μš©ν•œ νƒ€μž… 체크

객체의 νƒ€μž… 선언은 ν˜•μ‹μ  ν”„λ‘œν† μ½œμ„ ν¬ν•¨ν•˜λ„λ‘ ν™•μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€:

- (id <Formatting>)formattingService;
id <MyXMLSupport> anObject;

이 ꡬ문을 μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ ν”„λ‘œν† μ½œ μ€€μˆ˜λ₯Ό 기반으둜 νƒ€μž…μ„ 검사할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

id <Formatting> anObject;

이 선언은 클래슀 κ³„μΈ΅μ˜ μœ„μΉ˜μ— 관계없이 Formatting ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” λͺ¨λ“  객체λ₯Ό ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ κ·Έλ£Ήν™”ν•©λ‹ˆλ‹€.

두 νƒ€μž…μ„ 단일 μ„ μ–Έμ—μ„œ κ²°ν•©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

Formatter <Formatting> *anObject;

πŸ“Œ κ³ κΈ‰ ν”„λ‘œν† μ½œ κΈ°λŠ₯

ν”„λ‘œν† μ½œ λ‚΄μ˜ ν”„λ‘œν† μ½œ(Protocols Within Protocols)

ν•˜λ‚˜μ˜ ν”„λ‘œν† μ½œμ΄ λ‹€λ₯Έ ν”„λ‘œν† μ½œμ„ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€:

@protocol ProtocolName <protocol list>

예λ₯Ό λ“€μ–΄, Paging ν”„λ‘œν† μ½œμ΄ Formatting ν”„λ‘œν† μ½œμ„ ν¬ν•¨ν•œλ‹€λ©΄:

@protocol Paging <Formatting>

Paging ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•˜λŠ” λͺ¨λ“  κ°μ²΄λŠ” Formatting ν”„λ‘œν† μ½œλ„ μ€€μˆ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν”„λ‘œν† μ½œ 포함(Protocol Incorporation): ν•œ ν”„λ‘œν† μ½œμ΄ λ‹€λ₯Έ ν”„λ‘œν† μ½œμ„ ν¬ν•¨ν•˜μ—¬ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ˜ λͺ¨λ“  μš”κ΅¬μ‚¬ν•­μ„ μƒμ†λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€λ₯Έ ν”„λ‘œν† μ½œ μ°Έμ‘°ν•˜κΈ°(Forward Declaration)

λ³΅μž‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž‘μ—… μ‹œ μˆœν™˜ μ°Έμ‘° λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 경우 @protocol μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•œ ν”„λ‘œν† μ½œμ— λŒ€ν•œ μ „λ°© μ°Έμ‘°λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€:

@protocol B;

@protocol A
- foo:(id <B>)anObject;
@end

μ „λ°© μ°Έμ‘°(Forward Declaration): ν”„λ‘œν† μ½œμ˜ μ‹€μ œ μ •μ˜ 전에 μ΄λ¦„λ§Œ μ„ μ–Έν•˜μ—¬ μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν•΄λ‹Ή ν”„λ‘œν† μ½œμ΄ λ‚˜μ€‘μ— μ •μ˜λ  κ²ƒμž„μ„ μ•Œλ¦¬λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

마무리

ν”„λ‘œν† μ½œμ€ Objective-Cμ—μ„œ μ½”λ“œμ˜ μœ μ—°μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ κ°œλ°œμžλ“€μ΄ κ΅¬ν˜„ν•΄μ•Ό ν•  λ©”μ„œλ“œλ₯Ό λͺ…ν™•ν•˜κ²Œ μ •μ˜ν•˜κ³ , 클래슀의 정체λ₯Ό μˆ¨κΈ°λ©΄μ„œλ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λ©°, κ³„μΈ΅μ μœΌλ‘œ κ΄€λ ¨λ˜μ§€ μ•Šμ€ 클래슀 κ°„μ˜ μœ μ‚¬μ„±μ„ μΊ‘μ²˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.