스위프트는 구조체와 클래스를 외부에서 선언하지 않아도 인터페이스가 자동으로 지원된다. 인터페이스를 통해 사용자는 코드를 통해 구조체와 클래스 등 내부에서 정의한 프로퍼티와 메소드, 변수나 상수 등에 접근할 수 있다.
구조체와 클래스는 다음과 같은 공통점이 있다.
클래스만의 특징은 다음과 같다.
스위프트 가이드라인에 따르면 구조체 사용이 더 필요하기 때문에, 필수적인 이유가 아니라면 클래스보다 구조체를 선언해 사용하기를 권하고 있다.
구조체와 클래스를 정의하는 코드는 비슷하다. struct
와 class
라는 키워드를 사용하면 된다.
struct SomeStructure {
// structure definition goes here
}
class SomeClass {
// class definition goes here
}
둘 중 어떤 타입을 정의하든, 사용자는 새로운
스위프트 타입을 정의하는 셈이다. 이때 기본적인 구조체명 또는 클래스명을 짓는 방법은 UpperCamalCase
로 단어 구분 시 공백 없이 대문자를 사용하는 것이다. 프로퍼티나 메소드명을 지을 때에는 이와 반대로 lowerCamalCase
로 처음은 소문자로, 단어가 붙을 때에는 대문자로 시작한 단어를 사용하면 된다.
struct Resolution {
var width = 0
var height = 0
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
resolution
이 Resolution()
값을 할당받고 있는데, 이처럼 클래스 내 선언된 변수 데이터 타입이 구조체일 수도 있다.
위 구조체나 클래스를 사용하려면 인스턴스를 만들어야 한다.
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"
값을 조회하거나 수정 모두 쉽다.
memberwise initializer
는 스위프트가 구조체를 정의할 때 자동으로 만들어놓은 초기화 방법이다. 이를 통해 새로운 구조체 인스턴스의 멤버 프로퍼티를 초기화할 수 있다. 즉 구조체 인스턴스를 선언할 때 괄호 안에 멤버별로 정의하려는 값을 설정할 수 있다는 말이다.
let vga = Resolution(width: 640, height: 480)
클래스는 멤버와이즈 이니셜라이저를 허용하지 않는다.