본문 바로가기

iOS/Swift

Value와 Reference를 나누는 본질

Swift에서 Type은 정말 여러 관점에서 해석되고 분류될 수 있습니다.

  • Basic vs Named
  • Value vs Reference
  • Optional vs non-Optional

이 외에도 다양한 관점으로 분류할 수 있으나, 오늘 다뤄볼 내용은 Value와 Reference의 차이에 대해서 소개하려고 합니다.

Value Type vs Reference Type

두 타입의 결정적인 차이는 무엇일까요?
Apple의 Swift 공식 문서에서는 친구에게 문서를 공유하는 상황을 예시로 들고 있습니다.

친구에게 문서를 전달한다고 했을 때, 당신은 어떻게 전달할 것인가?

  1. 메일로 문서.docx의 사본을 보낸다.
  2. 구글 독스의 링크 공유를 통해 보낸다.

 

Value -> 메일로 문서.docx 의 사본을 보내기

 Value Type의 동작은 메일로 문서의 사본을 보내는 행위와 유사합니다. 내가 보낸 문서의 사본을 친구가 수정하더라도 내 문서에는 아무런 영향을 주지 않습니다. 둘은 완전히 별개의 파일입니다.

struct Document {
  var text: String
}

var myDoc = Document(text: "Great new article")
var friendDoc = myDoc

friendDoc.text = "Blah blah blah"

print(friendDoc.text) // "Blah blah blah" 출력
print(myDoc.text) // "Great new article" 출력 

Reference -> Google Docs 링크 공유하기

 반면, Reference Type의 동작은 Google Docs 링크를 공유하는 행위와 유사합니다. 전송한 링크로 친구가 접속해 문서의 내용을 바꾼다면, 내 문서의 내용도 달라집니다. 둘은 본질적으로 같은 파일입니다.

class Document {
  var text: String
}

var myDoc = Document(text: "Great new article")
var friendDoc = myDoc

friendDoc.text = "Blah blah blah"

print(friendDoc.text) // "Blah blah blah" 출력
print(myDoc.text) // "Blah blah blah" 출력

Local reasoning(지역 추론)

 방금 여러분이 위의 코드를 읽고 이해했다면 그것은 지역추론입니다. 코드가 동작하는 일부분만 보고 동작 방식을 추론해내는 것을 지역추론, Local reasoning이라고 합니다. Reference Type을 Value Type과 명확하게 구분짓는 점은 여러 곳에서 참조될 수 있다는 것입니다. 위의 구글 독스의 예시에서 여러 명이 같은 문서를 열람하고 변경할 수 있는 것처럼 말이죠. 분명 이는 편리하고 유용하지만, 곤란한 상황을 초래하는 경우도 있습니다. 친구가 링크를 또 다른 친구에게 또 공유한다면? 내가 모르는 사람이 열람하고 편집한다면? 문제가 생길 여지가 있겠죠?

 

 이렇게 Reference Type은 하나의 객체를 여러 변수에서 참조해 이를 변경할 수 있습니다. 조금 유식한 말로는 shared mutable state라고 하는데요, 안타깝게도 Reference type은 위와 같은 특성 때문에 지역 추론을 하기 힘든 특성을 가지고 있습니다.

 

 Value Type은 이 지점에서 유리합니다. 값이 변경될 수 있는 지점이 한정됩니다. shared mutable state 하지 않기 때문에, 바로 앞에 있는 코드에 대해서만 추론하면 됩니다. 여러 곳에서 참조됨으로써 비롯되는 여러 문제도 예방할 수 있습니다. (덤으로 Value가 성능도 대부분의 상황에서 더 좋은 편이죠.)

둘을 나누는 차이는 어디서 비롯될까?

 둘의 차이를 Heap, Stack 메모리 저장 위치로 구분하는 게시글을 많이 보았습니다. struct와 class는 대표적인 Value Type과 Reference Type이지만, 그 둘의 인스턴스가 일반적으로 할당되는 영역이 Heap과 Stack인 것이지 이는 절대적인 기준은 아닙니다.

 

두 타입의 차이 자체는 변수에 값이 할당되는 맥락에서 출발하며, 그것이 고유한지 공유되는 것인지로 귀결됩니다.

이렇게 정리해볼 수 있겠습니다.

  • Value Type은 각각의 메모리 공간을 가진다.
  • Reference Type은 공유하는 메모리 공간을 가진다.

이후에는 Value와 Reference의 이러한 본질로부터 파생되는 특징과 프로그래머로서 어떻게 이를 통제하면 좋을지 알아보겠습니다.

참고 문서

https://www.swift.org/documentation/articles/value-and-reference-types.html - value and reference, swift.org
https://developer.apple.com/swift/blog/?id=10 - apple developer blog

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

Repository Pattern  (0) 2025.03.26
Closure, function  (0) 2025.03.01
Closure  (0) 2025.02.24
Method Dispatch  (0) 2025.02.02
Type에 대해서  (0) 2025.01.05