8.6.1 init 초기화 메서드
초기화 메서드의 형식을 알아봅시다
init(<매개변수> : <타입>, <매개변수> : <타입>, ...) {
1. 매개변수의 초기화
2. 인스턴스 생성 시 기타 처리할 내용
}
위 구문의 특징을 정리하면 다음과 같습니다
1. 초기화 메서드의 이름은 init으로 통일된다
만일 다른 이름이 사용되거나 대소문자가 바뀌면 초기화 메서드로 인지하지 못합니다
2. 매개변수의 개수, 이름, 타입은 임의로 정의할 수 있다
단 메서드에 정의된 매개변수의 순서와 형식에 따라 인스턴스 생성 과정에서 넣어야 하는 인자값의 순서와 형식이 결정됩니다.
3. 매개변수의 이름과 개수, 타입이 서로 다른 여러 개의 초기화 메서드를 정의할 수 있다
오버로딩된 메서드는 스위프트에서 서로 다른 메서드로 간주되기 때문에, 이같은 특성을 이용하면 다양한 형식을 갖는 초기화 메서드를 정의할 수 있습니다.
4. 정의된 초기화 메서드는 직접 호출되기도 하지만, 대부분 인스턴스 생성 시 간접적으로 호출된다
초기화 구문이 여러 개 정의되어 있을 경우 인스턴스 생성 구문과 매개변수 형식이 일치하는 초기화 메서드가 호출됩니다. 만약 인스턴스 생성 구문의 형식과 일치하는 초기화 메서드가 정의되지 않았다면 오류가 발생합니다.
예제를 보겠습니다
struct Resolution {
var width = 0
var height = 0
init(width: Int) {
self.width = width
}
}
class VideoMode {
var resolution = Resolution(width: 4096)
var interlaced = false
var frameRate = 0.0
var name: String?
// 초기화될 때 name 인자값만 받는 init 구문
init(name: String) {
self.name = name
}
// 초기화될 때 interlaced 인자값만 받는 init 구문
init(interlaced: Bool) {
self.interlaced = interlaced
}
// 초기화될 때 interlace, frameRate 두 개의 인자값을 받는 init 구문
init(interlaced: Bool, frameRate: Double) {
self.interlaced = interlaced
self.frameRate = frameRate
}
// 초기화될 때 interlace, frameRate, name 세 개의 인자값을 받는 init 구문
init(interlaced: Bool, frameRate: Double, name: String) {
self.interlaced = interlaced
self.frameRate = frameRate
self.name = name
}
}
let nameVideoMode = VideoMode(name: "홍길동")
let simpleVideoMode = VideoMode(interlaced: true)
let doubleVideoMode = VideoMode(interlaced: true, frameRate: 40.0)
let tripVideoMode = VideoMode(interlaced: true, frameRate: 40.0, name: "홍길동")
let defaultVideoMode = VideoMode() // Error!
위와 같이 초기화할 수 있습니다. 주의할 것은 init 메서드가 작성되고 나면 기본 초기화 구문은 더는 제공되지 않습니다. 기본 초기화 구문을 사용하면 에러가 발생합니다. 만약 기본 초기화 구문을 사요하고 싶다면 기본 초기화 구문을 추가해야 합니다.
class VideoMode {
...중략...
// 기본 초기화 구문
init() {
}
}
우리는 '기본 초기화 구문 + 이름을 받는 초기화 구문' 두 개의 기능을 하는 초기화 구문을 만들 수 있습니다.
class VideoMode {
...중략...
init(name: String = "") {
self.name = name
}
}
let defaultVideoMode = VideoMode() (O)
let nameVideoMode = VideoMode(name: "홍길동") (O)
Last updated