변수와 함수의 묶음.
클래스는 참조 타입이고, 구조체는 값 타입이다. 원본이 변경되었을때 원본을 참조하고 있던 클래스는 전부 변경되지만, 값 타입인 구조체는 상관없다.
그외 기능적인 측면에서, 클래스는 가능하지만 구조체에선 안되는 것들이 있다. 애플은 기본적으로 구조체를 사용하되, 클래스에서만 가능한 일이 필요할때만 클래스를 이용하는걸 권장한다.
클래스에서만 가능한 기능은 다음과 같다.
기능적인 부분은 다르지만 클래스와 구조체의 선언문법은 같다. 클래스는 class 키워드를, 구조체는 struct 키워드를 사용한다.
struct Resolution {
var width: Int = 0
var height: Int = 0
}
class VideoMode {
var resolution = Resolution() // 위 Resolution 구조체를 값으로 사용
var interlaced: Bool = false
var frameRate: Float = 0.0
var name: String?
}
let someResolution = Resolution() // 구조체 인스턴스 생성
let someVideoMode = VideoMode() // 클래스 인스턴스 생성
이때 클래스나 구조체를 선언하는 것은 swift 내에서 완전 새로운 타입을 선언하는 것이다. 그래서 UpperCamelCase를 이용해 선언한다. 프로퍼티나 메소드는 lowerCamelCase를 이용한다.
점(.) 문법을 이용해 클래스/구조체 인스턴스의 프로퍼티에 접근할 수 있다. 하위레벨 프로퍼티도 접근할 수 있다.
print("The width of someResolution is \(someResolution.width)")
// "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)")
// "The width of someVideoMode is now 1280" 이 출력
위 코드처럼 resolution 전체의 값을 설정하지 않고 width 프로퍼티만 설정할 수 있다.
모든 구조체는 초기화시 프로퍼티를 선언할 수 있는 이니셜라이저(initializer)를 자동으로 생성해 제공한다. 구조체 안에 width와 height 프로퍼티만 정의했다면 다음 코드와 같이 초기화해서 사용할 수 있다.
let vga = Resolution(width: 640, height: 640)
클래스는 참조타입이기 때문에 여러 상수와 변수에서 같은 인스턴스를 참조할 수 있다. 상수와 변수가 같은 인스턴스를 참조하고 있는지 비교하기 위해 식별 연산자를 사용한다.
=== : 두 상수나 변수가 같은 인스턴스를 참조하고 있는 경우 true
!== : 두 상수나 변수가 다른 인스턴스를 참조하고 있는 경우 true
식별 연산자(===)는 참조를 비교하는 것이고, 비교 연산자(==)는 값을 비교한다는 차이가 있다.
The Swift Language Guide