μλ νμΈμ. μ΄λ²μλ 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μμ μ½λμ μ μ°μ±κ³Ό μ¬μ¬μ©μ±μ λμΌ μ μμ΅λλ€. λ€λ₯Έ κ°λ°μλ€μ΄ ꡬνν΄μΌ ν λ©μλλ₯Ό λͺ ννκ² μ μνκ³ , ν΄λμ€μ μ 체λ₯Ό μ¨κΈ°λ©΄μλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ©°, κ³μΈ΅μ μΌλ‘ κ΄λ ¨λμ§ μμ ν΄λμ€ κ°μ μ μ¬μ±μ μΊ‘μ²ν μ μμ΅λλ€.
'π₯ Bread Basics > Obj-c' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Obj-C 곡μ λ¬Έμ μ 리 - μ€λ λ©κ³Ό λκΈ°ν (0) | 2025.04.14 |
---|---|
Obj-C 곡μ λ¬Έμ μ 리 - μμΈ μ²λ¦¬ (1) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - μ λ ν°(Selector) (0) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - μ μ λμ μ΄ν΄νκΈ° (0) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - λΉ λ₯Έ μ΄κ±°(Fast Enumeration) (0) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - μ°κ΄ μ°Έμ‘°(Associative References) (0) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - Categoriesμ Extensions (0) | 2025.04.14 |
Obj-C 곡μ λ¬Έμ μ 리 - μ μΈλ νλ‘νΌν°(Declared Properties) (0) | 2025.04.14 |