[swift] Swift에서의 초기화 메서드와 타입 상속

초기화 메서드

Swift에서는 클래스나 구조체의 인스턴스를 생성할 때 초기화 메서드를 사용합니다. 초기화 메서드는 인스턴스를 사용하기 전에 필요한 값들을 초기화하는 역할을 합니다.

Swift에서는 두 가지 종류의 초기화 메서드를 지원합니다. Designated InitializerConvenience Initializer입니다.

Designated Initializer

Designated Initializer는 클래스나 구조체의 모든 프로퍼티를 초기화하는 메서드입니다. 클래스의 경우는 init 키워드를 사용하여 정의하며, 구조체의 경우는 init 키워드를 사용하여 정의합니다.

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }
}

struct Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

Convenience Initializer

Convenience Initializer는 해당 클래스나 구조체의 특정 프로퍼티만 초기화하는 메서드입니다. Convenience Initializer는 convenience 키워드를 사용하여 정의하며, init 키워드를 사용하여 호출하는 Designated Initializer를 호출해야 합니다.

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)
    }
}

struct Point {
    var x: Int
    var y: Int

    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }

    init(value: Int) {
        self.init(x: value, y: value)
    }
}

타입 상속

Swift는 클래스 타입만을 상속할 수 있으며, 다중 상속은 지원하지 않습니다. 상속은 클래스가 다른 클래스의 프로퍼티와 메서드를 상속받는 것을 의미합니다.

상속을 위해서는 부모 클래스를 정의하고 자식 클래스에서 상속받을 클래스를 명시해야 합니다. 자식 클래스는 부모 클래스의 모든 프로퍼티와 메서드를 사용할 수 있으며, 필요에 따라 재정의할 수도 있습니다.

class Animal {
    var name: String

    init(name: String) {
        self.name = name
    }

    func eat() {
        print("\(name) is eating")
    }
}

class Dog: Animal {
    func bark() {
        print("Woof woof!")
    }
}

위의 예시에서 Dog 클래스는 Animal 클래스를 상속받았습니다. 따라서 Dog 클래스는 Animal 클래스의 프로퍼티와 메서드를 사용할 수 있습니다. 또한 Dog 클래스는 bark 메서드를 추가로 가지고 있습니다.

재정의 (Override)

상속받은 메서드나 프로퍼티의 동작을 변경하고 싶을 경우, 자식 클래스에서 해당 메서드나 프로퍼티를 재정의할 수 있습니다. 이를 재정의(Override)라고 합니다.

class Animal {
    var name: String

    init(name: String) {
        self.name = name
    }
    
    func makeSound() {
        print("Animal is making a sound")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("\(name) is barking")
    }
}

위의 예시에서 Dog 클래스는 Animal 클래스의 makeSound 메서드를 재정의하여 동작을 변경하였습니다.