타입에는 두 가지 종류가 있다. value type과 reference type

value type은 identifier가 가르키는 메모리 위치에 자신의 [값]을 그대로 담고 있다.

reference type은 identifier가 가르키는 메모리 위치에 실제 정보를 가진 객체의 pointer를 [값]으로 가지고 있다.


일반적으로 함수 호출시 인자로 넘길때 value/reference 타입 모두 call by value로 넘어간다.

value타입은 자신의 [값]이 그대로 복사되어져서 넘어가고

ref타입은 pointer [값]이 그대로 복사되어져서 넘어간다.

그리고 이 값들은 함수 내부의 [별도의] identifier에 바인딩 되어서 다루어 지게 된다.

함수 내부에서 이 별도의 identifer를 가지고 여러가지 일을 할 수 있다.

value type은 값을 바꾸어 봤자 어차피 복사 된 값을 가지고 하는것이니 외부에 아무런 영향을 미칠 수 없고

reference type은 포인터는 복사된 것이기는 하지만 포인터가 가르키는 그 객체는 같은 것이므로

객체의 내용에 변경을 가하면 외부의 identifer가 가르키는 그 객체의 내용도 변경이 되는 것이다.

함수 외부의 identifer 자체는 영향을 받지 않는다.


함수 정의시 파라미터에 (C#의 경우 ref) 특별한 키워드를 달아주면 해당 파라미터는 call by ref로 작동한다.

call by ref는 값을 넘기는 것이 아니다. identifier자체를 넘기는 것이다.

이때 넘겨진 identifier는 함수내부의 identifier와 [일체]가 된다.

함수 내부에서 identifier를 변경하면 외부의 identifer도 변경된다.