✅⠀구조체란?
- 스위프트 대부분 타입은 구조체로 이루어져 있습니다.
- 구조체는 값(value) 타입입니다.
- 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.
struct Sample {
var mutableProperty: Int = 100
let immutableProperty: Int = 100
static var typeProperty: Int = 100
func instanceMethod() {
print("instance method")
}
static func typeMethod() {
print("type method")
}
}
✅⠀클래스란?
- 클래스는 참조(reference) 타입입니다.
- 타입이름은 대문자 카멜케이스를 사용하여 정의합니다.
- Swift의 클래스는 다중 상속이 되지 않습니다.
class Sample {
var mutableProperty: Int = 100
let immutableProperty: Int = 100
static var typeProperty: Int = 100
func instanceMethod() {
print("instance method")
}
static func typeMethod() {
print("type method - static")
}
class func classMethod() {
print("type method - class")
}
}
✅⠀열거형이란?
- 유사한 종류의 여러 값을 한 곳에 모아서 정의한 것입니다. 예) 요일, 월, 계절 등
- enum 자체가 하나의 데이터 타입으로, 대문자 카멜케이스를 사용하여 이름을 정의합니다.
- 각 case는 소문자 카멜케이스로 정의합니다.
- 각 case는 그 자체가 고유의 값입니다.(각 case에 자동으로 정수값이 할당되지 않음)
- 각 case는 한 줄에 개별로도, 한 줄에 여러개도 정의할 수 있습니다.
enum Weekday {
case mon
case tue
case wed
case thu, fri, sat, sun
}
var day: Weekday = Weekday.mon
day = .tue
print(day)
switch day {
case .mon, .tue, .wed, .thu:
print("평일입니다")
case Weekday.fri:
print("불금 파티!!")
case .sat, .sun:
print("신나는 주말!!")
}
rawValue (원시값)
- C 언어의 enum 처럼 정수값을 가질 수 있습니다.
- rawValue는 case별로 각각 다른 값을 가져야합니다.
- 자동으로 1이 증가된 값이 할당됩니다.
- rawValue를 반드시 지닐 필요가 없다면 굳이 만들지 않아도 됩니다.
- 정수 타입 뿐만 아니라, Hashable 프로토콜을 따르는 모든 타입을 원시값의 타입으로 지정 할 수있습니다.
원시값을 통한 초기화
- rawValue를 통해 초기화 할 수 있습니다.
- rawValue가 case에 해당하지 않을 수 있으므로, rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입입니다.
메서드
- Swift 열거형에는 메서드도 추가할 수 있습니다.
✅⠀클래스 vs 구조체/열거형
- 클래스는 참조타입, 열거형과 구조체는 값 타입이라는 것이 가장 큰 차이
- 클래스는 상속이 가능하지만, 열거형과 구조체는 상속이 불가능 하다.
값 타입과 참조 타입
- 값 타입(Value Type) : 데이터를 전달 할 때 값을 복사하여 전달한다.
- 참조 타입(Reference Type) : 데이터를 전달 할 때 값의 메모리 위치를 전달합니다.
값 타입을 사용하는 경우
- 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶은 경우
- 다른 객체 또는 함수 등으로 전달될 때 참조가 아니라 복사(값 복사) 할 경우
- 자신을 상속할 필요가 없거나, 다른 타입을 상속 받을 필요가 없는 경우