[Swift] 값 타입과 참조 타입(Value Type vs Reference Type)
Closed this issue · 0 comments
jane1choi commented
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의 프로퍼티 값도 변경됩니다.