공통점
subscript
제공init
제공extension
사용 가능protocol
채택클래스만 가능한 기능
Inheritance
클래스의 여러 속성을 하위 클래스에 제공함
Type Casting
런타임에 클래스 인스턴스의 타입 확인 및 해석 가능
Deinitialize
클래스의 인스턴스가 할당된 리소스 해제
Reference counting
클래스의 인스턴스에 하나 이상의 참조가 가능
(구조체는 참조 카운트를 하지 않음)
값 타입: 변수, 상수에 할당되거나 함수에 전달될 때 값이 복사되서 전달되는 타입
값 타입은 Stack영역에 할당된다.
struct Rectangle {
var width = 0
var height = 0
}
let square = Rectangle(width: 200, height: 200)
var anotherSquare = square
anotherSquare.width *= 2
anotherSquare.height *= 2
print(square)
// Rectangle(width: 200, height: 200)
print(anotherSquare)
// Rectangle(width: 400, height: 400)
anotherSquare
을 변경해도 square
에는 아무런 변화가 없다.
-> 둘은 완벽히 다른 인스턴스이다.
참조 타입: 변수, 상수에 할당되거나 함수에 전달될 때 해당 인스턴스의 주소가 전달되는 타입
참조 타입은 Heap영역에 할당된다.
class Rectangle {
var width = 0
var height = 0
init(width: Int, height: Int) {
self.width = width
self.height = height
}
}
let square = Rectangle(width: 200, height: 200)
var anotherSquare = square
anotherSquare.width *= 2
anotherSquare.height *= 2
print("width: \(square.width), height: \(square.height)")
// width: 400, height: 400
print("width: \(anotherSquare.width), height: \(anotherSquare.height)")
// width: 400, height: 400
anotherSquare
만 변경했지만 square
의 값이 바뀌었다.
-> anotherSquare
이 참조하는 주소에 있는 값을 변경했기 때문에, 같은 주소를 참조하는 square
의 값도 바뀜
===
, !==
연산자로 상수 혹은 변수가 같은 인스턴스를 참조하고 있는지 확인 가능if anotherSquare === square {
print("same instance")
} else {
print("another instance")
}
// same instance
다음 조건 중 1개 이상을 만족하면 구조체 사용을 고려해 본다.
String, Array, Dictionary
String
, Array
, Dictionary
는 모두 struct
로 구현되어 있다.
이는 값 타입이므로 변수나 상수에 할당할 때 값이 복사됨
반대로 NSString
, NSArray
, NSDictionary
는 class
로 구현되어 있다.
이는 참조 타입이므로 변수나 상수에 할당할 때 참조가 사용됨