Obj-C 곡μ λ¬Έμ μ 리 - κ°μ²΄, ν΄λμ€, λ©μμ§
Objective-C κΈ°μ΄: κ°μ²΄, ν΄λμ€, λ©μμ§ μ΄ν΄νκΈ°
μλ νμΈμ! μ€λμ Objective-Cμ ν΅μ¬ κ°λ μΈ κ°μ²΄, ν΄λμ€, λ©μμ§μ λν΄ μμλ³΄κ² μ΅λλ€.
π λ°νμ μμ€ν (Runtime System)
Objective-Cλ κ°λ₯ν λ§μ κ²°μ μ μ»΄νμΌ μκ°μ΄λ λ§ν¬ μκ°μ΄ μλ λ°νμ μκ°μΌλ‘ λ―Έλ£Ήλλ€. κ°μ²΄ μμ±μ΄λ λ©μλ νΈμΆκ³Ό κ°μ μμ μ λμ μΌλ‘ μννλ κ²μ΄ νΉμ§μ λλ€.
λ°νμ(Runtime): νλ‘κ·Έλ¨μ΄ μ€νλλ λμμ νκ²½. Objective-Cμμλ λ°νμ μμ€ν μ΄ μΈμ΄μ λμ νΉμ±μ μ§μν©λλ€.
μ΄λ¬ν νΉμ± λλ¬Έμ Objective-Cλ μ»΄νμΌλ¬λΏλ§ μλλΌ μ»΄νμΌλ μ½λλ₯Ό μ€ννκΈ° μν λ°νμ μμ€ν λ νμν©λλ€. λ°νμ μμ€ν μ Objective-C μΈμ΄μ μΌμ’ μ μ΄μ체μ μν μ ν©λλ€.
π κ°μ²΄(Objects)
κ°μ²΄μ κΈ°λ³Έ κ°λ
κ°μ²΄λ λ°μ΄ν°μ κ·Έ λ°μ΄ν°λ₯Ό μ¬μ©νκ±°λ μν₯μ μ€ μ μλ νΉμ μ°μ°μ μ°κ²°ν©λλ€. Objective-Cμμ μ΄λ¬ν μ°μ°μ κ°μ²΄μ λ©μλλΌκ³ νλ©°, μν₯μ μ£Όλ λ°μ΄ν°λ μΈμ€ν΄μ€ λ³μ(λ€λ₯Έ νκ²½μμλ ivars λλ λ©€λ² λ³μλΌκ³ λ ν¨)μ λλ€.
μΈμ€ν΄μ€ λ³μ(Instance Variables): κ°μ²΄ λ΄λΆμ μ μ₯λ λ°μ΄ν°λ‘, κ°μ²΄μ μνλ₯Ό λνλ λλ€.
λ©μλ(Methods): κ°μ²΄κ° μνν μ μλ λμμ΄λ κΈ°λ₯μ μ μν μ½λ λΈλ‘μ λλ€.
λ³Έμ§μ μΌλ‘, κ°μ²΄λ λ°μ΄ν° ꡬ쑰(μΈμ€ν΄μ€ λ³μ)μ νλ‘μμ κ·Έλ£Ή(λ©μλ)μ μ체 ν¬ν¨λ νλ‘κ·Έλλ° λ¨μλ‘ λ¬Άμ΅λλ€.
id νμ
Objective-Cμμ κ°μ²΄ μλ³μλ idλΌλ κ³ μ ν λ°μ΄ν° νμ μ λλ€. μ΄ νμ μ ν΄λμ€μ κ΄κ³μμ΄ λͺ¨λ μ’ λ₯μ κ°μ²΄μ λν μΌλ° νμ μ΄λ©°, ν΄λμ€μ μΈμ€ν΄μ€μ ν΄λμ€ κ°μ²΄ μ체μ λͺ¨λ μ¬μ©ν μ μμ΅λλ€.
id anObject;
id: ν΄λμ€μ μκ΄μμ΄ λͺ¨λ κ°μ²΄λ₯Ό κ°λ¦¬ν¬ μ μλ ν¬μΈν° νμ μ λλ€.
ν€μλ nilμ null κ°μ²΄, μ¦ κ°μ΄ 0μΈ idλ‘ μ μλ©λλ€.
λμ νμ΄ν(Dynamic Typing)
id νμ μ μμ ν μ νμ΄ μμ΅λλ€. κ·Έ μ체λ‘λ κ°μ²΄κ° κ°μ²΄λΌλ μ¬μ€ μΈμλ μ΄λ€ μ 보λ μ 곡νμ§ μμ΅λλ€. νλ‘κ·Έλ¨μ μΌλ°μ μΌλ‘ ν¬ν¨νκ³ μλ κ°μ²΄μ λν λ ꡬ체μ μΈ μ 보λ₯Ό μμμΌ ν νμκ° μμ΅λλ€.
κ° κ°μ²΄λ isa μΈμ€ν΄μ€ λ³μλ₯Ό ν΅ν΄ μμ μ ν΄λμ€λ₯Ό μλ³ν©λλ€. κ°μ λμ(λ©μλ)κ³Ό κ°μ μ’ λ₯μ λ°μ΄ν°(μΈμ€ν΄μ€ λ³μ)λ₯Ό κ°μ§ κ°μ²΄λ€μ κ°μ ν΄λμ€μ λ©€λ²μ λλ€.
isa ν¬μΈν°: κ°μ²΄κ° μ΄λ€ ν΄λμ€μ μνλμ§ λνλ΄λ λ³μμ λλ€.
κ°μ²΄λ λ°νμμ λμ μΌλ‘ νμ μ΄ μ§μ λ©λλ€. λ°νμ μμ€ν μ νμν λλ§λ€ κ°μ²΄μ λ¬Όμ΄λ΄μΌλ‘μ¨ κ°μ²΄κ° μν μ νν ν΄λμ€λ₯Ό μ°Ύμ μ μμ΅λλ€.
λ©λͺ¨λ¦¬ κ΄λ¦¬
λͺ¨λ νλ‘κ·Έλ¨μμ κ°μ²΄κ° λ μ΄μ νμνμ§ μμ λ ν λΉ ν΄μ νλ κ²μ΄ μ€μν©λλ€. Objective-Cλ λ€μκ³Ό κ°μ μΈ κ°μ§ λ©λͺ¨λ¦¬ κ΄λ¦¬ λ©μ»€λμ¦μ μ 곡ν©λλ€:
- μλ μ°Έμ‘° μΉ΄μ΄ν (ARC): μ»΄νμΌλ¬κ° κ°μ²΄μ μλͺ μ μΆλ‘ ν©λλ€.
- μλ μ°Έμ‘° μΉ΄μ΄ν (MRC): κ°μ²΄μ μλͺ μ κ²°μ νλ κ²μ κΆκ·Ήμ μΌλ‘ κ°λ°μμ μ± μμ λλ€.
- κ°λΉμ§ 컬λ μ : κ°μ²΄ μλͺ κ²°μ μ μ± μμ μλ "컬λ ν°"μκ² λκΉλλ€.
ARC(Automatic Reference Counting): μ»΄νμΌλ¬κ° μλμΌλ‘ retain/release μ½λλ₯Ό μ½μ νμ¬ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό λμμ£Όλ κΈ°λ₯μ λλ€.
π κ°μ²΄ λ©μμ§(Object Messaging)
λ©μμ§ κ΅¬λ¬Έ
κ°μ²΄κ° 무μΈκ°λ₯Ό νλλ‘ νλ €λ©΄ λ©μλλ₯Ό μ μ©νλΌλ λ©μμ§λ₯Ό 보λ λλ€. Objective-Cμμ λ©μμ§ ννμμ λκ΄νΈλ‘ λ¬Άμ λλ€:
[receiver message]
μμ μλ κ°μ²΄μ΄κ³ , λ©μμ§λ 무μμ ν΄μΌ νλμ§ μλ €μ€λλ€. μμ€ μ½λμμ λ©μμ§λ λ¨μν λ©μλμ μ΄λ¦κ³Ό μ λ¬λλ λ§€κ°λ³μμ λλ€.
[myRectangle display];
λ©μλλ λ§€κ°λ³μλ₯Ό κ°μ§ μλ μμ΅λλ€. λ¨μΌ λ§€κ°λ³μκ° μλ λ©μμ§λ μ΄λ¦μ μ½λ‘ (:)μ λΆμ΄κ³ μ½λ‘ λ°λ‘ λ€μ λ§€κ°λ³μλ₯Ό λ£μ΅λλ€:
[myRectangle setWidth:20.0];
μ¬λ¬ λ§€κ°λ³μκ° μλ λ©μλμ κ²½μ°, Objective-Cμ λ©μλ μ΄λ¦μ λ§€κ°λ³μμ ν¨κ» μΈν°λ¦¬λΈλ©λλ€:
[myRectangle setOriginX:30.0 y:50.0];
μ λ ν°(Selector): λ©μμ§μμ λ©μλ μ΄λ¦ λΆλΆμΌλ‘, μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ "μ ν"νλ μν μ ν©λλ€.
nilμ λ©μμ§ λ³΄λ΄κΈ°
Objective-Cμμλ nilμ λ©μμ§λ₯Ό 보λ΄λ κ²μ΄ μ ν¨ν©λλ€. λ°νμμλ μ무 ν¨κ³Όκ° μμ΅λλ€. nilμ λ³΄λΈ λ©μμ§μμ λ°νλλ κ°λ μ ν¨ν μ μμ΅λλ€:
- λ©μλκ° κ°μ²΄λ₯Ό λ°ννλ©΄, nilμ λ³΄λΈ λ©μμ§λ 0(nil)μ λ°νν©λλ€.
- λ©μλκ° ν¬μΈν° νμ , μ μ μ€μΉΌλΌ, float, double λ±μ λ°ννλ©΄, nilμ λ³΄λΈ λ©μμ§λ 0μ λ°νν©λλ€.
- λ©μλκ° κ΅¬μ‘°μ²΄λ₯Ό λ°ννλ©΄, nilμ λ³΄λΈ λ©μμ§λ λͺ¨λ νλμ 0.0μ λ°νν©λλ€.
λ€νμ±(Polymorphism)
κ°μ²΄λ μμ μ μν΄ μ μλ λ©μλλ‘λ§ μλν μ μμ΅λλ€. λ°λΌμ λ κ°μ²΄λ κ°μ λ©μμ§μ λ€λ₯΄κ² μλ΅ν μ μμ΅λλ€.
λ€νμ±(Polymorphism): κ°μ λ©μμ§μ λν΄ κ°μ²΄λ§λ€ λ€λ₯Έ λ°©μμΌλ‘ μλ΅ν μ μλ λ₯λ ₯μ λλ€.
μλ₯Ό λ€μ΄, display λ©μμ§λ₯Ό λ°λ κ° μ’ λ₯μ κ°μ²΄λ κ³ μ ν λ°©μμΌλ‘ μμ μ νμν μ μμ΅λλ€. Circleκ³Ό Rectangleμ 컀μλ₯Ό μΆμ νλΌλ λμΌν μ§μμ λ€λ₯΄κ² μλ΅ν κ²μ λλ€.
λμ λ°μΈλ©(Dynamic Binding)
ν¨μ νΈμΆκ³Ό λ©μμ§μ μ€μν μ°¨μ΄μ μ ν¨μμ κ·Έ λ§€κ°λ³μκ° μ»΄νμΌλ μ½λμμ κ²°ν©λμ§λ§, λ©μμ§μ μμ κ°μ²΄λ νλ‘κ·Έλ¨μ΄ μ€νλκ³ λ©μμ§κ° μ μ‘λ λκΉμ§ κ²°ν©λμ§ μλλ€λ κ²μ λλ€.
λμ λ°μΈλ©(Dynamic Binding): λ©μμ§μ μλ΅ν λ©μλκ° λ°νμμ κ²°μ λλ λ©μ»€λμ¦μ λλ€.
λ©μμ§κ° μ μ‘λλ©΄, λ°νμ λ©μμ§ λ£¨ν΄μ μμ μμ λ©μμ§μμ μ§μ λ λ©μλλ₯Ό μ΄ν΄λ΄ λλ€. μ΄λ¦κ³Ό μΌμΉνλ λ©μλμ μμ μ ꡬνμ μ°Ύμ λ©μλλ₯Ό "νΈμΆ"νκ³ μμ μμ μΈμ€ν΄μ€ λ³μμ λν ν¬μΈν°λ₯Ό μ λ¬ν©λλ€.
λνΈ κ΅¬λ¬Έ(Dot Syntax)
Objective-Cλ μ κ·Όμ λ©μλλ₯Ό νΈμΆνκΈ° μν λμμΌλ‘ μ (.) μ°μ°μλ₯Ό μ 곡ν©λλ€:
myInstance.value = 10;
printf("myInstance value: %d", myInstance.value);
κ°μ²΄μ ν¨κ» μ¬μ©ν λ, λνΈ κ΅¬λ¬Έμ "ꡬ문μ μ€ν"μΌλ‘ μμ©ν©λλ€. μ»΄νμΌλ¬μ μν΄ μ κ·Όμ λ©μλ νΈμΆλ‘ λ³νλ©λλ€:
[myInstance setValue:10];
printf("myInstance value: %d", [myInstance value]);
π ν΄λμ€(Classes)
κ°μ²΄ μ§ν₯ νλ‘κ·Έλ¨μ μΌλ°μ μΌλ‘ λ€μν κ°μ²΄λ‘ ꡬμ±λ©λλ€. Objective-Cμμλ ν΄λμ€λ₯Ό μ μνμ¬ κ°μ²΄λ₯Ό μ μν©λλ€.
ν΄λμ€(Class): κ°μ²΄μ μ’ λ₯μ λν νλ‘ν νμ . ν΄λμ€μ λͺ¨λ λ©€λ²κ° λλ μΈμ€ν΄μ€ λ³μλ₯Ό μ μΈνκ³ ν΄λμ€μ λͺ¨λ κ°μ²΄κ° μ¬μ©ν μ μλ λ©μλ μΈνΈλ₯Ό μ μν©λλ€.
μ»΄νμΌλ¬λ κ° ν΄λμ€μ λν΄ νλμ μ κ·Ό κ°λ₯ν κ°μ²΄, μ¦ ν΄λμ€μ μνλ μ κ°μ²΄λ₯Ό λ§λλ λ°©λ²μ μλ ν΄λμ€ κ°μ²΄λ₯Ό μμ±ν©λλ€.
μμ(Inheritance)
ν΄λμ€ μ μλ λμ λ©λλ€. μ μνλ κ° μ ν΄λμ€λ λ©μλμ μΈμ€ν΄μ€ λ³μλ₯Ό μμλ°λ λ€λ₯Έ ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ ν©λλ€. μ ν΄λμ€λ λ¨μν μμλ°μ κ²μ μΆκ°νκ±°λ μμ ν©λλ€.
μμ(Inheritance): νμ ν΄λμ€κ° μμ ν΄λμ€μ μμ±κ³Ό λ©μλλ₯Ό λ¬Όλ €λ°λ λ©μ»€λμ¦μ λλ€.
μμμ λ¨μΌ ν΄λμ€λ₯Ό 루νΈλ‘ νλ κ³μΈ΅μ νΈλ¦¬μ λͺ¨λ ν΄λμ€λ₯Ό μ°κ²°ν©λλ€. Foundation νλ μμν¬λ₯Ό κΈ°λ°μΌλ‘ μ½λλ₯Ό μμ±ν λ, κ·Έ λ£¨νΈ ν΄λμ€λ μΌλ°μ μΌλ‘ NSObjectμ λλ€.
NSObject ν΄λμ€
NSObjectλ λ£¨νΈ ν΄λμ€μ΄λ―λ‘ μμ ν΄λμ€κ° μμ΅λλ€. Objective-C κ°μ²΄μ κ°μ²΄ μνΈ μμ©μ κΈ°λ³Έ νλ μμν¬λ₯Ό μ μν©λλ€.
NSObject: Objective-Cμμ κ°μ₯ κΈ°λ³Έμ΄ λλ ν΄λμ€λ‘, λͺ¨λ κ°μ²΄μ κ³΅ν΅ κΈ°λ₯μ μ 곡ν©λλ€.
NSObject ν΄λμ€μμ μμλ°μ§ μμλ λλ ν΄λμ€λ κ·ΈλΌμλ λΆκ΅¬νκ³ NSObject ν΄λμ€μ νμ ν΄λμ€λ‘ λ§λ€μ΄μΌ ν©λλ€. ν΄λμ€μ μΈμ€ν΄μ€λ μ΅μν λ°νμμ Objective-C κ°μ²΄μ²λΌ λμν μ μμ΄μΌ ν©λλ€.
μΈμ€ν΄μ€ λ³μ μμ
ν΄λμ€ κ°μ²΄κ° μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ, μ κ°μ²΄λ ν΄λμ€μ λν΄ μ μλ μΈμ€ν΄μ€ λ³μλΏλ§ μλλΌ μμ ν΄λμ€μ μμ ν΄λμ€μ μμ ν΄λμ€μ λν΄ μ μλ μΈμ€ν΄μ€ λ³μλ ν¬ν¨ν©λλ€.
λ©μλ μμ
κ°μ²΄λ μμ μ ν΄λμ€μ λν΄ μ μλ λ©μλλΏλ§ μλλΌ μμ ν΄λμ€, κ·Έλ¦¬κ³ μμ ν΄λμ€μ μμ ν΄λμ€ λ± κ³μΈ΅ ꡬ쑰μ 루νΈκΉμ§ μ μλ λ©μλμλ μ κ·Όν μ μμ΅λλ€.
μΆμ ν΄λμ€(Abstract Classes)
μΌλΆ ν΄λμ€λ λ€λ₯Έ ν΄λμ€κ° μμλ°μ μ μλλ‘ μ€κ³λμμ΅λλ€. μ΄λ¬ν μΆμ ν΄λμ€λ μ¬λ¬ νμ ν΄λμ€μμ μ¬μ©ν μ μλ λ©μλμ μΈμ€ν΄μ€ λ³μλ₯Ό κ³΅ν΅ μ μλ‘ κ·Έλ£Ήνν©λλ€.
μΆμ ν΄λμ€(Abstract Class): μ§μ μΈμ€ν΄μ€ννμ§ μκ³ μ£Όλ‘ λ€λ₯Έ ν΄λμ€κ° μμλ°κΈ° μν λͺ©μ μΌλ‘ μ€κ³λ ν΄λμ€μ λλ€.
Cocoaμμ NSObject ν΄λμ€λ μΆμ ν΄λμ€μ μ νμ μΈ μμ λλ€. μ ν리μΌμ΄μ μμ NSObject ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ§μ μ¬μ©νμ§ μμ΅λλ€.
π ν΄λμ€ κ°μ²΄(Class Objects)
ν΄λμ€ μ μμλ λ€μν μ’ λ₯μ μ λ³΄κ° ν¬ν¨λμ΄ μμΌλ©°, λλΆλΆμ ν΄λμ€μ μΈμ€ν΄μ€μ κ΄ν κ²μ λλ€:
- ν΄λμ€μ μμ ν΄λμ€μ μ΄λ¦
- μΈμ€ν΄μ€ λ³μ μΈνΈλ₯Ό μ€λͺ νλ ν νλ¦Ώ
- λ©μλ μ΄λ¦κ³Ό λ°ν λ° λ§€κ°λ³μ νμ μ μΈ
- λ©μλ ꡬν
ν΄λμ€ κ°μ²΄(Class Object): λ°νμμ ν΄λμ€λ₯Ό λνλ΄λ κ°μ²΄λ‘, ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ κΈ°λ₯μ μ 곡ν©λλ€.
μ»΄νμΌλ¬λ ν΄λμ€λ₯Ό λνλ΄λ νλμ κ°μ²΄, μ¦ ν΄λμ€ κ°μ²΄λ§ μμ±ν©λλ€. ν΄λμ€ κ°μ²΄λ ν΄λμ€μ λν λͺ¨λ μ 보μ μ κ·Όν μ μμ΅λλ€.
μΈμ€ν΄μ€ μμ±
ν΄λμ€ κ°μ²΄μ μ£Όμ κΈ°λ₯μ μ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ λλ€:
id myRectangle;
myRectangle = [Rectangle alloc];
alloc λ©μλλ μ κ°μ²΄μ μΈμ€ν΄μ€ λ³μμ λν λ©λͺ¨λ¦¬λ₯Ό λμ μΌλ‘ ν λΉνκ³ λͺ¨λ 0μΌλ‘ μ΄κΈ°νν©λλ€. κ°μ²΄κ° μ μ©νλ €λ©΄ μΌλ°μ μΌλ‘ λ μμ ν μ΄κΈ°νν΄μΌ ν©λλ€:
myRectangle = [[Rectangle alloc] init];
alloc: κ°μ²΄λ₯Ό μν λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ λ©μλμ λλ€.
init: κ°μ²΄λ₯Ό μ΄κΈ°ννλ λ©μλμ λλ€.
ν΄λμ€ κ°μ²΄ μ΄κΈ°ν
ν΄λμ€ κ°μ²΄λ₯Ό μΈμ€ν΄μ€ ν λΉ μ΄μΈμ μ©λλ‘ μ¬μ©νλ €λ©΄ μΈμ€ν΄μ€μ λ§μ°¬κ°μ§λ‘ μ΄κΈ°νν΄μΌ ν μ μμ΅λλ€. Objective-Cλ νλ‘κ·Έλ¨μ΄ ν΄λμ€ κ°μ²΄λ₯Ό μ΄κΈ°νν μ μλ λ°©λ²μ μ 곡ν©λλ€.
ν΄λμ€κ° μ μ λλ μ μ λ³μλ₯Ό μ¬μ©νλ κ²½μ°, initialize λ©μλλ μ΄κΈ°κ°μ μ€μ νκΈ°μ μ’μ μ₯μμ λλ€.
initialize: ν΄λμ€κ° μ²μ μ¬μ©λκΈ° μ μ νΈμΆλλ ν΄λμ€ λ©μλλ‘, ν΄λμ€μ μ΄κΈ°νλ₯Ό λ΄λΉν©λλ€.
μμ€ μ½λμμμ ν΄λμ€ μ΄λ¦
μμ€ μ½λμμ ν΄λμ€ μ΄λ¦μ λ κ°μ§ λ§€μ° λ€λ₯Έ 컨ν μ€νΈμμλ§ μ¬μ©ν μ μμ΅λλ€. μ΄λ¬ν 컨ν μ€νΈλ λ°μ΄ν° νμ μ΄μ κ°μ²΄λ‘μ ν΄λμ€μ μ΄μ€ μν μ λ°μν©λλ€:
- ν΄λμ€ μ΄λ¦μ κ°μ²΄μ νμ
μ΄λ¦μΌλ‘ μ¬μ©ν μ μμ΅λλ€:
Rectangle *anObject;
- λ©μμ§ ννμμμ μμ μλ‘μ ν΄λμ€ μ΄λ¦μ ν΄λμ€ κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€:
if ([anObject isKindOfClass:[Rectangle class]]) ...
λ§λ¬΄λ¦¬
Objective-Cμ κ°μ²΄, ν΄λμ€, λ©μμ§ μμ€ν μ μΈμ΄μ κ°λ ₯ν¨κ³Ό μ μ°μ±μ μ 곡νλ ν΅μ¬ μμμ λλ€.