struct와 class의 비교
1. 값 타입 vs 참조타입
struct는 값 타입입니다.
struct로 정의된 인스턴스를 다른 변수나 상수에 할당하거나 함수의 인자로 전달할 때, 복사본이 생성됩니다.
즉, struct 인스턴스는 독립적인 복사본으로 존재하게 되며, 원본과 복사본은 서로 독립적입니다.
struct MyStruct {
var value: Int
}
var a = MyStruct(value: 10)
var b = a // a의 복사본이 b에 할당됩니다.
b.value = 20 // b의 value만 변경되며, a의 value는 변경되지 않습니다.
print(a.value) // 10
print(b.value) // 20
class는 참조타입입니다.
class로 정의된 인스턴스를 다른 변수나 상수에 할당하거나 함수의 인자로 전달할 때, 참조가 전달됩니다.
즉, 클래스 인스턴스는 동일한 메모리 주소를 참조하게 되며, 인스턴스의 한 복사본을 수정하게 되면 모든 참조가 수정됩니다.
class MyClass {
var value: Int = 10
}
var a = MyClass()
var b = a // a와 b는 동일한 인스턴스를 참조합니다.
b.value = 20 // b를 통해 값을 변경하면 a의 value도 변경됩니다.
print(a.value) // 20
print(b.value) // 20
2. 상속
struct는 상속을 지원하지 않습니다.
struct는 기본적으로 상속 기능이 없으며, 다른 struct로부터 상속받거나 상속을 제공할 수 없습니다.
class는 상속을 지원합니다.
class는 다른 클래스로부터 상속받을 수 있으며, 이를 통해 기존 클래스를 확장하거나 재정의할 수 있습니다.
class Animal {
var name: String = ""
}
class Dog: Animal {
func bark() {
print("Woof!")
}
}
let dog = Dog()
dog.name = "Buddy"
dog.bark() // Woof!
3. 초기화 메서드
struct는 자동으로 멤버와이즈 이니셜라이저를 자동으로 제공합니다.
struct를 생성할 때 모든 프로퍼티를 초기화하는 이니셜라이저가 자동으로 제공됩니다.
struct MyStruct{
var value : Int
}
let instance = MyStruct(value : 10)
class는 멤버와이즈 이니셜라이저를 자동으로 제공하지 않습니다.
클래스는 직접 이니셜라이저를 정의해야하며, 기본 이니셜라이저를 사용할 수도 있습니다.
class MyClass{
var value : Int
init(value : Int){
self.value = value
}
}
let instance = MyClass(value : 10)
4. 디이니셜라이저
struct는 디이니셜라이저를 가질 수 없습니다.
값 타입이기 때문에 인스턴스가 메모리에서 사라질 때 특별한 정리 작업이 필요하지 않습니다.
class는 디이니셜라이저를 가질 수 있습니다.
참조타입이기 때문에 인스턴스가 메모리에서 사라질 때 정리작업을 위해서 deinit 메서드를 정의할 수 있습니다.
class MyClass {
var value: Int
init(value: Int) {
self.value = value
}
deinit {
print("MyClass instance is being deallocated")
}
}
5. 참조카운팅
struct는 참조 카운팅을 하지 않습니다.
값 타입이기 때문에 참조 카운팅이 필요없습니다.
각 값이 독립적으로 존재하며, 복사본이 만들어집니다.
class는 참조 카운팅을 합니다.
참조 타입이기 때문에, 인스턴스가 메모리에서 해제될 때까지 몇 개의 참조가 있는지 추적하기 위해 참조 카운팅을 사용합니다.
이는 메모리 관리와 관련된 중요한 개념입니다.
6. 보통 어떨때 사용하는지
struct는 주로 간단한 데이터 구조에 사용됩니다.
struct는 불변성 immutability을 더 쉽게 유지할 수 있어서, 데이터 모델링, 값 전달 등 간단한 데이터 구조에 적합합니다.
class는 주로 복잡한 객체모델에 사용됩니다.
class는 상속과 참조를 통해 복잡한 객체구조를 구현하는데 적합합니다. 앱의 주요로직, 데이터 관리객체, UI요소등을 구현할 때 주로 사용됩니다.
'Ios' 카테고리의 다른 글
클로저에 대해서 알아보자 (0) | 2024.08.16 |
---|---|
self에 대해서 알아보자 (0) | 2024.08.16 |
as에 대해서 알아보자 (0) | 2024.08.16 |
DispatchQueue에 대해서 알아보자! (0) | 2024.08.16 |
async-await / try (0) | 2024.08.16 |