in 매개변수를 사용했을 때 가장 걱정스러운 부분은 코드를 이해하기 어렵게 만들 수 있다는 점이다. 동일한 매개변수를 여러 번 사용하는 경우, 매개변수의 값이 매번 달라질 수 있다. 13.3.2 절에서 살펴본 바와 같이, 호출하는 메서드 내에서 매개변수의 값을 직접 변경하지 않는 경우에도 이런 문제가 발생할 수 있다. 이런 이유로 코드를 올바르게 작성하기가 어려울 뿐 아니라, 잘못된 코드를 수정하는 것도 상당히 어렵다.
in 매개변수의 장점을 취하면서 단점을 회피할 수 있는 방법도 있다. 우선 매개변수의 값이 변경될 가능성을 조심스럽게 제거하는 것이다. 만약 public으로 공개된 API를 개발하고 있고 이 API가 내부적으로 private 메서드를 상당히 많이 호출한다면, 공개된 API에서는 값 매개변수를 취하되 private 메서드에서는 in 매개변수를 취하도록 설계하는 것이 좋다. 다음 예제는 무의미한 계산을 수행하긴 하지만 이러한 방식으로 코드를 작성한 예다.
예제 13-14 in 매개변수를 안전하게 사용하려면 ▶ SafeInParameters.cs
➊
public static double PublicMethod(
LargeStruct first,
LargeStruct second)
{
double firstResult = PrivateMethod(in first);
double secondResult = PrivateMethod(in second);
return firstResult + secondResult;
}
➊
private static double PrivateMethod(
in LargeStruct input)
{
double scale = GetScale(in input);
return (input.X + input.Y + input.Z) * scale;
}
private static double GetScale(in LargeStruct input) => ----- in 매개변수를 취하는 또 다른 메서드
input.Weight * input.Score;
➊ 값 매개변수를 취하는 public 메서드
➋ in 매개변수를 취하는 private 메서드