본문 바로가기
Ios

struct 그리고 class

by 잘먹는 개발자 에단 2024. 8. 16.

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