Swift(21) init 초기화 메소드, 오버라이딩

개발렬·2023년 9월 16일
0

Swift

목록 보기
21/23
post-thumbnail

init 초기화 메소드

init(parameters) {
    // 초기화 코드
}

클래스의 초기화 메서드(Initializer)에 관한 특징을 설명하겠습니다.

  1. 메소드의 이름을 init으로 통일합니다:
  • 초기화 메서드의 이름은 모두 init으로 통일되며, 이를 통해 Swift에서 초기화 메서드임을 명확하게 식별할 수 있습니다.
  1. 매개변수의 개수, 이름, 타입은 임의로 정의할 수 있습니다:
  • 초기화 메서드는 필요한 매개변수를 받아 인스턴스를 초기화합니다. 따라서 매개변수의 개수와 이름, 타입을 클래스 내부의 프로퍼티와 관련된 요구 사항에 따라 임의로 정의할 수 있습니다.
    매개변수 순서를 클래스 내부의 프로퍼티 순서와 다르게 정의하는 것은 가능하지만, 일반적으로는 가독성, 일관성, 외부 API 호환성을 고려하여 프로퍼티 순서와 일치시키는 것이 좋습니다.
  1. 다양한 형식의 초기화 메서드를 정의할 수 있습니다:
  • 다양한 초기화 메서드를 정의하여 오버로딩할 수 있습니다. 이를 통해 여러 가지 형식의 초기화를 지원하고, 다양한 매개변수 조합을 허용할 수 있습니다. 이러한 다양성은 클래스를 사용하는 다른 개발자들이 인스턴스를 생성하는 데 유용합니다.
  1. 정의된 초기화 메서드는 직접 호출되고도 하지만, 보통은 인스턴스 생성 시 간접적으로 호출됩니다:
  • 초기화 메서드는 클래스의 인스턴스를 생성하고 초기화하는 주요 방법입니다. 따라서 보통은 인스턴스를 생성할 때 초기화 메서드가 자동으로 호출됩니다. 이로써 인스턴스의 프로퍼티를 설정하고 초기화 작업을 수행할 수 있습니다.
let car = Car.init(speed: 20)

Car 인스턴스 생성시 초기화 메소드를 호출하지만 보통은 생략을 한다.

초기화 구문의 오버라이딩

오버라이딩된 초기화 메서드가 호출되면, 부모 클래스에서 정의한 초기화 메서드가 자동으로 실행되지 않습니다. 이로 인해 부모 클래스에서 초기화된 프로퍼티 초기화가 누락될 수 있습니다. 이런 상황을 방지하기 위해서는 오버라이딩된 초기화 메서드 내에서 부모 클래스의 초기화 메서드를 명시적으로 호출해야 합니다. 이를 위해 super.init을 사용합니다.

class BaseClass {
    var baseValue: Double
    
    init() {
        self.baseValue = 0.0 // 부모 클래스에서 프로퍼티 초기화
        print("Base Init")
    }
}

class Subclass: BaseClass {
    var additionalValue: Double
    
    override init() {
        self.additionalValue = 0.0
        super.init() // 부모 클래스의 초기화 메서드를 호출하여 부모 클래스에서 프로퍼티 초기화를 실행
        self.baseValue = 10.0 // 자식 클래스에서 추가적인 초기화 작업 수행
        print("Subclass Init")
    }
}

만약 부모 클래스에서 초기화 메서드를 정의하지 않거나 기본 초기화 메서드만 정의한 경우, 자식 클래스에서 초기화 메서드를 호출할 때 자동으로 부모 클래스의 초기화 메서드가 호출됩니다.

class Parent {
    var parentProperty: Int
    
    init() {
        parentProperty = 0
        print("Parent Init")
    }
}

class Child: Parent {
    var childProperty: Int
    
    init(childValue: Int) {
        childProperty = childValue
        // 부모 클래스의 초기화 메서드는 자동으로 호출됨
        print("Child Init")
    }
}
profile
Flutter, iOS...나는 모바일 앱 개발자

0개의 댓글