Swift의 Object인 구조체와 클래스에 대해서 알아봤습니다. 구조체와 클래스 모두 관계가 있는 데이터를 묶어서 표현할 때 사용됩니다. 이것을 표현하면 프로퍼티와 메서드로 표현할 수 있습니다. 문법과 구조는 비슷하지만 사용되는 방식은 다른데요. 오늘은 두 가지를 비교해 봅시다.
구조체와 클래스 차이
Struct | Class |
Value Types | Reference Types |
Copy | Share |
Stack | Heap |
Fast | Slow |
해당 표는 Struct
와 class
의 차이점입니다. 하나씩 살펴 봅시다.
Value Types과 Reference Types
Swift에서는 구조체와 클래스는 할당되는 방식이 다릅니다. 구조체의 경우Value Type
값에 의한 복사가 이뤄집니다.
struct PersonStruct {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
var fullName: String {
return "\(firstName) \(lastName)"
}
}
var personStruct1 = PersonStruct(firstName: "MinMong", lastName: "Ji")
var personStruct2 = personStruct1
personStruct2.firstName = "JinMong"
personStruct2.lastName = "Park"
personStruct1.fullName
personStruct2.fullName
// 결과 : "MinMong Ji"
// 결과 : "JinMong Park"
간단한 구조체를 만들어서 구조체를 이해해 봅시다.PersonStruct
구조체가 있습니다. 이름을 표현할 수 있는 프로퍼티를 가지고 있고요. personStruct1
를 만들어둔 구조체로 인스턴스 하였습니다.
그리고 새로운 변수 personStruct2
에 할당을 해주었습니다. 이때에 구조체의 동작 방식은 기존 personStruct1
의 값들을 복사해서 할당을 해주게 됩니다. 그리고 각각의 인스턴스는 독립적입니다. 독립적이란 뜻은 서로 다른 메모리에 할당이 되어있는 뜻입니다. 따라서 personStruct2
의 값을 변경하게 되더라도 personStruct1
은 영향을 받지 않습니다.
클래스의 경우는 Reference Type
입니다. 참조에 방식인데요. C++의 레퍼런스 타입, 포인터를 생각하면 됩니다. 클래스의 경우 이미 생성된 인스턴스를 새로운 변수에 할당할 때에 새로운 변수는 기존에 이미 생성된 인스턴스를 가리키게 됩니다.
class PersonClass {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
var fullName: String {
return "\(firstName) \(lastName)"
}
}
var personClass1 = PersonClass(firstName: "MinMong", lastName: "Ji")
var personClass2 = PersonClass1
personClass1.firstName = "JinMong"
personClass1.lastName = "Park"
personClass1.fullName
personClass2.fullName
// 결과 : "JinMong Park"
// 결과 : "JinMong Park"
간단한 클래스를 만들어서 동작을 이해해 봅시다.PersonClass
클래스가 있습니다. 구조체와 마찬가지로 이름을 표현할 수 있는 프로퍼티를 가지고 있습니다. personClass1
을 인스턴스 하였습니다. 그리고 새로운 변수 personClass2
에 할당을 해주었습니다. 이때에 구조체처럼 새로운 인스턴스가 되지 않고 personClass1
변수가 가리키고 있는 인스턴스 메모리 주소를 가지게 됩니다.
C++로 예를 들면 personClass1
을 포인터라고 생각하면 됩니다. 실제 메모리 구조도 클래스 인스턴스는 Heap 메모리입니다.
Struct, Class 언제 사용해야 할 까?
이럴 때 구조체를 사용하자.
1. 두 object를 직접 비교해야 하는 경우, 즉 데이터 자체를 비교해야 할 때에 사용하자.
2. 구조체는 Value Types이기 때문에 Copy가 된다. Copy 된 각 객체들을 독립적으로 가져야 할 때에 사용하자.
3. 코드에서 오브젝트의 데이터를 여러 스레드가 접근하여 사용할 경우.
이럴 때 클래스를 사용하자.
1. 두 오브젝트의 인스턴스 자체가 같음을 확인해야 할 때에 사용하자.
2. 하나의 객체가 필요하고, 여러 대상에 의해 접근되고 변경이 필요한 경우에 사용하자.
이건 애플 공식 문서에 있는 내용입니다.