jane1choi/TIL

[Swift] 값 타입과 참조 타입(Value Type vs Reference Type)

Closed this issue · 0 comments

images-hygge-post-ef7a32cb-771d-41d1-8930-ea69a69d8c8a-image

Class, Struct, Enum을 비교해보면 Class만 유일하게 Reference타입이며 상속이 가능합니다.

Class(클래스)

  • 전통적인 OPP(=객체 지향 프로그래밍) 관점에서의 클래스
  • 단일 상속 (다중 상속 불가)
  • 참조 타입
  • Apple 프레임워크의 대부분의 큰 뼈대는 모두 클래스로 구성

Struct(구조체)

  • 상속 불가
  • 값 타입
  • Swift의 대부분의 큰 뼈대는 모두 구조체로 구성 (기본 데이터 타입)
public struct Int
public struct Double
public struct String
public struct Dictionary<Key: Hashable, Value>
public struct Array<Element>
public struct Set<Element: Hashable>

구조체는 언제 사용할까?

  • 다른 객체 또는 함수 등으로 전달 시 참조가 아닌 복사를 원할 때
  • 자신을 상속할 필요가 없거나, 자신이 다른 타입을 상속받을 필요가 없을 때

Swift의 많은 기본 데이터 타입들이 구조체로 이루어져 있고, Swift는 구조체와 열거형을 클래스형보다 선호합니다.
하지만 Apple 프레임워크는 대부분 클래스를 사용하기 때문에, Apple 프레임워크 사용시 상황에 따라 적절히 구조체/클래스를 선택해서 사용해야 합니다.

Enum(열거형)

  • 유사한 종류의 여러 값을 유의미한 이름으로 한 곳에 모아 정의한 것
    ex) 요일, 월 등
  • 상속 불가
  • 값 타입
  • 열거형 자체가 하나의 데이터 타입이므로 열거형의 case 하나하나 전부 하나의 유의미한 값으로 취급

Value 타입(값 타입) vs Reference 타입(참조 타입)

Value타입과 Reference타입은 데이터 전달 방식에 차이가 있습니다.

  • Value: 데이터를 전달할 때 값을 복사하여 전달
  • Reference: 데이터를 전달할 때 값의 메모리 위치를 전달

예제로 이해해보도록 하겠습니다!

struct ValueType {
    var property = 1
}

class ReferenceType {
    var property = 1
}
var first = ValueType() 
var second = first 
second.property = 2

print(first.property) // 1
print(second.property) // 2

Struct는 Value 타입(값 타입)이므로 값을 복사하여 전달합니다.
따라서 second는 first를 똑같이 복사한 별도의 인스턴스가 되는 것입니다.
그렇기 때문에 second의 프로퍼티 값을 변경해도 first의 프로퍼티 값에는 영향이 없습니다.

var third = ReferenceType() 
var fourth = third
fourth.property = 2

print(third.property) // 2
print(fourth.property) // 2

Class는 Reference 타입(참조 타입)이므로 값의 메모리 위치를 전달합니다.
따라서 third와 fourth는 별도로 존재하는 것이 아니라 같은 위치를 가리키고 있는 것입니다.
그렇기 때문에 fourth의 프로퍼티 값을 변경하면 third의 프로퍼티 값도 변경됩니다.