
🍎 Swift의 구조체, 클래스, 열거형
- Swift에서는 데이터 모델을 정의하는 데 구조체(Struct), 클래스(Class), 열거형(Enum)이라는 세 가지 주요 타입을 제공합니다. 이들은 각각 고유한 특성과 사용 용도를 가지고 있습니다.
💡 클래스 (Class)
- 전통적인 객체지향 프로그래밍(OOP) 관점에서의 클래스
- 단일 상속: 클래스는 다른 클래스에서 상속받을 수 있습니다.
- (인스턴스/타입) 메서드
- (인스턴스/타입) 프로퍼티
- 참조 타입: 클래스의 인스턴스는 참조 타입으로, 인스턴스가 다른 변수에 할당될 때 참조가 복사됩니다.
- Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성
🍏 구조체 (Struct)
- C 언어 등의 구조체보다 다양한 기능을 제공
- 상속 불가: 구조체는 다른 구조체로부터 상속받을 수 없습니다.
- (인스턴스/타입) 메서드
- (인스턴스/타입) 프로퍼티
- 값 타입: 구조체의 인스턴스는 값을 복사하여 전달합니다.
- Swift의 많은 부분은 구조체를 기반으로 구성되어 있습니다.
🍏 열거형 (Enum)
- 다른 언어의 열거형과는 많이 다른 존재
- 상속 불가: 열거형은 다른 열거형으로부터 상속받을 수 없습니다.
- (인스턴스/타입) 메서드
- (인스턴스/타입) 연산 프로퍼티
- 값 타입
- Enumeration
- 유의미한 값: 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의
예: 요일, 상태값, 월(Month) 등
- 열거형 자체가 하나의 데이터 타입
열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급
- 선언 키워드 enum

📍 구조체는 언제 사용하나?
- 연관된 몇몇의 값들을 모아서 하나의 데이터타입으로 표현하고 싶을 때
- 다른 객체 또는 함수 등으로 전달될 때
참조가 아닌 복사를 원할 때
- 자신을 상속할 필요가 없거나,
자신이 다른 타입을 상속받을 필요가 없을 때
- Apple 프레임워크에서 프로그래밍을 할 때에는 주로 클래스를 많이 사용
Value(값) vs Reference(참조)
클래스와 구조체/열거형 비교 예제
import Swift
struct ValueType {
var property = 1
}
class ReferenceType {
var property = 1
}
let firstStructInstance = ValueType()
var secondStructInstance = firstStructInstance
secondStructInstance.property = 2
print("first struct instance property: \(firstStructInstance.property)")
print("second struct instance property: \(secondStructInstance.property)")
let firstClassReference = ReferenceType()
var secondClassReference = firstClassReference
secondClassReference.property = 2
print("first class reference property: \(firstClassReference.property)")
print("second class reference property: \(secondClassReference.property)")
구조체 예시 문제
struct SomeStruct {
var someProperty: String = "Property"
}
var someStructInstance: SomeStruct = SomeStruct()
func someFunction(structInstance: SomeStruct) {
var localVar: SomeStruct = structInstance
localVar.someProperty = "ABC"
}
someFunction(someStructInstance)
print(someStructInstance.someProperty)
클래스 예시 문제
class SomeClass {
var someProperty: String = "Property"
}
var someClassInstance: SomeClass = SomeClass()
func someFunction(classInstance: SomeClass) {
var localVar: SomeClass = classInstance
localVar.someProperty = "ABC"
}
someFunction(someClassInstance)
print(someClassInstance.someProperty)