[swift] Swift 초기화 구문 및 메서드의 상속 우선순위

Swift에서는 클래스와 구조체를 초기화하고 메서드를 호출하는 방법에 대해 다양한 우선순위 규칙이 적용됩니다. 이러한 규칙을 이해하고 활용하는 것은 프로그래밍 작업을 수행하는 데 매우 중요합니다.

초기화 구문(Inicialization Syntax)

클래스 혹은 구조체를 초기화하기 위해서는 초기화 구문을 사용해야 합니다. Swift에서는 초기화 구문을 정의할 때 다른 초기화 구문을 호출할 수 있습니다. 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다. 예를 들어, 아래의 코드는 Person 클래스의 초기화 구문을 정의한 예시입니다.

class Person {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    convenience init(name: String) {
        self.init(name: name, age: 0)
    }
}

위의 예시에서 Person 클래스는 nameage라는 두 개의 프로퍼티를 가지고 있습니다. init(name:age:)라는 초기화 구문은 nameage를 인자로 받아 객체를 초기화합니다. 또한, convenience init(name:)이라는 보조 초기화 구문도 정의되어 있습니다. 이 초기화 구문은 name만 인자로 받고 age는 자동으로 0으로 초기화됩니다.

초기화 구문 및 상속(Inicialization and Inheritance)

Swift에서는 클래스를 상속할 때 초기화 구문의 호출과 상속 우선순위에 대한 몇 가지 규칙이 적용됩니다. 기본적으로 자식 클래스는 부모 클래스의 지정 초기화 구문을 호출해야 합니다. 다만, 조건에 따라 다른 초기화 구문을 호출할 수도 있습니다. 아래는 상속 관계에서 초기화 구문을 호출하는 예시입니다.

class Animal {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    convenience init() {
        self.init(name: "Unknown")
    }
}

class Dog: Animal {
    var breed: String
    
    init(name: String, breed: String) {
        self.breed = breed
        super.init(name: name)
    }
    
    override convenience init(name: String) {
        self.init(name: name, breed: "Unknown")
    }
}

let myDog = Dog(name: "Max", breed: "Labrador")

위의 예시에서 Dog 클래스는 Animal 클래스를 상속받고 있습니다. Dog 클래스는 namebreed라는 프로퍼티를 갖고 있으며, init(name:breed:)init(name:)이라는 초기화 구문이 정의되어 있습니다. Dog 클래스의 init(name:breed:) 초기화 구문에서는 breed를 새로 추가하는 로직을 처리한 뒤, super.init(name: name)을 통해 부모 클래스인 Animal의 초기화 구문을 호출하고 있습니다. 또한, Dog 클래스는 부모 클래스의 보조 초기화 구문 중 하나인 init(name:)을 오버라이딩하여, breed를 자동으로 “Unknown”으로 초기화하도록 하였습니다.

정리

Swift에서 초기화 구문과 메서드의 상속 우선순위에는 몇 가지 규칙이 적용됩니다. 아래는 이를 요약한 내용입니다.

이러한 규칙을 잘 이해하고 활용하여 상속 관계에서 초기화 구문과 메서드를 올바르게 호출하는 것은 Swift 프로그래밍에서 매우 중요한 요소입니다.

출처: The Swift Programming Language