Swift에서 데이터를 표현하고 다루는 데 가장 기본이 되는 두 가지 유형은 구조체(Struct)와 클래스(Class)입니다.
이 둘은 매우 비슷한 문법을 갖지만, 중요한 차이점을 가지고 있으며 용도에 따라 선택적으로 사용해야 합니다.
Swift는 구조체 중심 언어(structure-oriented language)로 설계되었기 때문에, 클래스보다 구조체를 더 자주 사용하게 됩니다.
1. 구조체 정의와 사용
구조체는 struct
키워드를 사용하여 정의하며, 프로퍼티(속성)와 메서드(함수)를 포함할 수 있습니다.
struct User {
var name: String
var age: Int
func introduce() {
print("저는 \(name)이고, \(age)세입니다.")
}
}
let user1 = User(name: "지민", age: 28)
user1.introduce()
구조체는 기본적으로 값 타입(value type)으로 동작하며, 변수에 할당하거나 함수에 전달할 때 복사됩니다.
2. 클래스 정의와 사용
클래스는 class
키워드를 사용하여 정의하며, 구조체와 유사한 방식으로 프로퍼티와 메서드를 가질 수 있습니다.
그러나 클래스는 참조 타입(reference type)입니다.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func greet() {
print("안녕하세요, \(name)입니다.")
}
}
let person1 = Person(name: "민호", age: 35)
person1.greet()
클래스는 초기화를 위해 init()
메서드를 필수로 구현해야 하며, 인스턴스는 힙(heap) 메모리에 저장됩니다.
3. 값 타입과 참조 타입의 차이
이 두 타입의 가장 큰 차이는 할당 시 복사 여부입니다.
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 3, y: 5)
var p2 = p1
p2.x = 10
print(p1.x) // 3
print(p2.x) // 10
구조체는 복사되어 독립적인 두 개의 인스턴스를 갖게 됩니다.
class Location {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
var l1 = Location(x: 3, y: 5)
var l2 = l1
l2.x = 10
print(l1.x) // 10
print(l2.x) // 10
클래스는 참조를 공유하므로, 하나를 변경하면 다른 쪽에도 영향을 미칩니다.
4. 구조체와 클래스 선택 기준
Swift에서 구조체는 다음과 같은 경우에 적합합니다.
- 데이터의 값 복사가 필요할 때
- 상속이 필요하지 않을 때
- 비교적 작고 단순한 데이터 모델일 때
클래스는 다음과 같은 상황에서 사용합니다.
- 참조를 공유하거나 상속이 필요한 경우
- 상태를 추적하거나 동일 인스턴스를 여러 곳에서 조작할 필요가 있는 경우
5. 기타 기능 차이
항목 | 구조체(Struct) | 클래스(Class) |
---|---|---|
타입 | 값 타입 | 참조 타입 |
상속 | 불가능 | 가능 |
초기화 메서드 | 자동 제공 | 직접 구현 필요 |
ARC 적용 여부 | 적용되지 않음 | 적용됨 (메모리 관리) |
Copy 동작 | 복사됨 | 참조 공유 |
마무리
구조체와 클래스는 Swift에서 매우 중요한 타입이며, 용도와 동작 방식이 다릅니다. Swift는 성능과 안정성을 위해 기본적으로 구조체를 우선 사용하도록 권장합니다. 그러나 참조 공유, 상속 등 객체 지향적 특성이 필요한 경우에는 클래스를 선택하는 것이 올바릅니다.