더북(TheBook)

앞쪽 두 개의 메서드는 출력되는 메시지와 매개변수의 형태를 제외한다면 완전히 동일하다. Main 메서드 내에서는 두 개의 메서드를 동일한 방식으로 호출하는데, 10으로 초기화한 지역 변수와 이 지역 변수의 값을 증가시키는 action을 인수로 전달한다. 다음은 이 예제를 수행한 결과인데, 두 메서드의 수행 결과가 조금 다르다.

Start of InParameter method
p = 10
p = 11
Start of ValueParameter method
p = 10
p = 10

이처럼 InParameter 메서드에서는 action()을 호출했을 때 매개변수의 값이 변경된다. 반면 ValueParameter 메서드에서는 매개변수의 값이 변경되지 않는다. 이는 그리 놀랍지 않은데, in 매개변수의 경우에는 저장소 위치를 공유하지만 값 매개변수의 경우 복사본을 이용하기 때문이다.

예제 코드가 비교적 짧기 때문에 결과가 이렇게 동작되는 것이 명확해 보일지도 모르겠다. 하지만 코드가 좀 더 길어지면 그렇지 않을 수 있다. 예를 들어 in 매개변수를 동일한 클래스 내 필드의 별칭으로 사용하는 경우를 생각해 보자. 해당 클래스에 속한 메서드 내에서 필드의 내용을 직접 변경하거나 혹은 클래스 외부에 존재하는 메서드를 호출하고, 그 메서드 내에서 해당 클래스의 필드 내용을 변경하게 되면 매개변수의 내용도 같이 변경될 것이다. 이 경우에 매개변수가 어떻게 변경되었는지를 추척하기란 여간 까다로운 게 아니다. 게다가 다중 스레드가 사용되는 상황에서는 어떤 문제가 발생할지 예상하기가 어렵다.

지엽적인 문제를 다소 과장되게 이야기한다고 생각할지 모르겠으나, 이는 실제로 발생하고 있는 문제임이 분명하다. 이전 예제들을 살펴보면 매개변수와 인수에 한정자를 지정한 후, 참조 매개변수를 전달하도록 하여 유사한 문제2가 발생할 수 있음을 좀 더 강조했을 따름이다. 사실, ref 한정자를 사용하게 되면 매개변수의 값이 변경될 수 있음을 암시하는 듯한 느낌을 주지만, in 한정자를 사용하게 되면 매개변수의 값이 변경되지 않으리라 기대하게 된다. 13.3.4절에 in 매개변수를 어떻게 사용할지에 대한 지침을 정리해 두긴 했지만, in을 사용하는 경우에도 통상의 기대와는 달리 값이 변경될 위험성이 있다는 점을 반드시 알아 두기 바란다.

 

 


2 이런 문제는 ‘유령 같은 원격 작용(spooky action at a distance)’으로 불리곤 하는 양자 얽힘 현상과 유사하다고 생각하고 싶다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.