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

Obj-C 곡식 λ¬Έμ„œ 정리 - μ„ μ–Έλœ ν”„λ‘œνΌν‹°(Declared Properties)

by BreadDev 2025. 4. 14.
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ΄λ²ˆμ—λŠ” Objective-C의 'μ„ μ–Έλœ ν”„λ‘œνΌν‹°(Declared Properties)'에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ“Œ μ„ μ–Έλœ ν”„λ‘œνΌν‹° κ°œμš”

일반적으둜 객체의 속성(attributes)κ³Ό 관계(relationships)에 μ ‘κ·Όν•  λ•ŒλŠ” μ ‘κ·Όμž(accessor) λ©”μ„œλ“œ 쌍, 즉 getter와 setterλ₯Ό 톡해 μ ‘κ·Όν•©λ‹ˆλ‹€. 이 μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ μΊ‘μŠν™”(encapsulation) 원칙을 μ§€ν‚€κ³ , API μ‚¬μš©μžλŠ” κ΅¬ν˜„ λ³€κ²½μ—μ„œ 격리된 μ±„λ‘œ μœ μ§€λ©λ‹ˆλ‹€.

μΊ‘μŠν™”(Encapsulation): 객체의 λ‚΄λΆ€ μƒνƒœλ₯Ό μ™ΈλΆ€λ‘œλΆ€ν„° 숨기고 였직 λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 μ›μΉ™μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό 직접 μž‘μ„±ν•˜λŠ” 것은 μ§€λ£¨ν•œ 과정이며, API μ†ŒλΉ„μžμ—κ²Œ μ€‘μš”ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°μ˜ μΈ‘λ©΄(μŠ€λ ˆλ“œ μ•ˆμ „μ„±, μƒˆ 값이 섀정될 λ•Œ λ³΅μ‚¬λ˜λŠ”μ§€ μ—¬λΆ€ λ“±)이 λͺ¨ν˜Έν•˜κ²Œ 남아 μžˆμŠ΅λ‹ˆλ‹€.

μ„ μ–Έλœ ν”„λ‘œνΌν‹°λŠ” λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€:

  1. ν”„λ‘œνΌν‹° 선언은 μ ‘κ·Όμž λ©”μ„œλ“œμ˜ λ™μž‘ 방식에 λŒ€ν•œ λͺ…ν™•ν•˜κ³  λͺ…μ‹œμ μΈ λͺ…μ„Έλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  2. μ»΄νŒŒμΌλŸ¬λŠ” 선언에 μ œκ³΅ν•œ λͺ…세에 따라 μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μžλ™μœΌλ‘œ 생성(ν•©μ„±)ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. ν”„λ‘œνΌν‹°λŠ” ꡬ문적으둜 μ‹λ³„μžλ‘œ ν‘œν˜„λ˜κ³  μŠ€μ½”ν”„κ°€ μžˆμ–΄ μ»΄νŒŒμΌλŸ¬κ°€ μ„ μ–Έλ˜μ§€ μ•Šμ€ ν”„λ‘œνΌν‹°μ˜ μ‚¬μš©μ„ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ ν”„λ‘œνΌν‹° μ„ μ–Έκ³Ό κ΅¬ν˜„

μ„ μ–Έλœ ν”„λ‘œνΌν‹°λŠ” 두 λΆ€λΆ„μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€: μ„ μ–Έ(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 μ§€μ‹œμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄νŒŒμΌλŸ¬κ°€ μ ‘κ·Όμž λ©”μ„œλ“œλ₯Ό μžλ™μœΌλ‘œ 생성할지 λ˜λŠ” 직접 κ΅¬ν˜„ν• μ§€λ₯Ό μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.