값 타입/참조 타입 비교

JG Ahn·2024년 10월 10일

swift 기초

목록 보기
14/23

1. 값 타입과 참조 타입 비교

  • 값 타입(Value Type) : 데이터 전달시 값을 '복사'하여 전달(각각의 인스턴스가 다른 주소값을 가짐)
    • Struct, Enum, Tuple, 컬렉션( Array, Dictionary, Set)
  • 일반적으로 Stack영역에 저장됨
struct ValueType {
    var property = 1
}

//첫 번째 구조체 인스턴스
let firstStructInstance = ValueType()

//두 번째 구조체 인스턴스(첫번째 인스턴스 복사)
var secondStructInstance = firstStructInstance

//두 번째 구조체 인스턴스 프로퍼티값 수정
secondStructInstance.property = 2

//두 인스턴스 간의 영향 없음
print(firstStructInstance.property) //결과 : 1
print(secondStructInstance.property) //결과 : 2
  • 참조 타입(Reference Type) : 데이터 전달시 값의 메모리 위치 전달(인스턴스들이 하나의 주소 공유)
    • Class, Class의 인스턴스, 클로저
  • Heap 영역에 저장됨
class ReferenceType {
	var property = 1
}

//클래스 인스턴스 생성(첫 번째 참조 생성)
let firstReferenceType = ReferenceType()

//두 번째 참조변수 생성(첫 번째 참조를 할당)
var secondReferenceType = firstReferenceType

secondReferenceType.property = 2

//두 번째 참조 변수는 첫 번째 클래스 인스턴스를 참조하기 때문에 첫 번째 클래스의 프로퍼티 값도 변경됨
print(firstReferenceType.property) //결과 : 2
print(secondReferenceType.property) //결과 : 2

2. 타입의 사용

  • 값 타입

    • 다른 객체 또는 함수에 복사를 할 경우
    • 독립적인 상태의 인스턴스를 만들고 싶은 경우
    • 인스턴스를 등호(==) 비교하는 경우(stack 영역 비교)
  • 참조 타입

    • 인스턴스를 참조 등호(===)로 비교하는 경우(heap 영역 비교)
    • 공유되고 변경 가능한 상태를 만들고 싶은 경우

3. 스위프트에서의 사용

  • 스위프트의 기본 데이터 타입 모두 구조체로 구현되어있음(값 타입)
  • 스위프트는 구조체, 열거형 사용을 선호
  • Apple 프레임워크는 대부분 클래스 사용

☝🏻 mutating

  • 메소드를 사용해 프로퍼티를 변경할 경우 사용하는 키워드
  • 값 타입인 enum, struct에서만 사용 가능
    (참조타입인 클래스는 mutating 없이 메소드를 사용해 자유롭게 변경 가능)

0개의 댓글