참조 타입과 Call by Value, Call by Reference

자바의 참조타입은 Call by Value로 동작한다길래, swift의 개념도 흔들려서 이번기회에 꽉 잡기위해 포스팅한다.

 

누구나 알고 있겠지만 Call by Value, Call by Reference를 정의 하면

Call by Value

값을 복사하여 처리한다

Call by Reference

주소를 참조하여 처리한다.

 

여기서 헷갈린 개념이, 그러면 참조 타입은, 주소 값을 가지고 있고, 다른 변수에 할당 할 때, 이 값을 복사해서 다른 변수에 할당하는 것인지를 헷갈렸다.

 

결론부터 말하자면, 주소를 복사해서 다른 변수에 할당하는 것이 아닌, 참조 그 자체를 복사한다. 즉 주소값을 복사하는게 아니다.

class A {
    var a: Int = 0
}

var classA = A()
var classB = classA

그림으로 표현하면 변수 classA는 힙 메모리에서 A객체의 "참조"를 가지고 있는 것이고

classA는 classB에 값을 할당할 때, 주소값을 할당하는게 아닌 객체의 실 메모리 주소를 가리키고 있는 "참조" 그 자체를 복사하는 것. 따라서 call by reference로 동작 된다.

자바는 이와 다르게 참조 타입을 다른 변수에 할당 할 때, 참조가 가리키는 주소값이 복사되어서 call by value로 동작 된다고 한다.