상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[ Swift ] 속성 μ΄ˆκΈ°ν™” μ‹œ λ°”λ‘œ μΈμŠ€ν„΄μŠ€ν™” ν•˜λŠ” κ²½μš°μ™€ init μƒμ„±μžλ₯Ό ν†΅ν•œ μ΄ˆκΈ°ν™” 뭐가 λ‹€λ₯΄μ§€?

🍎 iOS/Swift

by AHN.Jihyeon 2024. 7. 20. 18:42

λ³Έλ¬Έ

μ—°λ½μ²˜ λ§Œλ“€κΈ° 과제 ν•΄μ„€ μ˜μƒμ„ 보닀가 의문이 λ“  점이 μžˆλ‹€. 

λ°”λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό λ˜‘κ°™μ΄ μ„ μ–Έν•˜λŠ” 것 같은데 = λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ™€ : 을 μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μžˆμ—ˆλ‹€. 

κ°„λ‹¨ν•˜κ²Œ 보면 μ•„λž˜μ™€ κ°™λ‹€. 

 

= (λ“±ν˜Έ)

λ“±ν˜Έ(=)λŠ” 값을 ν• λ‹Ήν•  λ•Œ μ‚¬μš©λœλ‹€. 즉, λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ 초기 값을 μ§€μ •ν•œλ‹€. 

=을 μ‚¬μš©ν•˜λŠ” 경우, ν•΄λ‹Ή 속성은 ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™”λ  λ•Œ λ°”λ‘œ 값을 κ°€μ§€κ²Œ λœλ‹€.

 

 

: (콜둠)

콜둠(:)은 νƒ€μž…μ„ μ§€μ •ν•  λ•Œ μ‚¬μš©λœλ‹€. 즉, λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ ν•΄λ‹Ή λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ κ°€μ§ˆ 수 μžˆλŠ” νƒ€μž…μ„ λͺ…μ‹œν•˜λŠ” 것이닀. 

:을 μ‚¬μš©ν•˜λŠ” 경우, 초기 값을 ν• λ‹Ήν•˜μ§€ μ•Šκ³  νƒ€μž…λ§Œ μ§€μ •ν•©λ‹ˆλ‹€. 초기 값은 μƒμ„±μžμ—μ„œ 할당될 수 μžˆλ‹€.

 

 

μ’€ 더 μžμ„Έν•˜κ²Œ μ•Œμ•„λ³΄μž. 


🌟 1. 속성 μ΄ˆκΈ°ν™” μ‹œ λ°”λ‘œ μΈμŠ€ν„΄μŠ€ν™”

이 방법은 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 항상 같은 λ°©μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λŠ” κ²½μš°μ— μ ν•©ν•˜λ‹€.

예λ₯Ό λ“€μ–΄CoreDataRepositoryλ‚˜ PhoneBookModeκ°€ 항상 λ™μΌν•œ 초기 μƒνƒœλ₯Ό κ°€μ§„λ‹€λ©΄ 이 방법이 λ‹¨μˆœν•˜κ³  νŽΈλ¦¬ν•  수 μžˆλ‹€.

 

μž₯점

  • λ‹¨μˆœμ„±κ³Ό νŽΈλ¦¬ν•¨: μ½”λ“œλ₯Ό κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ‹€. ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€ν™”λ  λ•Œ λͺ¨λ“  속성이 μ¦‰μ‹œ μ΄ˆκΈ°ν™”λœλ‹€.
  • κΈ°λ³Έκ°’: νŠΉμ • 속성이 항상 같은 κΈ°λ³Έ 값을 κ°€μ§ˆ λ•Œ μœ μš©ν•˜λ‹€.

단점

  • μœ μ—°μ„± λΆ€μ‘±: λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”λœλ‹€. μ™ΈλΆ€μ—μ„œ λ‹€λ₯Έ 값을 μ „λ‹¬ν•˜κ±°λ‚˜, λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  수 μ—†λ‹€.
  • ν…ŒμŠ€νŠΈμ˜ 어렀움: ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ νŠΉμ • 값을 κ°€μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  싢을 λ•Œ λΆˆνŽΈν•  수 μžˆλ‹€.

 

 

🌟 2. μƒμ„±μžλ₯Ό ν†΅ν•œ μ΄ˆκΈ°ν™”

이 방법은 클래슀 μΈμŠ€ν„΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ  λ•Œλ§ˆλ‹€ λ‹€λ₯Έ κ°’μ΄λ‚˜ 객체둜 μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ ν•©ν•˜λ‹€.

예λ₯Ό λ“€μ–΄, μ—¬λŸ¬ 개의 CoreDataRepository μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜κ±°λ‚˜, λ‹€μ–‘ν•œ λͺ¨λ“œλ₯Ό 지원해야 ν•˜λŠ” 경우 μœ μš©ν•˜λ‹€.

λ˜ν•œ, μœ λ‹› ν…ŒμŠ€νŠΈ μž‘μ„± μ‹œ λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆμ–΄ 더 νš¨κ³Όμ μ΄λ‹€.

 

μž₯점

  • μœ μ—°μ„±: μ™ΈλΆ€μ—μ„œ 값을 전달받아 μ΄ˆκΈ°ν™”ν•  수 μžˆλ‹€. 이λ₯Ό 톡해 λ‹€μ–‘ν•œ μ„€μ •μœΌλ‘œ 객체λ₯Ό 생성할 수 μžˆλ‹€.
  • μ˜μ‘΄μ„± μ£Όμž…: 객체 μ§€ν–₯ 섀계 원칙 쀑 ν•˜λ‚˜μΈ μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection)을 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€. μ΄λŠ” 특히 ν…ŒμŠ€νŠΈ μš©μ΄μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ— 큰 이점을 μ€€λ‹€.
  • μΊ‘μŠν™”: 객체의 μƒνƒœλ₯Ό 더 잘 관리할 수 μžˆλ‹€. μƒμ„±μžλ₯Ό 톡해 μ΄ˆκΈ°ν™”λ˜λ―€λ‘œ, 객체 생성 μ‹œ λ°˜λ“œμ‹œ ν•„μš”ν•œ 값듀을 κ°•μ œν•  수 μžˆλ‹€.

단점

  • 초기 μ„€μ •μ˜ λ³΅μž‘μ„±: μƒμ„±μžμ—μ„œ λͺ¨λ“  ν•„μˆ˜ 속성을 μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜λ―€λ‘œ μ½”λ“œκ°€ λ‹€μ†Œ κΈΈμ–΄μ§ˆ 수 μžˆλ‹€.
  • 뢀가적인 μ½”λ“œ μž‘μ„±: κΈ°λ³Έ μƒμ„±μž 외에도 λ‹€λ₯Έ μƒμ„±μžλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λŠ” 경우, 뢀가적인 μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€.
  • μ˜ˆμ‹œ: μœ μ—°μ„±μ˜ 차이

 

 

🌟 λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šκ³  νƒ€μž…λ§Œ μ§€μ •ν•˜λŠ” 것이 μœ μš©ν•œ 경우

1. μ΄ˆκΈ°ν™”κ°€ μ™ΈλΆ€λ‘œλΆ€ν„° μ΄λ£¨μ–΄μ§ˆ λ•Œ

μƒμ„±μžλ‚˜ λ©”μ„œλ“œλ₯Ό 톡해 μ΄ˆκΈ°ν™”ν•  경우: ν΄λž˜μŠ€λ‚˜ ꡬ쑰체가 생성될 λ•Œ μ™ΈλΆ€μ—μ„œ μ΄ˆκΈ°ν™” 값을 μ œκ³΅ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ΄λ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° κ°μ²΄λ‚˜ λ„€νŠΈμ›Œν¬ λ§€λ‹ˆμ €μ™€ 같이 λ‹€μ–‘ν•œ 섀정이 ν•„μš”ν•œ κ°μ²΄λŠ” μƒμ„±μžλ₯Ό 톡해 μ΄ˆκΈ°ν™”λœλ‹€.

class NetworkManager {
    let session: URLSession

    init(session: URLSession) {
        self.session = session
    }
}

//μ—¬κΈ°μ„œ session은 μ΄ˆκΈ°ν™” μ‹œμ μ—μ„œ 제곡된 κ°’μœΌλ‘œ μ„€μ •

 

 

2. μ§€μ—° μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•  λ•Œ

μ΄ˆκΈ°ν™” λΉ„μš©μ΄ 큰 κ°μ²΄λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•  λ•ŒκΉŒμ§€ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šλ„λ‘ μ§€μ—° μ΄ˆκΈ°ν™”(lazy initialization)λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

  • μ§€μ—° μ΄ˆκΈ°ν™”(lazy initialization)
    : lazy ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έλœ 속성은 ν•΄λ‹Ή 속성이 처음 접근될 λ•Œ μ΄ˆκΈ°ν™”λœλ‹€. 이와 같이 μ„ μ–Έν•˜λ©΄ μ΄ˆκΈ°ν™”κ°€ μ§€μ—°λ˜μ–΄ μ‹€μ œλ‘œ heavyResource에 μ ‘κ·Όν•˜κΈ° μ „κΉŒμ§€λŠ” HeavyResource μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ§€ μ•ŠλŠ”λ‹€.
  • μ΄ˆκΈ°ν™” μ‹œμ 
    : 클래슀 μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ μ¦‰μ‹œ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šκ³ , 처음 ν•΄λ‹Ή 속성에 μ ‘κ·Όν•  λ•Œ μ΄ˆκΈ°ν™”λœλ‹€. λ”°λΌμ„œ 이 μ½”λ“œλŠ” μ΄ˆκΈ°ν™”ν•  λ•Œ μ¦‰μ‹œ μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” μ½”λ“œκ°€ μ•„λ‹ˆλ‹€.
class ViewController: UIViewController {
    lazy var heavyResource: HeavyResource = {
        return HeavyResource()
    }()
}

 

 

3. μ΄ˆκΈ°ν™” μˆœμ„œκ°€ μ€‘μš”ν•  λ•Œ

객체 κ°„μ˜ μ˜μ‘΄μ„±μ΄ μžˆμ„ λ•Œ: νŠΉμ • 객체가 λ‹€λ₯Έ 객체에 μ˜μ‘΄ν•˜λŠ” 경우, μ΄ˆκΈ°ν™” μˆœμ„œλ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ μ„ μ–Έλ§Œ ν•˜κ³  μ΄ˆκΈ°ν™”λŠ” λ‚˜μ€‘μ— μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

- μ˜μ‘΄μ„± μ„€λͺ…: DependencyInjector ν΄λž˜μŠ€λŠ” Service 객체에 μ˜μ‘΄ν•˜κ³  μžˆλ‹€.

DependencyInjector 객체가 생성될 λ•Œ Service 객체가 ν•„μš”ν•˜λ©°, μ΄λŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λ˜μ–΄ μ΄ˆκΈ°ν™”λœλ‹€.

 

- μ˜μ‘΄μ„± μ΄ˆκΈ°ν™” μˆœμ„œ: DependencyInjector κ°μ²΄λŠ” service 속성을 μ΄ˆκΈ°ν™”ν•  λ•Œ Service 객체가 미리 μ΄ˆκΈ°ν™”λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

λ”°λΌμ„œ Service 객체λ₯Ό λ¨Όμ € μƒμ„±ν•˜κ³  이λ₯Ό DependencyInjector의 μƒμ„±μžμ— 전달해야 ν•œλ‹€.

class DependencyInjector {
    let service: Service
    
    init(service: Service) {
        self.service = service
        // λ‚˜μ€‘μ— serviceλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€λ₯Έ μ΄ˆκΈ°ν™” μˆ˜ν–‰
    }
}

// myService 객체가 λ¨Όμ € μ΄ˆκΈ°ν™”λ˜κ³ , κ·Έ λ‹€μŒμ— myInjectorκ°€ μƒμ„±λ˜λ©΄μ„œ service 속성이 μ΄ˆκΈ°ν™”λœλ‹€. 
// μ΄λŠ” 객체 κ°„μ˜ μ˜μ‘΄μ„±μ„ λͺ…ν™•νžˆ 보여쀀닀.
let myService = Service()
let myInjector = DependencyInjector(service: myService)

 

 

4. Optional νƒ€μž…μΌ λ•Œ

μ΄ˆκΈ°ν™” μ‹œμ μ— 값이 없을 수 μžˆμ„ λ•Œ: λ³€μˆ˜κ°€ 선언될 λ•Œ 값을 κ°€μ§ˆ μˆ˜λ„, κ°€μ§€μ§€ μ•Šμ„ μˆ˜λ„ μžˆλŠ” 경우 μ˜΅μ…”λ„ νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€.

class UserProfile {
    var profilePicture: UIImage?
}

 

 

5. λ³΅μž‘ν•œ μ΄ˆκΈ°ν™” 둜직이 μžˆμ„ λ•Œ

μ΄ˆκΈ°ν™” 둜직이 λ³΅μž‘ν•˜μ—¬ μ΄ˆκΈ°ν™” μ‹œμ μ—μ„œ μ¦‰μ‹œ 값을 μ œκ³΅ν•˜κΈ° μ–΄λ €μš΄ 경우, λ‚˜μ€‘μ— μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

class ComplexObject {
    let config: Config

    init() {
        // λ³΅μž‘ν•œ μ΄ˆκΈ°ν™” 둜직
        self.config = Config() 
    }
}

 

 

κ²°λ‘ 

μƒμ„±μžλ₯Ό 톡해 μ΄ˆκΈ°ν™”ν•˜λŠ” 방법은 더 μœ μ—°ν•˜κ³  λ‹€μ–‘ν•œ 상황에 λŒ€μ²˜ν•  수 μžˆλŠ” μž₯점을 μ œκ³΅ν•œλ‹€.

특히, μ˜μ‘΄μ„± μ£Όμž…κ³Ό ν…ŒμŠ€νŠΈμ˜ μš©μ΄μ„±μ„ κ³ λ €ν•  λ•Œ 더 쒋은 선택일 수 μžˆλ‹€.

반면, λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ΄ˆκΈ°ν™”λ˜λŠ” λ‹¨μˆœν•œ 경우라면 μ΄ˆκΈ°ν™” μ‹œ λ°”λ‘œ μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 방법이 더 적합할 수 μžˆλ‹€.


🌟 μ˜μ‘΄μ„± μ£Όμž…μ΄ 객체 μ§€ν–₯ μ„€κ³„μ—μ„œ μ€‘μš”ν•œ 이유

ν…ŒμŠ€νŠΈ μš©μ΄μ„± (Testability)

λ‹¨μœ„ ν…ŒμŠ€νŠΈ: μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 ν…ŒμŠ€νŠΈν•  객체에 κ°€μ§œ(mock) κ°μ²΄λ‚˜ μŠ€ν…(stub) 객체λ₯Ό μ£Όμž…ν•˜μ—¬ ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€. 이λ₯Ό 톡해 ν…ŒμŠ€νŠΈ ν™˜κ²½μ„ μ œμ–΄ν•˜κ³  예츑 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

 

μœ μ—°μ„± (Flexibility)

λ‹€μ–‘ν•œ κ΅¬ν˜„μ²΄ μ£Όμž…: μΈν„°νŽ˜μ΄μŠ€λ‚˜ ν”„λ‘œν† μ½œμ„ 톡해 λ‹€μ–‘ν•œ κ΅¬ν˜„μ²΄λ₯Ό μ£Όμž…ν•  수 μžˆμ–΄ μ½”λ“œμ˜ μœ μ—°μ„±μ΄ λ†’μ•„μ§„λ‹€.

protocol DatabaseService {
    func fetchData() -> [Data]
}

class LocalDatabaseService: DatabaseService {
    func fetchData() -> [Data] { /* 둜컬 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터 κ°€μ Έμ˜€κΈ° */ }
}

class RemoteDatabaseService: DatabaseService {
    func fetchData() -> [Data] { /* 원격 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 데이터 κ°€μ Έμ˜€κΈ° */ }
}

class DataManager {
    let databaseService: DatabaseService

    init(databaseService: DatabaseService) {
        self.databaseService = databaseService
    }
}

 

μž¬μ‚¬μš©μ„± (Reusability)

λͺ¨λ“ˆν™”: μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 각 ꡬ성 μš”μ†Œλ₯Ό λ…λ¦½μ μœΌλ‘œ λ§Œλ“€ 수 μžˆμ–΄ μž¬μ‚¬μš©μ„±μ΄ λ†’μ•„μ§„λ‹€. 이λ₯Ό 톡해 μ½”λ“œλ₯Ό λͺ¨λ“ˆν™”ν•˜κ³ , νŠΉμ • ꡬ성 μš”μ†Œλ₯Ό λ‹€λ₯Έ ν”„λ‘œμ νŠΈλ‚˜ λͺ¨λ“ˆμ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆλ‹€.

 

μœ μ§€λ³΄μˆ˜μ„± (Maintainability)

단일 μ±…μž„ 원칙 (Single Responsibility Principle): 객체의 μ±…μž„μ„ λΆ„λ¦¬ν•˜μ—¬ μœ μ§€λ³΄μˆ˜μ„±μ„ 높인닀. μ˜μ‘΄μ„± μ£Όμž…μ„ 톡해 각 κ°μ²΄λŠ” μžμ‹ μ˜ μ±…μž„μ—λ§Œ 집쀑할 수 있으며, μ˜μ‘΄μ„± κ΄€λ¦¬λŠ” μ™ΈλΆ€μ—μ„œ λ‹΄λ‹Ήν•˜κ²Œ λœλ‹€.

 

μ½”λ“œμ˜ 가독성 ν–₯상 (Readability)

λͺ…ν™•ν•œ μ˜μ‘΄μ„±: μƒμ„±μžλ₯Ό 톡해 μ˜μ‘΄μ„±μ„ μ£Όμž…ν•¨μœΌλ‘œμ¨, μ–΄λ–€ 객체가 μ–΄λ–€ μ˜μ‘΄μ„±μ„ ν•„μš”λ‘œ ν•˜λŠ”μ§€ λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ 가독성을 높이고, λ‹€λ₯Έ κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λŠ” 데 도움이 λœλ‹€.

 

κ²°λ‘ 

μ˜μ‘΄μ„± μ£Όμž…μ€ 객체 μ§€ν–₯ μ„€κ³„μ—μ„œ μ€‘μš”ν•œ μ›μΉ™μœΌλ‘œ, ν…ŒμŠ€νŠΈ μš©μ΄μ„±, μœ μ—°μ„±, μž¬μ‚¬μš©μ„±, μœ μ§€λ³΄μˆ˜μ„±, 그리고 μ½”λ“œμ˜ 가독성을 λ†’μ΄λŠ” 데 크게 κΈ°μ—¬ν•œλ‹€. 이λ₯Ό 톡해 더 μ•ˆμ •μ μ΄κ³  κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  수 μžˆλ‹€.

 

 

 

κ΄€λ ¨κΈ€ 더보기