[ Swift ] μμ± μ΄κΈ°ν μ λ°λ‘ μΈμ€ν΄μ€ν νλ κ²½μ°μ init μμ±μλ₯Ό ν΅ν μ΄κΈ°ν λκ° λ€λ₯΄μ§?
μ°λ½μ² λ§λ€κΈ° κ³Όμ ν΄μ€ μμμ 보λ€κ° μλ¬Έμ΄ λ μ μ΄ μλ€.
λ°λ‘ μΈμ€ν΄μ€λ₯Ό λκ°μ΄ μ μΈνλ κ² κ°μλ° = λ₯Ό μ¬μ©νλ κ²½μ°μ : μ μ¬μ©νλ κ²½μ°κ° μμλ€.
κ°λ¨νκ² λ³΄λ©΄ μλμ κ°λ€.
= (λ±νΈ)
λ±νΈ(=)λ κ°μ ν λΉν λ μ¬μ©λλ€. μ¦, λ³μλ μμλ₯Ό μ μΈνλ©΄μ μ΄κΈ° κ°μ μ§μ νλ€.
=μ μ¬μ©νλ κ²½μ°, ν΄λΉ μμ±μ ν΄λμ€κ° μΈμ€ν΄μ€νλ λ λ°λ‘ κ°μ κ°μ§κ² λλ€.
: (μ½λ‘ )
μ½λ‘ (:)μ νμ μ μ§μ ν λ μ¬μ©λλ€. μ¦, λ³μλ μμλ₯Ό μ μΈν λ ν΄λΉ λ³μλ μμκ° κ°μ§ μ μλ νμ μ λͺ μνλ κ²μ΄λ€.
:μ μ¬μ©νλ κ²½μ°, μ΄κΈ° κ°μ ν λΉνμ§ μκ³ νμ λ§ μ§μ ν©λλ€. μ΄κΈ° κ°μ μμ±μμμ ν λΉλ μ μλ€.
μ’ λ μμΈνκ² μμ보μ.
μ΄ λ°©λ²μ νΉμ ν΄λμ€μ μΈμ€ν΄μ€κ° νμ κ°μ λ°©μμΌλ‘ μ΄κΈ°νλλ κ²½μ°μ μ ν©νλ€.
μλ₯Ό λ€μ΄, CoreDataRepositoryλ PhoneBookModeκ° νμ λμΌν μ΄κΈ° μνλ₯Ό κ°μ§λ€λ©΄ μ΄ λ°©λ²μ΄ λ¨μνκ³ νΈλ¦¬ν μ μλ€.
μ₯μ
λ¨μ
μ΄ λ°©λ²μ ν΄λμ€ μΈμ€ν΄μ€κ° μ΄κΈ°νλ λλ§λ€ λ€λ₯Έ κ°μ΄λ κ°μ²΄λ‘ μ΄κΈ°νλμ΄μΌ νλ κ²½μ°μ μ ν©νλ€.
μλ₯Ό λ€μ΄, μ¬λ¬ κ°μ CoreDataRepository μΈμ€ν΄μ€κ° μ‘΄μ¬νκ±°λ, λ€μν λͺ¨λλ₯Ό μ§μν΄μΌ νλ κ²½μ° μ μ©νλ€.
λν, μ λ ν μ€νΈ μμ± μ λ€μν μλ리μ€λ₯Ό ν μ€νΈν μ μμ΄ λ ν¨κ³Όμ μ΄λ€.
μ₯μ
λ¨μ
1. μ΄κΈ°νκ° μΈλΆλ‘λΆν° μ΄λ£¨μ΄μ§ λ
μμ±μλ λ©μλλ₯Ό ν΅ν΄ μ΄κΈ°νν κ²½μ°: ν΄λμ€λ κ΅¬μ‘°μ²΄κ° μμ±λ λ μΈλΆμμ μ΄κΈ°ν κ°μ μ 곡ν΄μΌ νλ κ²½μ°μ΄λ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€ μ°κ²° κ°μ²΄λ λ€νΈμν¬ λ§€λμ μ κ°μ΄ λ€μν μ€μ μ΄ νμν κ°μ²΄λ μμ±μλ₯Ό ν΅ν΄ μ΄κΈ°νλλ€.
class NetworkManager {
let session: URLSession
init(session: URLSession) {
self.session = session
}
}
//μ¬κΈ°μ sessionμ μ΄κΈ°ν μμ μμ μ 곡λ κ°μΌλ‘ μ€μ
2. μ§μ° μ΄κΈ°νκ° νμν λ
μ΄κΈ°ν λΉμ©μ΄ ν° κ°μ²΄λ 리μμ€λ₯Ό μ¬μ©ν λκΉμ§ μ΄κΈ°ννμ§ μλλ‘ μ§μ° μ΄κΈ°ν(lazy initialization)λ₯Ό μ¬μ©ν μ μλ€.
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)
λͺ νν μμ‘΄μ±: μμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ ν¨μΌλ‘μ¨, μ΄λ€ κ°μ²΄κ° μ΄λ€ μμ‘΄μ±μ νμλ‘ νλμ§ λͺ νν μ μ μλ€. μ΄λ μ½λμ κ°λ μ±μ λμ΄κ³ , λ€λ₯Έ κ°λ°μκ° μ½λλ₯Ό μ΄ν΄νλ λ° λμμ΄ λλ€.
κ²°λ‘
μμ‘΄μ± μ£Όμ μ κ°μ²΄ μ§ν₯ μ€κ³μμ μ€μν μμΉμΌλ‘, ν μ€νΈ μ©μ΄μ±, μ μ°μ±, μ¬μ¬μ©μ±, μ μ§λ³΄μμ±, κ·Έλ¦¬κ³ μ½λμ κ°λ μ±μ λμ΄λ λ° ν¬κ² κΈ°μ¬νλ€. μ΄λ₯Ό ν΅ν΄ λ μμ μ μ΄κ³ κ΄λ¦¬νκΈ° μ¬μ΄ μννΈμ¨μ΄λ₯Ό κ°λ°ν μ μλ€.
[ Swift κΈ°μ΄ λ¬Έλ² ] μ λ€λ¦(Generics) (0) | 2024.07.31 |
---|---|
[ Swift ] initκ³Ό required init?μ λν΄μ (0) | 2024.07.21 |
[ Swift ] CRUDμ UserDefaults / κ°λ¨ν λ©λͺ¨ μ± λ§λ€κΈ° (0) | 2024.07.14 |
[ Swift ] CRUDμ CoreData νλ μμν¬ (0) | 2024.07.14 |
[ Swift ] λ©λͺ¨λ¦¬ κ΄λ¦¬(ARC) (0) | 2024.07.13 |