class와 struct는 모두 데이터 모델링을 위한 타입(Type)이며,
데이터의 속성(property)과 메서드(method)를 가질 수 있습니다.
그러나 class는 참조 타입(Reference Type)이고, struct는 값 타입(Value Type)입니다.
값 타입과 참조 타입의 차이점이 궁금하시면... 아래 글을 읽어주세요!
이 둘의 공통점과 차이점이 무엇인지 알아봅시다!!
공통점
속성과 메서드
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func introduce() -> String {
return "Hi, my name is \(name) and I'm \(age) years old."
}
}
struct Point {
var x: Int
var y: Int
func printPoint() {
print("(\(x), \(y))")
}
}
Class와 Struct 모두 속성과 메서드를 가질 수 있습니다.
이들은 타입 내에 정의되며, 인스턴스를 생성할 때 사용됩니다.
초기화
let person = Person(name: "Alice", age: 25)
let point = Point(x: 10, y: 20)
Class와 Struct 모두 초기화할 때 사용하는 생성자를 가집니다.
생성자는 인스턴스를 초기화할 때 사용되며, 타입 내에 초기화 로직을 정의합니다.
프로토콜 적용
protocol Printable {
func printInfo()
}
class Car: Printable {
func printInfo() {
print("This is a car.")
}
}
struct Animal: Printable {
func printInfo() {
print("This is an animal.")
}
}
Class와 Struct 모두 프로토콜을 채택할 수 있습니다!
차이점
Class와 Struct의 가장 큰 차이점은 값 타입(Value Type)과 참조 타입(Reference Type)으로 분류된다는 것입니다.
Class는 참조 타입이며, Struct는 값 타입입니다.
Class
Class는 참조 타입으로, Heap 메모리 영역에 인스턴스가 생성되며,
변수나 상수에는 해당 인스턴스를 참조하는 포인터가 할당됩니다.
따라서 인스턴스를 복사하거나 할당하면,
원본 인스턴스를 참조하는 포인터만 복사되기 때문에 같은 인스턴스를 참조하게 됩니다!
Struct
Struct는 값 타입으로, Stack 메모리 영역에 인스턴스가 생성되며,
변수나 상수에는 해당 인스턴스가 직접 저장됩니다.
따라서 인스턴스를 복사하거나 할당하면,
새로운 인스턴스가 생성되어 원본 인스턴스와는 다른 값이 저장됩니다.
class Car {
var brand: String
init(brand: String) {
self.brand = brand
}
}
struct Point {
var x: Int
var y: Int
}
var car1 = Car(brand: "BMW")
var car2 = car1
car2.brand = "Tesla"
print(car1.brand) // "Tesla"
print(car2.brand) // "Tesla"
var point1 = Point(x: 0, y: 0)
var point2 = point1
point2.x = 1
print(point1.x) // 0
print(point2.x) // 1
예제를 보시면!
Car는 Class이기 때문에 참조 타입으로 동작합니다.
따라서 car1과 car2가 같은 인스턴스를 참조하고 있기 때문에,
car2의 brand를 바꾸면 car1의 brand도 같이 바뀝니다. (원본 데이터에 영향 o)
반면 Point는 Struct이기 때문에 값 타입으로 동작합니다.
따라서 point1과 point2는 서로 다른 인스턴스를 가리키므로,
point2.x를 바꾸더라도 point1.x는 변하지 않는 것 입니다! (원본 데이터에 영향 x)
아래 내용처럼 무조건 이럴 때 써야 한다!는 아니지만 언제 사용하면 좋은지 도움을 줄 수 있을 것 같아요!
Class
- 상속이 필요한 경우
- 참조 타입이 필요한 경우
- 클래스의 인스턴스가 전역 상태를 공유해야 하는 경우
- 클래스의 인스턴스가 Objective-C와 상호작용해야 하는 경우
Struct
- 값 타입이 필요한 경우
- 구조체의 인스턴스가 복사되어 전달되어야 하는 경우
- 구조체의 인스턴스가 상속을 필요로 하지 않는 경우
- 작은 크기의 데이터를 저장하는 경우
코딩을 하다 보면 의도하지 않은 결과를 마주할 때가 있는데...
이럴 때 class와 struct를 상황에 맞게 사용하고 있는지 확인하면 도움이 될 것 같아요!