티스토리 뷰

데이터를 용도에 맞게 표현하고자 할 때 사용

가장 큰 차이점

구조체의 인스턴스 = 값(value)

클래스의 인스턴스 = 참조(reference)

 

스위프트의 데이터 타입과 열거형은 모두 "값" 타입

 

참조는 C언어의 포인터와 유사한 개념

 

Struct (구조체)

구조체를 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없음

var로 선언하면 프로퍼티가 var일 경우 변경 가능

 

 Class (클래스)

클래스를 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 있음

클래스의 인스턴스는 참조 타입이므로 참조할 필요가 없을 때 메모리에서 해제됨 -> deinit 호출

 

공통점

  • 프로퍼티와 메서드를 정의할 수 있음
  • *서브스크립트를 정의할 수 있음
  • 이니셜라이저를 정의할 수 있음
  • 익스텐션 사용 가능
  • 프로토콜 준수 가능

 

차이점

  • 구조체 = 상속할 수 없음
  • 클래스의 인스턴스 =  타입캐스팅이 가능
  • 클래스의 인스턴스 =  디이니셜라이저 활용
  • 클래스의 인스턴스 =  Reference Counting 적용

 

값 타입

값이 복사되어 전달됨 -> 서로 다른 값

 

참조 타입

주소가 전달됨 -> 서로 같은 값

struct PersonStruct {
    let name: String
    var age: Int
}

class PersonClass {
    let name: String = "B"
    var age: Int = 10
}

var a1: PersonStruct = PersonStruct(name: "A", age: 10)
var a2: PersonStruct = a1

a2.age = 20

print(a1.name, a1.age)
print(a2.name, a2.age)

//A 10
//A 20


var b1: PersonClass = PersonClass()
var b2: PersonClass = b1

b1.age = 20

print(b1.name, b1.age)
print(b2.name, b2.age)

// B 20
// B 20

//식별 연산자, 참조가 같은지 확인
print(b1 === b2)
//true

 

활용

구조체를 사용하는 경우 (애플 가이드라인)

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  • 참조보다 복사가 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입
  • 상속이 필요 없을 때

구조체라서 복사할 때 메모리가 비효율적일 것 같지만 꼭 필요한 경우만 "진짜 복사"를 하는 방식으로 스위프트가 알아서 효율적으로 처리함

 

퍼포먼스 관련 글:

https://baechukim.tistory.com/81

 

 

참고 도서

m.yes24.com/Goods/Detail/78907450

 

스위프트 프로그래밍

문법을 넘어 프로그래밍 패러다임도 익히는 스위프트 5스위프트 5의 핵심 키워드는 ‘안정화’다. ABI 안정화 덕분에 버전과 환경에 크게 영향받지 않고 더 유연하게 스위프트를

m.yes24.com

 

 

*서브스크립트 : 클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법정의 가능

예를 들어 someArray[index] 는 Array인스턴스의 index를 통해 값에 접근하는 것! -> 서브스크립트

'Swift' 카테고리의 다른 글

[Swift] 상속  (0) 2021.05.01
[Swift] 접근제어  (0) 2021.05.01
[Swift] Swift 언어의 특징  (0) 2021.05.01
[Swift] Delegation이란?  (0) 2021.04.09
[Swift] @escaping closure, 탈출 클로저 쉽게 이해하기  (0) 2021.01.22
댓글
공지사항