본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.
객체가 메모리에 올라가 할당 되어 있는 상태를 인스턴스라고 할 수 있는데, 인스턴스의 생성을 위해 저장 프로퍼티의 값을 초기화 하는 과정이 이루어진다. 이러한 저장 프로퍼티의 초기화를 구현하기 위한 메서드를 이니셜라이저
라고 한다.
이니셜라이저
는 메서드 이지만 func 키워드를 사용하지 않고 init
라는 키워드를 사용하여 선언하며, 반환값도 존재하지 않는다.
다음은 이니셜라이저
를 사용하여 저장 프로퍼티의 값을 초기화해 주는 과정이다.
struct Circle {
var radius: Double
init(_ radius: Double) { //이니셜라이저로 프로퍼티 초기화
self.radius = radius
}
func area() -> Double { //원의 넓이 구하는 메서드
return radius * radius * 3.14
}
}
let myCircle: Circle = Circle(5) //반지름 길이 5인 인스턴스 생성
print(myCircle.area())
인스턴스를 생성 할때, 옵셔널 타입을 제외한 모든 저장 프로퍼티에는 기본값을 할당 하거나 이니셜라이저를 통해 초기화하여 값을 반드시 지정해 주어야 한다.
스위프트에서는 옵셔널 타입이 존재하여 만약 값을 지정해 주기 어려운 경우 프로퍼티를 옵셔널 타입
으로 지정해 주면 자동으로 nil
값으로 할당 가능하다.
class Student {
let studentName: String //상수 프로퍼티
var studentID: Int? //옵셔널 프로퍼티
init(studentName: String) {
self.studentName = studentName
}
}
let studentLee: Student = Student(studentName: "이철수")
studentLee.studentID = 12345 //옵셔널 프로퍼티 값 할당
print(studentLee.studentName)
print(studentLee.studentID)
위와 같이 studentID의 값을 모를 경우 옵셔널 프로퍼티 타입으로 선언하여 nil 값을 할당해 주었고, 추후에 studentID에 대한 정보를 알게 되었을때 다시 값을 할당 해주는 코드를 구현하였다.
구조체에서는 사용자 정의 이니셜라이저를 생성하지 않으면 프로퍼티 이름을 매개변수로 가지는 멤버와이즈 이니셜라이저
를 제공한다.
struct Point {
var x: Int = 1
var y: Int = 1
}
let point1: Point = Point()
let point2: Point = Point(x: 10, y: 20)
let point3: Point = Point(y: 15) //기본값이 있을 경우 필요한 프로퍼티만 초기화 가능
위의 코드와 같이 매개변수 이름이 프로퍼티 이름과 일치하는 것을 볼 수 있다.
또한 멤버와이즈 이니셜라이저
는 구조체만이 구현 가능하기 때문에 클래스에서는 멤버 와이즈 이니셜라이저
를 사용 할 수 없다.
인스턴스 생성시 이니셜라이저로 원하지 않는 전달 인자가 들어 올 수 있다. 이렇게 원하지 않는 전달인자를 전달 받았을 때 초기화를 하지 않는 이니셜라이저를 실패 가능한 이니셜라이저
라고 한다. 실패 가능한 이니셜라이저
는 초기화 실패시 nil
값을 반환하므로 init?
키워드를 사용한다.
enum Customer {
case Silver, Gold, VIP
init?(point: Int) {
switch point {
case 1...49:
self = .Silver
case 50...79:
self = .Gold
case 80...100:
self = .VIP
default:
return nil
}
}
init?(currentPoint: Int, earnPoint: Int) { //초기화 위임
self.init(point: currentPoint + earnPoint)
}
}
var customerLee: Customer? = Customer(point: 77)
print(customerLee)
var customerKim: Customer? = Customer(currentPoint: 75, earnPoint: 6)
print(customerKim)
var customerSon: Customer? = Customer(point: -100)
print(customerSon)
위의 코드는 이니셜라이저로 point 점수를 전달 인자로 받아 point 점수에 해당하는 case를 돌려주는 프로그램이다. 이때 이니셜라이저로 원하지 않는 값이 전달 될 경우 nil
을 반환하도록 하였다.
위의 코드에서 사용자 정의 이니셜라이저가 두개 존재 하는데 두번째 위치한 이니셜라이저는 현재 point와 획득한 point 값을 더하여 첫 번째 이니셜라이저로 point 값을 전달해 주어 초기화를 위임
하는 이니셜라이저이다.
스위프트는 인스턴스가 더 이상 필요하지 않으면 메모리에서 해제한다. 만약 인스턴스가 해제되는 시점에 수행해야 할 동작이 있다면 디이니셜라이저
를 사용하여 구현 할 수 있다.
디이니셜라이저
는 deinit
키워드를 사용하여 선언히며, 매개변수를 가지지 않고 호출하지 않아도 메모리에서 해제되는 시점에 자동으로 실행된다.
class TestClass {
deinit {
print("인스턴스가 메모리에서 해제 됩니다.")
}
}
var testInstance: TestClass? = TestClass()
testInstance = nil
위의 코드와 같이 testInstance에 nil을 대입하면 testInstance는 더 이상 필요하지 않게 되고 메모리에서 해제 되면서 deinit
가 실행된다.