
Swift에서 Struct와 Class는 둘 다 프로퍼티와 메소드를 정의하며 값을 저장할 수 있는 객체 생성 메커니즘을 제공한다. 이 두가지는 비슷해 보이지만 아주 큰 차이점이 있다.
바로 복사되거나 메소드에 전달될 때 값이 상속되느냐 안되느냐의 차이.
코드로 확인해보자.
struct SampleStruct{
var name: String
init(name: String) {
self.name = name
}
}
class SampleStruct{
var name: String
init(name: String) {
self.name = name
}
}
let myStruct = SampleStruct(name:"Mark")
let myClass = SampleClass(name:"Mark")
위에서 보다시피, 구조 선언문과 인스턴스 생성구문이 똑같다.
그렇다면 class와 struct의 가장 근본적인 차이는 무엇이냐: class는 참조타입(reference type)이고 struct는 값 타입(value type)라는 것.
struct가 복사되거나 메소드에 전달되면, 이 struct들은 원본의 struct와 각각 다른 개체로 인식된다. 즉, 복사된 struct는 각각의 값으로 존재하여 하나의 데이터가 변경되어도 기존 struct나 다른 복사본의 데이터에는 아무런 변화가 없다.
이와 다르게, 복사된 class의 데이터가 변경되면 기존의 class와 다른 복사본들에서 이를 참조하여 동일한 작업이 수행된다. 즉, 단 하나의 class 인스턴스가 존재하고, 이를 가리키는 여러 개의 참조체가 존재하는 것.
실제 예시로 확인해보자.
struct SampleStruct {
var name: String
init(name: String){
self.name = name
}
}
let myStruct1 = SampleStruct(name: "Palrang")
print(myStruct1.name)
// => Palrang
var myStruct2 = myStruct1
myStruct2.name = "SH" //값을 직접 변경
print(myStruct1.name) // => Palrang
print(myStruct2.name) // => SH
class SampleClass {
var name: String
init(name: String){
self.name = name
}
}
let myClass1 = SampleClass(name: "Palrang")
print(myClass1.name)
// => Palrang
var myClass2 = myClass1
myClass.name = "SH" //값을 직접 변경
print(myClass1.name) // => SH
print(myClass2.name) // => SH
공통점
선언 구문 형식은 동일하다.
프로퍼티/메소드를 선언하고 값을 저장하는 등 객체생성 메커니즘을 제공한다.
둘 다 override나 extension을 사용해 확장될 수 있다.
프로토콜을 채택하거나 초기화 구문을 가질 수 있다.
사용의 구분
일반적으로 struct가 class에 비해 효율적이고 안정적이기 때문에 struct를 사용하기를 권장한다.
상속이 필요하거나 데이터가 캡슐화된 하나의 인스턴스가 필요할 때는 class를 사용한다.
소멸자가 사용될 때 리소스를 확보하기 위해서도 class를 사용할 수 있다.
📚 참고도서
[SwiftUI 기반의 iOS 프로그래밍]