c# 메떠드 아규먼트로 밸류/레퍼런스 타입을 쓸 때의 차이
세 경우로 나눌 수 있다. 먼저 용어들을 정리한다. 호출을 하는 것은 caller이고 호출되는 것은 callee이다. 들어가는 값은 argument이고 인자라고도 한다. 받는 값은 parameter이고 매개변수라고도 한다. 한자어가 더 어렵게 느껴져서 그냥 영어를 쓴다.
패러미터를 수정해도 아규먼트가 변경되지 않는 경우
밸류 타입 아규먼트를 그냥 넘긴 경우다. 메떠드가 호출되면 아규먼트를 패러미터로 복사하여 이들 둘은 서로 다른 게 된다. 아규먼트가 커다란 구조체인 경우 이 과정에서 부하가 커진다. 가능하면 이렇게는 하지 않는 게 좋다.
패러미터를 수정하면 아규먼트가 변경되는 경우
밸류 타입 아규먼트에 ref 키워드를 붙여서 넘기거나 레퍼런스 타입을 넘긴 경우다. 밸류 타입의 아규먼트가 아무리 커도 주소만 넘겨지므로 부하가 적다. 레퍼런스 타입은 애당초 주소만 값으로 가지고 있으므로 레퍼런스 타입을 넘긴다는 거는 주소를 넘기는 거다. 콜리에서 패러미터를 변경하면 콜러의 아규먼트 주소도 같으므로 같이 변경된다. 그러나 콜리에서 패러미터를 널로 만들어도 콜러의 아규먼트가 널로 되지는 않는다는 거에 유의한다.
패러미터를 수정하여 아규먼트를 널로 바꿀 수 있는 경우
레퍼런스 타입 아규먼트에 ref 키워드를 붙여서 넘기면 콜리에서 패러미터를 널로 바꾼 경우 콜러의 아규먼트까지 널로 바뀐다. 콜리에서 콜러의 아규먼트를 널로 만들어야 하는 경우는 일반적인 상황이 아니므로 레퍼런스 타입 아규먼트에는 ref 키워드를 붙이지 않고 쓴다.