Swift - Initialization(클래스 초기화)

이원석·2024년 11월 26일

Swift

목록 보기
18/38

Initialization

초기화 시점에 모든 프로퍼티들은 기본 값을 가지고 있어야한다. 만약 기본 값이 없는 프로퍼티가 있을 경우, 초기화에 실패하여 인스턴스가 생성되지 않는다.

클래스 초기화

선언과 동시에 프로퍼티에 기본값 넣어주기

class Human {
	let name: String = "abc"
    let age: Int = 123
}

프로퍼티 타입을 옵셔널 타입의 변수로 설정하기

class Human {
	var name: String?
    var age: Int?
}

init함수에서 값을 설정해주기

하나의 프로퍼티라도 기본 값을 지니지 않거나, 옵셔널 타입의 변수가 아니라면 init함수를 통해 나머지 프로퍼티도 초기화를 진행 해줘야 함

class Human {
	var name: String?
    let kickName: String = "abc"
    let age: Int
    
    init(name: String){
    	self.age = 28
    }
}

지정 생성자(Designated Initializers)

클래스의 모든 프로퍼티를 초기화 하는 생성자

class Human {
	let name: String
    let age: Int
    
    init(name: String) {
    	self.name = name
        self.age = 28
    }
}
  • 해당 생성자 메서드가 종료되기 전까지, 생성자 안에 모든 프로퍼티는 "초기값"을 지니고 있어야 한다. -> 옵셔널 변수로 선언 되지 않았거나, 기본 값을 갖지 않는 프로퍼티가 있을 경우엔 생성자를 추가하여 초기값을 지정 해줘야 함
  • 반드시 super 클래스의 생성자를 호출해야 한다
class Human {
    let name: String
    
    init(name: String) {
        self.name = name
    }
}
 
class People: Human {
    let alias: String
    
    init(alias: String) {     // 에러.          
        self.alias = alias
    }
}

class People: Human {
    let alias: String
    
    init(alias: String) {       
        self.alias = alias
        super.init(name: alias) // super 클래스 생성자 호출
    }
}

편의 생성자(Convenience Initializers)

모든 프로퍼티를 초기화 할 필요없는 생성자로, 반드시 다른 초기화를 호출시켜야 한다.
이때 슈퍼 클래스의 생성자는 호출 시킬 순 없고, 같은 클래스 내에 있는 Convenience Initializers나 Designated Initializers를 호출 시켜야 한다.
최종적으론 같은 클래스 내의 Designated Initializers가 호출 되어야 한다.

class Person {
	var name: String
    var nickName: String
    
    init(name: String, nickName: String) {
    	self.name = name
        self.nickName = nickName
    }
    
    convenience init(name:String){//init(name: String, nickName: String) 호출
    	self.init(name: name, nickName: "unknown")
    }
    
    convenience init(){//convenience init(name:String) 호출
    	self.init(name: "unknow")
    }
}
  • 반드시 같은 클래스(슈퍼클래스 x)에 있는 다른 초기화를 또 호출 시켜야한다.
  • 최종적으로는, 같은 클래스 내에 있는 Designated Initializers(지정 생성자)를 호출 시켜야한다.

정리

  • Designated Initializers
    init 함수가 끝나기 전엔 모든 프로퍼티의 값이 초기화 되어야 함
    모든 프로퍼티가 기본 값을 갖거나 옵셔널 타입의 변수로 선언된 경우엔 작성하지 않아도 됨
  • Convenience Initializers
    Designated Initializers를 보조. Designated Initializers의 파라미터 중 일부를 기본 값으로 설정해서 호출할 수 있음.
    Convenience Initializers는 반드시 다른 초기화 메서드를 호출 시켜줘야함
    같은 클래스 내의 Convenience, Designated 상관 없이 초기화 메서드를 호출 시켜주면 되지만 최종적으로는 Designated Initializers가 호출 되어야 함

참고
개발자 소들

0개의 댓글