관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 상속 관계에서의 초기화 테크닉 (#타입을 넘겨서 초기화하기) 본문

iOS 응용 (swift)

[iOS - swift] 상속 관계에서의 초기화 테크닉 (#타입을 넘겨서 초기화하기)

jake-kim 2023. 9. 26. 02:01

일반적인 초기화 방법

  • 상속 관계에서 주입해주는 인스턴스가 super class 것이든, sub class 것이든 상관 없이 초기화하고 특정 업무를 수행할 때 인스턴스를 넘기는 형태로 구현
class BaseA {
    var value: String {
        "BaseA"
    }
    
    required init() {
    }
}

class SubA: BaseA {
    override var value: String {
        "SubA"
    }
    
    required init() {
        super.init()
    }
}


printByPassInstance(a: BaseA()) // BaseA
printByPassInstance(a: SubA()) // SubA

func printByPassInstance(a: BaseA) {
    print(a.value)
}
  • 이 초기화 방법은 사용하는 쪽에서 Instance를 만들어서 주입해주는 방법
    • 위에서 살펴본 printByPassInstance는 인스턴스를 주입 받는 형태이고, 이 인스턴스의 사용은 printByPassInstance 구현부에서 사용이 되는 것
    • 엄밀히 따지면 인스턴스가 필요한 시점은 함수의 구현부이고 이 구현부에서만 사용하고 없어지는 인스턴스이므로 사용하는 쪽에서 굳이 인스턴스가 필요 없는 상태

타입을 넘겨서 초기화하기

  • 아래처럼 타입만을 넘겨서, 불필요한 인스턴스 없이 사용할 수 있는 방법이 존재
printByPassType(type: BaseA.self) // BaseA
printByPassType(type: SubA.self) // SubA
  • 함수 구현부를 보면 type을 받으면 그 type에 해당하는 인스턴스 메소드를 사용할 수 있기 때문에 함수 구현부에서 인스턴스 초기화가 가능
    • 불필요한 인스턴스를 이 함수가 필요한 곳에서 만들지 않고 함수 내부 구현부에서 만들도록 하면 필요한곳에서 만들어서 쓰고, 이 인스턴스의 관심사가 아닌 클라이언트 코드에서는 초기화 코드가 없으므로 더욱 명확한 코드 유지가 가능
func printByPassType(type: BaseA.Type) {
    let instance = type.init()
    print(instance.value)
}

* 전체 코드: https://github.com/JK0369/ExTypeInit

Comments