seong_hye, the developer

Swift) Class vs Struct 본문

IOS

Swift) Class vs Struct

seong_hye 2022. 7. 26.

 

📘 Swift 문법 정리: Class vs Struct

class와 struct는 둘 다 앱을 만들 때 가장 처음 보게 되는 키워드라고 할 수 있다.

두 키워드의 공통점과 차이점에 대해 한 번 알아보자


🔹 기본 구조

class와 struct 모두 데이터를 정의하는 사용자 정의 타입

class Animal {
	var species: String = ""
    func sound() {
    	print("소리를 냅니다")
    }
}

struct Person {
	var name: String
    func greet() {
    	print("안녕하세요 \(name)님")
    }
}

🔹 공통점

프로퍼티(변수), 메서드(함수), 초기화(init), 확장(extension) 프로토콜 채택 등 가능


🔹 차이점

항목 struct (구조체) class (클래스)
타입 값 타입 (Value Type) 참조 타입 (Reference Type)
메모리 복사 복사 -> 독립된 인스턴스 참조 -> 동일 인스턴스 공유
상속 불가능 가능
ARC 적용 여부 영향 없음 ARC 적용
mutating 필요 여부 값 변경 시 mutating 필요 없음
deinit 지원 없음 있음 (메모리 해제 감지)
Equality(==) 기본 제공(Equatable) 직접 구현 필요

 

✅ 메모리 동작 예시

struct A {
	var value = 1
}

class B {
	var value = 1
}

var a1 = A()
var a2 = a1
a2.value = 2
print(a1.value) // 1 ( 값이 복사됨)

var b1 = B()
var b2 = b1
b2.value = 2
print(b1.value) // 2 (같은 인스턴스 참조됨)

➡️ struct는 값 타입이기 때문에 값을 복사해 따로 사용함

➡️ class는 참조 타입이기에 값을 공유함

 

✅struct는 왜 mutating을 사용하는가?

struct Counter {
	var count = 0
    
    mutating func increment() {
    	count += 1
    }
}

📌 struct는 구조체로 값 타입이기 때문에 내부 값을 바꾸려면 명시적으로 mutating 선언 필요함

 

✅class의 상속과 deinit

class Animal {
	func sound() {
    	print("...")
    }
}

class Dog: Animal {
	override func sound() {
    	print("멍멍")
    }
    
    deinit() {
    	print("메모리에서 해제됨")
    }
}

📌 class는 상속을 지원하고

참조타입이기에 메모리 관리(ARC)가 적용되고 deinit을 통해 메모리 해제 될 때 자동으로 호출됨

~> 클로저 캡쳐 시 강한 참조 순환을 피하기 위해 유용


🔹 언제 struct를 쓰고 언제 class를 쓸까?

struct가 적합한 경우 class가 적합한 경우
데이터 저장 용도 ( 값 중심 ) 공통 기능 상속 필요
독립적인 복사 필요 (Immutable 설계) 하나의 인스턴스를 공유해야 할 때
SwiftUI, 모델링에 자주 사용 UIKit 뷰 컨트롤러 등 대부분 class 기반
참조 순환 우려 없음 ARC로 메모리 관리 필요할 때

🔹 Swift의 기본 타입은 모두 struct

기본 타입들이 모두 구조체

- Int, Double, Bool

- String, Array, Dictionary, Set

 

~> Swift는 구조체를 우선적으로 사용하는 값 중심 프로그래밍을 권장함


 

'IOS' 카테고리의 다른 글

Swift) DispatchSourceTimer이란?  (0) 2022.08.02
Swift) NotificationCenter이란?  (0) 2022.07.26
Swift) 문법 정리 - 싱글톤(Singleton) 패턴  (0) 2022.07.26
Swift) 문법 정리 - self vs Self  (0) 2022.07.19
Swift) 문법 정리 - @escaping  (0) 2022.07.19
Comments