swift 참조 타입과 값 타입, 함수 파라미터의 관계

함수의 인자값 전달은 기본적으로 call by value로 동작한다. 따라서 함수 내부에서 인자값을 변경하더라도 원래 값은 변경 되지 않기도 하고, 함수의 파라미터는 상수(let)로 선언되어있다. 따라서 아래와 같이 함수 내부에서 파라미터 값을 변경 하려고 하면, 오류가 발생한다.

func changeValue(input: Int) {
    input = 10
}

하지만 class타입의 경우, class타입 내부에 있는 프로퍼티는 변경이 가능하다.

class A {
var a = 10
}

func changeValue(input: A) {
    input.a = 20
}

let classA = A()
changeValue(input: classA)
print(classA.a) // 20 출력

classA를 생성 할 때, 스택과 힙 영역에 변수와 객체가 메모리에 올라오며, 변수는 힙에 있는 A 객체를 참조 한다.

changeValue가 실행 될 때, 함수의 실행 컨텍스트는 스택 영역에 할당 된다. 이때, class는 참조 타입이므로, input 파라미터에 값을 classA 변수가 가지고 있는 참조를 복사한다. 

즉 input은 A 객체를 가리키고 있는 참조를 가지고 있게된다. 따라서 input.a의 값을 변경해도 input이 가지고 있는 A객체 참조가 변경 되는 것이 아니라 객체의 값이 변경되는것이므로, 내부 값을 변경 할 수 있다.

input에 새 객체를 생성하는것은 참조를 변경하는 것이므로, 상수는 변경 할 수 없으므로 오류가 뜨게 된다.

class A {
var a = 10
}

func changeValue(input: A) {
    input = A()
}