본문 바로가기
iOS/Swift 문법 심화 학습

Initializer

by 황민우 2022. 1. 27.

정의

초기화 = 클래스, 구조체, 열거형 인스턴스를 사용하기 위해 준비 작업을 하는 단계입니다.

이 단계에서 저장 프로퍼티의 초기 값을 설정.

초기화 과정은 initializer를 정의 하는 것으로 구현 할 수 있습니다.
initializer는 값을 반환하지 않으며 초기화와 반대로 여러 값과 자원을 해지시키는 deinitializer도 있습니다.

-

인스턴스가 생성 되었을 때, 기본값(초기화 과정)이 필수적으로 있어야합니다.
이 과정에서 이니셜라이저를 사용하면 프로퍼티 기본값을 사용하지 않더라도

실제로 인스턴스가 초기화될 때 원하는 값들을 초기화시킬 수 있습니다.


이니셜라이저의 사용

 

이니셜라이저는 특정 타입의 인스턴스를 생성합니다.

아래의 형식은 가장 간단한 형태로 파라미터가 없이 init 키워드를 사용하는 방법입니다.

-

이니셜라이저는 일종의 함수이기도 하지만,

init 키워드 앞에 func를 작성하지 않고 작성할 수 있으며 괄호 안에 파라미터들을 작성해

코드블록에 파라미터의 값을 초기화하는 저장 프로퍼티를 작성할 수 있습니다. 

 

형식

init( ) {
	// 코드작성
}

 

예제

다음 예제는 Introduce 클래스에서 name이라는 프로퍼티를 선언하고,

이니셜라이저를 통해 name 프로퍼티의 값을 초기화하는 코드입니다.

class Introduce {
    var name: String
    init(){
        name = "철수"
    }
}
var I = Introduce()
print("안녕하세요, 저는 \(I.name)입니다.")


실행결과
// 안녕하세요, 저는 철수입니다.

옵셔널 프로퍼티 타입

 

프로퍼티 중 초기값이 필요없거나 나중에 추가될 수 있는 초기값을 사용하기위해

옵셔널을 사용할 수 있습니다. 

 

예제

옵셔널 프로퍼티는 자동으로 nil값이 됩니다.

class Man {
    var name: String
    var age: Int
    var nickName: String?

    init(name: String, age: Int, nickName: String){
        self.name = name
        self.age = age
        self.nickName = nickName
    }
    
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}
let A = Man(name: "짱구", age: 5, nickName: "신노스케")
let B = Man(name: "철수", age: 5)

암시적 추출 옵셔널

 

옵셔널 프로퍼티 타입의 반대의 경우로

꼭 필요한 프로퍼티가 있을땐 옵셔널 ! 를 사용하면 됩니다.

 

예제

직전의 예제와 이어지는 예제입니다.

마지막 부분에 happy.owner 값을 주지 않는 경우 오류가 발생하게됩니다.

class Man {
    var name: String
    var age: Int
    var nickName: String?

    init(name: String, age: Int, nickName: String){
        self.name = name
        self.age = age
        self.nickName = nickName
    }
    
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
}
class Puppy {
    var name: String
    var owner: Man!
    
    init(name: String){
        self.name = name
    }
    func goOut() {
        print("\(name)가 주인 \(owner.name)과 산책합니다.")
    }
}

let happy: Puppy = Puppy(name: "happy")
happy.owner = tom
happy.goOut

 


실패가능한 이니셜라이저

 

이니셜라이저 매개변수로 전달되는 초기값이 잘못된 경우 인스턴스 생성에 실패할 수 있습니다.

실패하면 nil을 반환하며, 반환타입이 옵셔널 타입이기때문에 init? 키워드를 사용합니다.

 

예제

다음 코드에서는 joker의 age값이 범위를 넘었기 때문에, nil 값으로 초기화됩니다.

class test {
    var name: String
    var age: Int
    var nickName: String?
    
    init?(name: String, age: Int) {
        if (0...120).contains(age) == false {
            return nil
        }
    
        
        self.name = name
        self.age = age
    }
}
let john: test? = test(name: "john", age: 23)
let joker: test? = test(name: "joker", age: 123)
print(john)
print(joker)

 


디이니셜라이저

 

클래스 인스턴스가 메모리에서 해제되는 시점에 자동으로 호출됩니다.

그렇기때문에 인스턴스가 해제되는 시점에서 해야할 기능을 구현할 수 있습니다.

 

예제

변수 A에 대한 값을 nil로 변경시켰기때문에, A인스턴스가 더 이상 필요하지않아 메모리에서 해제되며

deinit가 작동되며 Exit를 출력하며 종료됩니다.

class test{
    var name: String
    var age: Int
    var NickName: String?
    
    init(name: String, age: Int){
        self.name = name
        self.age = age
    }
    
    deinit{
        print("Exit")
    }
}
var A: test? = test(name: "minwoo", age: 20)
A = nil

 


내용 참고, 출처

https://www.youtube.com/watch?v=E2Yy3gp9_Nk 

https://jusung.gitbook.io/the-swift-language-guide/language-guide/14-initialization#failable-initializers

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

값 타입과 참조 타입  (0) 2022.01.31
extensions  (0) 2022.01.30
guard  (0) 2022.01.28
assert  (0) 2022.01.28
타입캐스팅  (0) 2022.01.26

댓글