클래스과 구조체는 코드를 조직화 하기 위해 사용한다. 이는 OOP를 위한 필수 요소이기도 하다.
subscript
문법을 이용해 특정 값을 접근할 수 있는 subscript
정의initializer
정의// 클래스나 구조체의 선언은 메소드나 프로퍼티와 달리 대문자로 시작한다.
class VideoMode {
// class content
var resolution = Resolution() // 아래 구조체를 값으로 사용
var interalced = false
var frame = 0.0
var name: String?
}
struct Resolution {
// struct content
var width = 0
var height = 0
}
빈 괄호를 적으면 각각의 인스턴스를 생성
let someResolution = Resolution() // 구조체 인스턴스
let someVideoMode = VideoMode() // 클래스 인스턴스
dot(점) 을 통해 인스턴스의 프로퍼티에 접근 할 수 있다.
print("The width is \(someVideoMode.resolution.width)")
모든 구조체는 초기화시에 initializer를 자동으로 생성해 제공한다.
let vga = Resolution(width: 640, height: 480)
Struct와 enum은 값 타입(Value Type)으로 상수나 변수에 전달될 때 그 값이 복사되서 전달된다.
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
이 코드에서 hd
와 cinema
는 완전히 다른 인스턴스이다.
cinema.width = 2048
print("cinema : \(cinema.width), hd: \(hd.width)")
// cinema : 2048, hd: 1920
enum 또한 마찬가지이다.
enum CompassPoint {
case north, south, east, west
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection = .east
if rememberedDirection == .west {
print("The remembered direction is still .west")
}
// "The remembered direction is still .west" 출력
클래스 는 값 타입과 달리 변수나 상수에 값을 할당하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조된다.
참조된다란 그 값을 갖는 메모리를 바라보고 있다는 뜻이다.
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("frameRate of tenEighty is now \(tenEighty.frameRate)")
클래스는 참조 타입이기 때문에 같은 인스턴스를 참조하고 있는지를 비교하기 위해 다음과 같은 식별자를 사용한다.
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// "tenEighty and alsoTenEighty refer to the same VideoMode instance." 출력
C, C++, Obj-C는 포인터가 실제 메로리를 가르키고 키워드로 표시하지만, Swift는 참조를 가르키기위해 사용하지 않고 변수나 상수처럼 정의해서 사용.
다음 조건 중 1개 이상을 만족하면 구조체 사용을 고려해 볼 수 있다.
Swift에서는 String
, Array
, Dictionary
같은 기본 데이터 타입이 Struct
로 구현 돼 있다. 따라서 이 값을 할당하거나 메소드에 인자로 넘길 때는 값이 복사(Copy-on-Write)된다.
CoW 관련 짤막한 정리글
반면 Foundation
의 NSString
, NSArray
등은 클래스로 구현 돼 있습니다. 따라서 이 값들은 참조가 사용됩니다.