Deinitializer
는 클래스의 인스턴스가 할당된 리소스를 해제할 수 있도록 한다./* Resolution과 VideoMode의 모양만 설명하는 것.
특정한 실체를 만들려면 구조체나 클래스의 인스턴스를 만들어야 한다. */
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
// 클래스 초기화
VideoMode
클래스에는 4개의 가변 저장 프로퍼티가 있다.var resolution = Resolution()
은 구조체 Resolution
의 프로퍼티 타입을 유추하는 새로운 Resolution
구조 인스턴스로 초기화 된다.name
은 옵셔널 타입이기 때문에 기본값으로 nil 또는 "이름 값 없음"이 자동으로 지정된다.// 인스턴스 만드는 방법
let someResolution = Resolution()
let someVideoMode = VideoMode()
print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 0"
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"
// 이렇게도 써볼 수 있음
someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"
// 프로퍼티에 새로운 값 할당해서도 사용 가능
someResolution.width
와 같은 방법으로 접근할 수 있다.someResolution.width
는 someResolution
의 너비 프로퍼티를 참조하고 기본 초기 값인 0을 반환한다.let vga = Resolution(width: 640, height: 480)
값 타입
이다.let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
// 이렇게 cinema의 넓이 값을 변경 가능
print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"
// cinema의 넓이 값이 실제로 바뀌었지만,
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"
// hd의 넓이는 변하지 않고 그대로!
Resolution
은 구조체이기 때문에 기존 인스턴스의 복사본이 만들어지고 이 새 복사본이 cinema
에 할당 된다. hd
와 cinema
의 너비와 높이가 동일하지만 완전히 다른 두 인스턴스이다.참조 타입
이다.class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
tenEighty
와 alsoTenEighty
가 멀리 떨어져 있으면 비디오 모드가 변경되는 모든 방법을 찾기 어려울 수 있다. 또한, tenEighty
를 사용할 때마다 alsoTenEighty
를 사용하는 코드에 대해서도 생각해야 하고 그 반대의 경우도 마찬가지이다. 이와 반대로, 값 타입은 동일한 값과 상호작용하는 모든 코드가 소스파일에서 가까이 있기 때문에 추론하기가 더 쉽다.tenEighty
및 alsoTenEighty
는 상수로 선언되어 있지만 상수 자체의 값은 실제로 변경되지 않기 때문에 여전히 tenEighty.frameRate
및 alsoTenEighty.frameRate
를 변경할 수 있다. tenEighty
및 alsoTenEighty
자체는 VideoMode
인스턴스를 "저장"하지 않는다. 대신 둘 다 뒤에서 VideoMode
인스턴스를 참조한다. 변경된 것은 해당 VideoMode
에 대한 상수 참조 값이 아니라 기본 VideoMode
의 frameRate
속성이다.class Coffee {
var size: String
var brand: String
deinit {
print("Coffee 클래스의 ㅇ니스턴스가 소멸됩니다.")
}
}
var americano: Coffee? = Coffee()
americano = nil
동일함 === / 동일하지 않음 !==
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
이런 몇 가지 상황을 제외하면 클래스로 정의하여 사용한다. 대다수 사용자정의 데이터 타입은 클래스로 구현할 일이 더 많을 수 있다.
Structures and Classes - The Swift Programming Language (Swift 5.5)