본문 바로가기
iOS/Swift

[Swift] Class vs. Struct vs. Enum

by 0inn 2022. 9. 6.

Class와 Struct의 공통점

  • 값 저장할 프로퍼티 선언 가능
  • 함수적 기능을 하는 메서드 선언 가능
  • 생성자 사용해 초기 상태 설정 가능
  • extension 사용해 기능 확장 가능
  • protocol 채택해 기능 설정 가능

Class와 Struct의 차이점

Class

  • 참조 타입 (객체를 가리키고 있는 메모리 주소값만 복사)
  • heap memory 영역에 할당 (속도 느림)
  • ARC로 메모리 관리
  • 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 할당한 모든 변수에 영향을 준다.
  • 상속 가능
  • deinit을 사용해 클래스 인스턴스 메모리 할당 해제 가능

Struct

  • 값 타입 (value copy가 발생)
  • stack memory 영역에 할당 (속도 빠름)
  • 상속 불가능 (protocol은 가능)
  • 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체 할당

코드로 직접 살펴봅시다 !

 

class ImClass {
	var name: String = "0inn"
}

var student1 = ImClass()
var student2 = student1

student2.name = "jenny"

print(student1.name)	// jenny

 

class ImStruct {
	var name: String = "0inn"
}

var student1 = ImStruct()
var student2 = student1

student2.name = "jenny"

print(student1.name)	// 0inn

 

Class와 Struct의 차이가 보이시나요 ?

 

 Class의 경우 참조 타입이라 같은 클래스 객체(student1)를 다른 변수(student2)에 할당한 후 값(student2.name)을 변경시켰을 때, 참조된 객체의 값(student1.name)도 변경되게 됩니다.

 이에 반해, Struct의 경우 새로운 구조체에 할당할 때마다 새로운 구조체에 할당되므로 값에 영향을 주지 않게 됩니다.

 

그렇다면 중요한

언제 Class를 쓰고 언제 Struct를 쓰는 게 좋을까요 ?

 

Class

  • Objective-C와 상호 운용성을 원할 때

Struct

  • 단순한 데이터 값을 가지거나 작은 값을 갖는 데이터를 처리할 때
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때

Enum

  • 상속 불가
  • enum case로 컴파일 타임에 에러 확인 가능
  • 구조체와 달리 생성하지 않고 바로 상수로 접근 가능
  • case가 비트단위의 고유값을 갖기 때문에 비교가 빠름
  • 많이 사용하면 확장성 측면에서 불리 (열거형 수정되면 모든 소스들을 다시 컴파일 해야하기 때문)

코드로 직접 살펴봅시다 !

enum ImEnum {
    case hello
    case bye
    
    var msg: String {
    switch self {
    	case .hello:
            return "hello"
        case .bye:
            return "bye"
    }
}

 


참고

https://icksw.tistory.com/256

https://sihyungyou.github.io/iOS-class-struct-enum/

 

 

'iOS > Swift' 카테고리의 다른 글

[Swift] stride 함수 / Set  (0) 2022.10.25
[Swift] Swift 알고리즘 - 수학  (0) 2022.10.13
[Swift] Swift 알고리즘 - Dictionary  (0) 2022.10.12
[Swift] Swift 알고리즘 - 문자열 / 배열  (0) 2022.10.11
[Swift] 클로저 (Closure)  (0) 2022.09.24