변수와 상수의 차이가 뭐에요?

Swift에서 변수를 선언할 때는 var, 상수를 선언할 때는 let 키워드를 사용한다. 보통 변수는 값을 바꿀 수 있는 것, 상수는 값을 바꿀 수 없는 것이라고 말한다. 변수가 기본 자료형일 때는 값을 바꾼다 라는게 무슨 뜻인지 매우 명확하다. 정수 1을 2로 바꾼다, 소수 3.14를 3.15로 바꾼다, true를 false로 바꾼다 등. 반면에 변수가 객체일 때는 생각할게 좀 더 많아진다.

변수가 객체일 때 “값을 바꾼다(mutation)”는 두 가지 의미가 있을 수 있다. 객체의 속성을 바꾸는 것도 될 수 있고, 변수가 가르키는 인스턴스를 바꾸는 것도 될 수 있다.

// 1. 객체의 속성을 바꾼다.
var person = Person(name: "John")
person.name = "Jane"

// 2. 변수가 가르키는 인스턴스를 바꾼다.
var person = Person(name: "John")
person = Person(name: "Jane")

그렇다면 값을 바꾼다는건 이 중에 어떤걸 의미하는걸까? 객체를 var로 선언하면 둘 다 될까? let으로 선언하면 둘 다 안될까? 여기에 객체의 종류까지 추가해서 Person 객체가 struct일 때와 class일 때를 각각 따져본다.

정리하자면 다음처럼 여덟 가지 경우의 수가 나온다.

객체 종류 선언 방식 객체의 속성을 바꿀 수 있는가? 변수가 가르키는 인스턴스를 바꿀 수 있는가?
struct var ? ?
class var ? ?
struct let ? ?
class let ? ?

이를 토대로 던져볼 수 있는 질문들

  • var와 let을 나누는 기준은 무엇인가?
  • struct와 class가 mutation을 나누는 기준은 무엇인가?
  • 값 타입과 참조 타입이라는 것이 영향을 미치는가?
  • 객체의 속성을 바꿀때 class와 struct에서는 각각 어떤 일이 일어나는가?
  • class와 struct 중에 선택할 때 고려해야 하는 것들은?

등등…