μλ νμΈμ. μ΄λ²μλ Objective-Cμ 'μ μΈλ νλ‘νΌν°(Declared Properties)'μ λν΄ μμλ³΄κ² μ΅λλ€.
π μ μΈλ νλ‘νΌν° κ°μ
μΌλ°μ μΌλ‘ κ°μ²΄μ μμ±(attributes)κ³Ό κ΄κ³(relationships)μ μ κ·Όν λλ μ κ·Όμ(accessor) λ©μλ μ, μ¦ getterμ setterλ₯Ό ν΅ν΄ μ κ·Όν©λλ€. μ΄ μ κ·Όμ λ©μλλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ μΊ‘μν(encapsulation) μμΉμ μ§ν€κ³ , API μ¬μ©μλ ꡬν λ³κ²½μμ 격리λ μ±λ‘ μ μ§λ©λλ€.
μΊ‘μν(Encapsulation): κ°μ²΄μ λ΄λΆ μνλ₯Ό μΈλΆλ‘λΆν° μ¨κΈ°κ³ μ€μ§ λ©μλλ₯Ό ν΅ν΄μλ§ μ κ·Ό κ°λ₯νκ² νλ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ν΅μ¬ μμΉμ λλ€.
νμ§λ§ μ κ·Όμ λ©μλλ₯Ό μ§μ μμ±νλ κ²μ μ§λ£¨ν κ³Όμ μ΄λ©°, API μλΉμμκ² μ€μν μ μλ νλ‘νΌν°μ μΈ‘λ©΄(μ€λ λ μμ μ±, μ κ°μ΄ μ€μ λ λ 볡μ¬λλμ§ μ¬λΆ λ±)μ΄ λͺ¨νΈνκ² λ¨μ μμ΅λλ€.
μ μΈλ νλ‘νΌν°λ λ€μκ³Ό κ°μ κΈ°λ₯μ μ 곡νμ¬ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€:
- νλ‘νΌν° μ μΈμ μ κ·Όμ λ©μλμ λμ λ°©μμ λν λͺ ννκ³ λͺ μμ μΈ λͺ μΈλ₯Ό μ 곡ν©λλ€.
- μ»΄νμΌλ¬λ μ μΈμ μ 곡ν λͺ μΈμ λ°λΌ μ κ·Όμ λ©μλλ₯Ό μλμΌλ‘ μμ±(ν©μ±)ν μ μμ΅λλ€.
- νλ‘νΌν°λ ꡬ문μ μΌλ‘ μλ³μλ‘ ννλκ³ μ€μ½νκ° μμ΄ μ»΄νμΌλ¬κ° μ μΈλμ§ μμ νλ‘νΌν°μ μ¬μ©μ κ°μ§ν μ μμ΅λλ€.
π νλ‘νΌν° μ μΈκ³Ό ꡬν
μ μΈλ νλ‘νΌν°λ λ λΆλΆμΌλ‘ ꡬμ±λ©λλ€: μ μΈ(declaration)κ³Ό ꡬν(implementation).
νλ‘νΌν° μ μΈ
νλ‘νΌν° μ μΈμ @property ν€μλλ‘ μμν©λλ€. @propertyλ ν΄λμ€μ @interface λΈλ‘μ μλ λ©μλ μ μΈ λͺ©λ‘ μ΄λμλ λνλ μ μμΌλ©°, νλ‘ν μ½μ΄λ μΉ΄ν κ³ λ¦¬μ μ μΈμλ λνλ μ μμ΅λλ€.
@property (attributes) type name;
νλ‘νΌν° μμ±(Property Attributes): νλ‘νΌν°μ μ μ₯ λ°©μκ³Ό λμμ μΈλΆμ μΌλ‘ μ§μ νλ μ€μ μ λλ€.
λ€μμ κ°λ¨ν νλ‘νΌν° μ μΈμ μμ λλ€:
@interface MyClass : NSObject
@property float value;
@end
νλ‘νΌν° μ μΈμ λ κ°μ μ κ·Όμ λ©μλλ₯Ό μ μΈνλ κ²κ³Ό λλ±νλ€κ³ μκ°ν μ μμ΅λλ€. λ°λΌμ
@property float value;
λ λ€μκ³Ό λλ±ν©λλ€:
- (float)value;
- (void)setValue:(float)newValue;
νλ‘νΌν° μ μΈμ μ κ·Όμ λ©μλμ ꡬν λ°©μμ λν μΆκ° μ 보λ₯Ό μ 곡ν©λλ€(νλ‘νΌν° μ μΈ μμ±μ μ€λͺ λ¨).
ν΄λμ€ νμ₯(extensions)μ νλ‘νΌν° μ μΈμ λ£μ μλ μμ΅λλ€:
@interface MyClass : NSObject
@end
@interface MyClass ()
@property float value;
@end
ν΄λμ€ νμ₯(Class Extension): ν΄λμ€μ private μΈν°νμ΄μ€λ₯Ό μ μνλ λ°©λ²μΌλ‘, ν€λ νμΌκ³Ό ꡬν νμΌ μ¬μ΄μ μΆκ° μΈν°νμ΄μ€λ₯Ό μ μΈν μ μμ΅λλ€.
μ΄λ private νλ‘νΌν°μ μ μΈμ μ¨κΈ°κ³ μΆμ λ μ μ©ν©λλ€.
π νλ‘νΌν° μ μΈ μμ±
νλ‘νΌν°μ μμ±μ μ§μ νλ €λ©΄ @property(attribute [, attribute2, ...]) νμμ μ¬μ©ν©λλ€. νλ‘νΌν°λ ν΄λΉ μΈν°νμ΄μ€ μ μΈμ λ²μκ° μ§μ λ©λλ€.
μ»΄νμΌλ¬μκ² μ κ·Όμ λ©μλλ₯Ό μμ±νλλ‘ @synthesize μ§μμ΄λ₯Ό μ¬μ©νλ©΄, μμ±λλ μ½λλ ν€μλλ‘ μ§μ λ λͺ μΈμ μΌμΉν©λλ€. μ κ·Όμ λ©μλλ₯Ό μ§μ ꡬννλ κ²½μ°, λͺ μΈμ μΌμΉνλλ‘ ν΄μΌ ν©λλ€.
μ κ·Όμ λ©μλ μ΄λ¦
νλ‘νΌν°μ κ΄λ ¨λ getterμ setter λ©μλμ κΈ°λ³Έ μ΄λ¦μ κ°κ° propertyNameκ³Ό setPropertyName:μ λλ€. λ€μ μμ±μ μ¬μ©νμ¬ μ¬μ©μ μ§μ μ΄λ¦μ μ§μ ν μ μμ΅λλ€:
- getter=getterName: νλ‘νΌν°μ getter μ κ·Όμ μ΄λ¦μ μ§μ ν©λλ€.
- setter=setterName: νλ‘νΌν°μ setter μ κ·Όμ μ΄λ¦μ μ§μ ν©λλ€.
Key-Value Coding: Objective-Cμμ κ°μ²΄μ νλ‘νΌν°μ κ°μ μ μΌλ‘ μ κ·Όν μ μκ² ν΄μ£Όλ λ©μ»€λμ¦μ λλ€.
μΌλ°μ μΌλ‘ key-value codingμ μ€μνλ μ κ·Όμ λ©μλ μ΄λ¦μ μ§μ ν΄μΌ ν©λλ€. Boolean κ°μ κ²½μ° isPropertyName κ·μΉμ μ€μνκΈ° μν΄ getter λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ μ λλ€.
μ°κΈ° κ°λ₯μ±
μ΄ μμ±λ€μ νλ‘νΌν°μ κ΄λ ¨ setter μ κ·Όμκ° μλμ§ μ¬λΆλ₯Ό μ§μ ν©λλ€:
- readwrite: νλ‘νΌν°κ° μ½κΈ°/μ°κΈ°λ‘ μ²λ¦¬λμ΄μΌ ν¨μ λνλ λλ€. μ΄ μμ±μ΄ κΈ°λ³Έκ°μ λλ€.
- readonly: νλ‘νΌν°κ° μ½κΈ° μ μ©μμ λνλ λλ€.
μ½κΈ° μ μ©(readonly): κ°μ κ°μ Έμ¬ μ μμ§λ§ μ€μ ν μ μλ νλ‘νΌν°μ λλ€.
μ½κΈ°/μ°κΈ°(readwrite): κ°μ κ°μ Έμ€κ³ μ€μ ν μ μλ νλ‘νΌν°μ λλ€.
Setter μλ―Έλ‘
μ΄ μμ±λ€μ setter μ κ·Όμμ μλ―Έλ‘ μ μ§μ ν©λλ€:
- strong: λμ κ°μ²΄μ λν κ°ν(μμ ) κ΄κ³κ° μμμ μ§μ ν©λλ€.
- weak: λμ κ°μ²΄μ λν μ½ν(λΉμμ ) κ΄κ³κ° μμμ μ§μ ν©λλ€. λμ κ°μ²΄κ° ν΄μ λλ©΄ νλ‘νΌν° κ°μ μλμΌλ‘ nilλ‘ μ€μ λ©λλ€.
- copy: ν λΉμ κ°μ²΄μ 볡μ¬λ³Έμ μ¬μ©ν΄μΌ ν¨μ μ§μ ν©λλ€. μ΄μ κ°μλ release λ©μμ§κ° μ μ‘λ©λλ€.
- assign: setterκ° λ¨μ ν λΉμ μ¬μ©ν¨μ μ§μ ν©λλ€. μ΄ μμ±μ΄ κΈ°λ³Έκ°μ λλ€.
- retain: ν λΉ μ κ°μ²΄μ retainμ΄ νΈμΆλμ΄μΌ ν¨μ μ§μ ν©λλ€. μ΄μ κ°μλ release λ©μμ§κ° μ μ‘λ©λλ€.
κ°ν μ°Έμ‘°(Strong Reference): μ°Έμ‘°λ κ°μ²΄κ° λ©λͺ¨λ¦¬μμ ν΄μ λμ§ μλλ‘ μ μ§ν©λλ€.
μ½ν μ°Έμ‘°(Weak Reference): μ°Έμ‘°λ κ°μ²΄κ° ν΄μ λ μ μμΌλ©°, ν΄μ λλ©΄ μ°Έμ‘°λ μλμΌλ‘ nilμ΄ λ©λλ€.
볡μ¬(Copy): κ°μ²΄μ 볡μ¬λ³Έμ λ§λ€μ΄ μ°Έμ‘°ν©λλ€.
λ¨μ ν λΉ(Assign): κ°μ λ¨μν ν λΉνλ©°, λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό νμ§ μμ΅λλ€.
보μ (Retain): κ°μ²΄μ λν μ°Έμ‘° μΉ΄μ΄νΈλ₯Ό μ¦κ°μμΌ λ©λͺ¨λ¦¬μμ ν΄μ λμ§ μλλ‘ ν©λλ€.
μμμ±
μ΄ μμ±μ μ κ·Όμ λ©μλκ° atomicμ΄ μλμ μ§μ νλ λ° μ¬μ©λ©λλ€:
- nonatomic: μ κ·Όμκ° atomicμ΄ μλμ μ§μ ν©λλ€. κΈ°λ³Έμ μΌλ‘ μ κ·Όμλ atomicμ λλ€.
μμμ±(Atomicity): νλ‘νΌν° μ κ·Όμ΄ λ€μ€ μ€λ λ νκ²½μμ μμ νμ§λ₯Ό λνλ λλ€. atomic νλ‘νΌν°λ μ€λ λ μμ μ 보μ₯νμ§λ§ μ±λ₯ λΉμ©μ΄ μμΌλ©°, nonatomicμ μ±λ₯μ μ’μ§λ§ μ€λ λ μμ μ 보μ₯νμ§ μμ΅λλ€.
νλ‘νΌν°λ κΈ°λ³Έμ μΌλ‘ atomicμ΄λ―λ‘ ν©μ±λ μ κ·Όμλ λ€μ€ μ€λ λ νκ²½μμ νλ‘νΌν°μ λν λ‘λ²μ€νΈν μ κ·Όμ μ 곡ν©λλ€.
π νλ‘νΌν° ꡬν μ§μμ΄
@implementation λΈλ‘μμ @synthesizeμ @dynamic μ§μμ΄λ₯Ό μ¬μ©νμ¬ νΉμ μ»΄νμΌλ¬ λμμ νΈλ¦¬κ±°ν μ μμ΅λλ€.
@synthesize
@synthesize μ§μμ΄λ @implementation λΈλ‘ λ΄μμ νλ‘νΌν°μ λν setter λ°/λλ getter λ©μλλ₯Ό μ 곡νμ§ μλ κ²½μ° μ»΄νμΌλ¬κ° μ΄λ₯Ό ν©μ±ν΄μΌ ν¨μ μ립λλ€:
@interface MyClass : NSObject
@property(copy, readwrite) NSString *value;
@end
@implementation MyClass
@synthesize value;
@end
@synthesize: μ»΄νμΌλ¬μκ² νλ‘νΌν°μ μ κ·Όμ λ©μλμ νμν μΈμ€ν΄μ€ λ³μλ₯Ό μλμΌλ‘ μμ±νλλ‘ μ§μν©λλ€.
property=ivar νμμ μ¬μ©νμ¬ νΉμ μΈμ€ν΄μ€ λ³μλ₯Ό νλ‘νΌν°μ μ¬μ©ν΄μΌ ν¨μ λνλΌ μ μμ΅λλ€:
@synthesize firstName, lastName, age=yearsOld;
@dynamic
@dynamic ν€μλλ νλ‘νΌν°μ μν΄ μμλ API κ³μ½μ μ§μ λ©μλ ꡬνμ μ 곡νκ±°λ λ°νμμ λ€λ₯Έ λ©μ»€λμ¦μ μ¬μ©νμ¬ μΆ©μ‘±ν κ²μμ μ»΄νμΌλ¬μ μ립λλ€:
@interface MyClass : NSManagedObject
@property(nonatomic, retain) NSString *value;
@end
@implementation MyClass
@dynamic value;
@end
@dynamic: μ»΄νμΌλ¬μκ² μ κ·Όμ λ©μλκ° λ°νμμ μ 곡λ κ²μ΄λ―λ‘ κ²½κ³ λ₯Ό μμ±νμ§ λ§λΌκ³ μ§μν©λλ€.
π νλ‘νΌν° μ¬μ©νκΈ°
μ§μλλ νμ
Objective-C ν΄λμ€, Core Foundation λ°μ΄ν° νμ , λλ POD(Plain Old Data) νμ μ λν νλ‘νΌν°λ₯Ό μ μΈν μ μμ΅λλ€.
νλ‘νΌν° μ¬μ μΈ
νμ ν΄λμ€μμ νλ‘νΌν°λ₯Ό μ¬μ μΈν μ μμ§λ§, (readonlyμ readwrite κ°μ μ νμ μ μΈνκ³ ) μμ±μ νμ ν΄λμ€μμ μ 체μ μΌλ‘ λ°λ³΅ν΄μΌ ν©λλ€.
ν ν΄λμ€μμ νλ‘νΌν°λ₯Ό readonlyλ‘ μ μΈνλ κ²½μ°, ν΄λμ€ νμ₯, νλ‘ν μ½ λλ νμ ν΄λμ€μμ readwriteλ‘ μ¬μ μΈν μ μμ΅λλ€:
// κ³΅κ° ν€λ νμΌ
@interface MyObject : NSObject
@property (readonly, copy) NSString *language;
@end
// λΉκ³΅κ° ꡬν νμΌ
@interface MyObject ()
@property (readwrite, copy) NSString *language;
@end
@implementation MyObject
@synthesize language;
@end
μ΄ ν¨ν΄μ λΆλ³ ν΄λμ€μ κ°λ³ νμ ν΄λμ€μ κ³΅κ° APIλ readonlyμ΄μ§λ§ ν΄λμ€ λ΄λΆμμλ readwriteμΈ νλ‘νΌν°λ₯Ό ꡬννλ λ κ°μ§ μΌλ°μ μΈ ν¨ν΄μ κ°λ₯νκ² ν©λλ€.
νλ‘νΌν°λ‘ νμ ν΄λμ€ λ§λ€κΈ°
readonly νλ‘νΌν°λ₯Ό μ¬μ μνμ¬ μ°κΈ° κ°λ₯νκ² λ§λ€ μ μμ΅λλ€:
@interface MyInteger : NSObject
@property(readonly) NSInteger value;
@end
@implementation MyInteger
@synthesize value;
@end
@interface MyMutableInteger : MyInteger
@property(readwrite) NSInteger value;
@end
@implementation MyMutableInteger
@dynamic value;
- (void)setValue:(NSInteger)newX {
value = newX;
}
@end
π λ°νμ μ°¨μ΄μ
λͺ¨λ λ°νμκ³Ό λ κ±°μ λ°νμ μ¬μ΄μλ νλ‘νΌν° λμμ ν κ°μ§ μ£Όμ μ°¨μ΄μ μ΄ μμ΅λλ€: λͺ¨λ λ°νμμ μΈμ€ν΄μ€ λ³μ ν©μ±μ μ§μνμ§λ§ λ κ±°μ λ°νμμ μ§μνμ§ μμ΅λλ€.
λͺ¨λ λ°νμ(Modern Runtime): iOSμ 64λΉνΈ macOSμμ μ¬μ©λλ Objective-C λ°νμμ λλ€.
λ κ±°μ λ°νμ(Legacy Runtime): 32λΉνΈ macOSμμ μ¬μ©λλ μμ Objective-C λ°νμμ λλ€.
λ κ±°μ λ°νμμμ @synthesizeκ° μλνλ €λ©΄ νλ‘νΌν°μ μ΄λ¦μ΄ κ°κ³ νΈνλλ νμ μ μΈμ€ν΄μ€ λ³μλ₯Ό μ 곡νκ±°λ @synthesize λ¬Έμμ λ€λ₯Έ κΈ°μ‘΄ μΈμ€ν΄μ€ λ³μλ₯Ό μ§μ ν΄μΌ ν©λλ€. λͺ¨λ λ°νμμμλ μΈμ€ν΄μ€ λ³μλ₯Ό μ 곡νμ§ μμΌλ©΄ μ»΄νμΌλ¬κ° μλμΌλ‘ μΆκ°ν©λλ€.
λ§λ¬΄λ¦¬
Objective-Cμ μ μΈλ νλ‘νΌν° κΈ°λ₯μ κ°μ²΄μ μ κ·Όμ λ©μλλ₯Ό μ μΈνκ³ κ΅¬ννλ κ°λ¨ν λ°©λ²μ μ 곡ν©λλ€. μ΄ κΈ°λ₯μ ν΅ν΄ μ½λλ₯Ό λ κΉλνκ² μ μ§νκ³ , μ κ·Όμ λ©μλμ λμμ λͺ ννκ² λͺ μνλ©°, λ°λ³΅μ μΈ μ½λ μμ±μ μ€μΌ μ μμ΅λλ€.
νλ‘νΌν° μμ±(strong, weak, copy λ±)μ ν΅ν΄ λ©λͺ¨λ¦¬ κ΄λ¦¬μ μ€λ λ μμ μ±μ λν μλλ₯Ό λͺ νν ν μ μμΌλ©°, @synthesizeμ @dynamic μ§μμ΄λ₯Ό μ¬μ©νμ¬ μ»΄νμΌλ¬κ° μ κ·Όμ λ©μλλ₯Ό μλμΌλ‘ μμ±ν μ§ λλ μ§μ ꡬνν μ§λ₯Ό μ μ΄ν μ μμ΅λλ€.
'π₯ 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 곡μ λ¬Έμ μ 리 - νλ‘ν μ½ (0) | 2025.04.14 |