iOS/Swift

인스턴스 생성 및 소멸 3편 (초기화 위임)

밤새는 탐험가89 2024. 1. 31. 10:32

 

초기화 위임 

 

값 타입구조체 및 열거형코드의 중복을 피하기 위할 목적으로 

이니셜라이저가 다른 이니셜라이저에게 일부 초기화를 위임할 수 있음 

 

 

enum Student {
    case ele, mid, high
    case none

    init(koreanAge: Int) {
        switch koreanAge {
            case 8...13:
            self = .ele 

            case 14...16:
            self = .mid

            case 17...19:
            self = .high

            default:
            self = .none
        }
    }

    init(bornAt: Int, currentYear: Int) {
         self.init(koreanAge: currentYear - bornAt + 1)   
    }
    
}

var jerry: Student = Student(koreanAge: 16)
print(jerry)    // mid

jerry = Student(bornAt: 1999, currentYear: 2023)
print(jerry)    // none

 

 

위의 열거형은 2개의 사용자 정의 이니셜라이저가 있음

 

 

첫 번째 이니셜라이저는 koreanAge를 전달받아 나이에 맞는 학교를 

case로 구분한 이니셜라이저로 초기화 

 

 

init(koreanAge: Int) {
    .....
}

 

 

두 번째 이니셜라이저는 태어난 해와 현재 연도를 전달받아 나이로 계산한 후

첫 번째 이니셜라이저로 초기화를 위임함 

 

 

만약에 "초기화 위임"을 사용하지 않는다면?

두 번째 이니셜라이저에도 첫 번째 이니셜라이저와 마찬가지로 

koreanAge에 해당하는 switch 구문을 또 만들어야 하는 번거로움 발생함 

 

 

init(bornAt: Int, currentYear: Int) {
     self.init(koreanAge: currentYear - bornAt + 1)   
}

 

 

 

여기 Money 구조체가 있음

안에는 2개의 저장 프로퍼티가 있고, 

해당 프로퍼티를 초기화하는 코드가

2곳에 작성되어 있음 (중복된 코드)

 

 

struct Money {
    var myMoney: Int
    var yourMoney: Int

    init(myMoney: Int, yourMoney: Int) {
        self.myMoney = myMoney
        self.yourMoney = yourMoney
    }

    init(ourMoney: Int) {
        self.myMoney = ourMoney
        self.yourMoney = ourMoney
    }
}

 

 

 

여기서 만약에 yourMoney 변수의 값을 특정 값으로 초기화하려고 한다면?

 

 

struct Money {
    var myMoney: Int
    var yourMoney: Int

    init(myMoney: Int, yourMoney: Int) {
        self.myMoney = myMoney
        self.yourMoney = 1000
    }

    init(ourMoney: Int) {
        self.myMoney = ourMoney
        self.yourMoney = 1000
    }
}

 

 

이니셜라이저 2곳 모두 값을 변경해주어야 하는 번거러움 있음 

따라서 위의 코드에 "초기화 위임"을 써본다면?

 

 

아래 코드처럼 모든 프로퍼티를 초기화하는 첫 번째 이니셜라이저를 생성한 후 

두 번째 이니셜라이저가 이를 이용하도록 만듦

 

 

struct Money {
    var myMoney: Int
    var yourMoney: Int

    init(myMoney: Int, yourMoney: Int) {
        self.myMoney = myMoney
        self.yourMoney = 1000
    }

    init(ourMoney: Int) {
        self.init(myMoney: ourMoney, yourMoney: ourMoney)
    }
}