🔥 Extension으로 이니셜라이저 추가하기

432자
6분

Extension을 사용하면 기존 타입에 새로운 이니셜라이저를 추가할 수 있습니다. 이를 통해 다른 타입을 확장하여 여러분만의 사용자 정의 타입을 이니셜라이저 매개변수로 받아들이거나, 타입의 원래 구현에 포함되지 않은 추가적인 초기화 옵션을 제공할 수 있죠.

Extension은 클래스에 새로운 편의 이니셜라이저를 추가할 수 있지만, 지정 이니셜라이저나 디이니셜라이저는 추가할 수 없습니다. 지정 이니셜라이저와 디이니셜라이저는 항상 원래 클래스 구현에서 제공되어야 합니다.

만약 Extension을 사용하여 모든 저장 속성에 기본값을 제공하고 사용자 정의 이니셜라이저를 정의하지 않는 값 타입에 이니셜라이저를 추가하는 경우, Extension의 이니셜라이저 내에서 해당 값 타입의 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 호출할 수 있습니다. 이는 Initializer Delegation for Value Types에서 설명한 대로 값 타입의 원래 구현의 일부로 이니셜라이저를 작성했다면 불가능했을 것입니다.

다른 모듈에서 선언된 구조체에 Extension을 사용하여 이니셜라이저를 추가하는 경우, 정의 모듈의 이니셜라이저를 호출하기 전까지는 새로운 이니셜라이저에서 self에 접근할 수 없습니다.

아래 예제는 기하학적 사각형을 나타내기 위해 사용자 정의 Rect 구조체를 정의합니다. 또한 이 예제는 SizePoint라는 두 개의 지원 구조체를 정의하는데, 이들은 모두 모든 속성에 대해 0.0의 기본값을 제공합니다:

struct Size {
    var width = 0.0, height = 0.0
}
 
struct Point {
    var x = 0.0, y = 0.0
}
 
struct Rect {
    var origin = Point()
    var size = Size()
}
swift

Rect 구조체는 모든 속성에 기본값을 제공하므로, Default Initializers에서 설명한 대로 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 자동으로 받습니다. 이 이니셜라이저들을 사용하여 새로운 Rect 인스턴스를 생성할 수 있습니다:

let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
                          size: Size(width: 5.0, height: 5.0))
swift

특정 중심점과 크기를 받는 추가적인 이니셜라이저를 제공하기 위해 Rect 구조체를 확장할 수 있습니다:

extension Rect {
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}
swift

이 새로운 이니셜라이저는 제공된 center 점과 size 값을 기반으로 적절한 원점을 계산하는 것으로 시작합니다. 그런 다음 이니셜라이저는 구조체의 자동 멤버와이즈 이니셜라이저인 init(origin:size:)를 호출하여 새로운 원점과 크기 값을 해당 속성에 저장합니다:

let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
                      size: Size(width: 3.0, height: 3.0))
// centerRect의 origin은 (2.5, 2.5)이고 size는 (3.0, 3.0)입니다.
swift

Extension을 사용하여 이니셜라이저를 추가하면 기존 타입의 초기화 옵션을 확장할 수 있습니다. 이는 특히 라이브러리나 프레임워크에서 제공하는 타입을 사용할 때 유용하죠. 타입의 원래 구현을 수정할 수 없더라도 Extension을 통해 필요한 초기화 로직을 추가할 수 있습니다.

또한 이 기법은 코드의 모듈성과 캡슐화를 향상시킵니다. 관련된 초기화 로직을 Extension으로 그룹화하여 기존 타입과 분리할 수 있기 때문이죠. 이렇게 하면 타입의 핵심 기능과 추가적인 초기화 옵션을 깔끔하게 구분할 수 있습니다.

Extension과 이니셜라이저를 함께 사용하면 기존 타입을 더욱 유연하고 강력하게 확장할 수 있습니다. 이는 코드의 재사용성을 높이고 타입의 활용도를 극대화하는데 큰 도움이 됩니다. Extension의 강력함을 잘 활용하여 더욱 표현력 있고 모듈화된 코드를 작성해 보세요!