Dog foot print

[SWIFT] 초기화 본문

IOS/Swift

[SWIFT] 초기화

개 발자국 2021. 7. 20. 20:27

초기화 구문

초기화 구문은 init으로 시작되는 생성자 함수를 의미합니다. 초기화 구문의 가장 큰 목적은 인스턴스 마다 멤버 프로퍼티의 값을 “설정하기 위함” 입니다.

TIP : 멤버 와이즈 초기화 구문은 구조체만 가능합니다.

초기화 메서드 특성

초기화 메서드의 형식은 다음과 같습니다.

init([param] : [type]){
    //실행할 코드 
}

Tip : 만약 설정할 멤버가 존재하지 않는다면 init 메서드는 생략 할 수 있습니다.

초기화 메서드의 특성은 다음과 같습니다.

  • 초기화 메서드의 이름은 무조건 init 이다.
  • 매개변수의 개수, 이름, 타입은 임의로 정할 수 있으나, 해당 init 구문을 통해서 옵셔널 타입을 제외한 모든 저장 프로퍼티는 값을 가지고 있어야 한다.
  • 매개변수의 이름과 개수, 타입이 서로 다른 여러 개의 초기화 메서드를 정의 할 수 있다.
    • 이것이 가능한 이유는 스위프트가 orverloading 을 지원하기 때문이다.
  • 정의된 초기화 메서드는 직접호출되기도 하지만, 대부분 인스턴스 생성 시 간접적으로 호출된다.

직접 호출 예제

import UIKit

class SuperClass{
    func foo(){
        print("hello")
    }
}


let superOBJ = SuperClass.init() // 직접 호출
let superOBJ2 = SuperClass() //간접 호출

초기화 메서드의 오버라이딩

import UIKit

class SuperClass{
    var age : Int
    init(age : Int) {
        print("Super Class !");
        self.age = age;
    }
    func foo(){
        print("hello")
    }
}

class SubClass : SuperClass{
    override init(age : Int){
        super.init(age : age);
        print("Sub Class!")
    }
}

let subOBJ = SubClass(age : 10)
//super class ! 
//sub Class

초기화 구문 역시 메서드의 일종이기 때문에, 이를 오버라이딩 하기 위해서는 overriding 예약어를 붙여주어야 합니다. 다만 새롭게 오버라이딩 하여도 슈퍼클래스의 초기화 구문에서는 실행해주지만 서브 클래스에서 오버라이딩 한 초기화에서 실행하지 않는 구문으로 인하여 오류가 발생 할 수 있으니 초기화 메서드를 오버라이딩 하였을 때는 오버라이딩 된 init을 호출 하여야 합니다.

초기화 델리게이션

import UIKit

class SuperClass{

    init (){
        print("Super Class")
    }

    func foo(){
        print("hello")
    }
}

class SubClass : SuperClass{
    override init(){
        print("Sub Class!")
    }
}

let subOBJ = SubClass()

초기화 델리게이션은 부모의 초기화 구문을 오버라이딩 한 초기화에서 호출 하여, 연속적으로 Root Class 까지 호출이 발생하는 것을 의미합니다. 이 때 오버라이딩 한 초기화 구문이 파라메터가 존재하지 않고, 부모 또한 init() 식별자의 초기화 구문만 존재한다면, 오버라이딩 한 초기화 구문에서는 super.init()을 통해 부모의 초기화 구문을 호출 하지 않아도 됩니다. 만약 부모의 초기화 구문이 init() 외에 다른 식별자를 가진 초기화 구문이 존재한다면 super.init을 호출하여야 합니다.

import UIKit

class SuperClass{

    init (){
        print("Super Class")
    }

    init(age : Int){
        print(age.description);
    }

    func foo(){
        print("hello")
    }
}

class SubClass : SuperClass{
    override init(){
        super.init()
        print("Sub Class!")
    }
}

let subOBJ = SubClass()
반응형

'IOS > Swift' 카테고리의 다른 글

[SWIFT] protocol  (0) 2021.07.21
[SWIFT] enumeration  (0) 2021.07.21
[SWIFT] Type casting  (0) 2021.07.20
[SWIFT] 상속  (0) 2021.07.15
[SWIFT] 메서드  (0) 2021.07.13
Comments