Recent Posts
Recent Comments
Link
관리 메뉴

NaggingMachine

[C# 4.0] 이름으로 접근하는 매개 변수(Named Parameter) 본문

Visual Studio

[C# 4.0] 이름으로 접근하는 매개 변수(Named Parameter)

naggingmachine 2009. 5. 17. 23:37
프로그램이란 코드라는 측면에서 바라볼때 수많은 함수를 논리적인 흐름에 맞도록 구성한 것이라고 생각해볼 수 있겠습니다. 그래서 코드 작성에 관한 소프트웨어 서적들은 함수를 잘 관리하고 구성할 수 있는 능력이 얼마나 중요한지를 강조하고 있습니다. 오늘은 C# 4.0에 새롭게 추가될 Named Parameter에 대해서 살펴보겠습니다.

결론부터 말씀드리면, Named Parameter는 매개 변수의 이름을 통해서 함수에 매개변수를 전달한다 정도가 되겠습니다. 

자, 다음과 같은 코드가 있다고 보죠.

public void M(int x, int y = 5, int z = 7);[각주:1]

이와같이 정의된 함수는 다음과 같이 다양한 방법으로 호출 할 수가 있습니다.

M(1, 2, 3); // 일반적인 호출
M(1, 2); // z 생략, M(1, 2, 7)과 같음
M(1); // y와 z 생략, M(1, 5, 7)과 같음

자, 그런데 만약 y는 생략한채, z만 넘겨주고 싶을 때 어떻게 해야 할까요? 아마도 가장 자연스러운 방법은 다음과 같이 y를 생략한채 호출하는 방법일 것입니다.

M(1, , 3); // y 생략

하지만 안타깝게도 이와 같은 방법은 제공되지 않습니다. 저도 이 방법은 적당하지 않다고 생각합니다. 왜냐하면 코드 작성에 있어서 코드를 작성한 개발자의 의도가 분명하게 반영되지 않을 수 있고, 매개 변수가 많은 경우에 개발자가 실수를 할 수도 있기 때문이죠. 어떤 경우냐구요? 자, 다음과 같은 예를 한번 살펴보겠습니다.

public void M(int x, int y = 5, int z = 7, int a = 9);

이 경우 만약 M(1, , 3)과 같이 호출했다고 해보겠습니다. 당연히 내부적으로는 M(1, 5, 3, 9)와 같이 호출되었다고 생각되겠죠. 하지만 만약 개발자가 M(1, 5, 7, 3)을 의도했다면, 그러니까 실수로 z를 생략하기 위한 콤마를 하나빠뜨렸다면? M(1, , , 3)? 콤마를 하나빠뜨린 상황때문에 엄청난 문제가 발생할 수도 있습니다. 개발자는 언제나 발생 가능한 모든 경우를 고민해야 하니까요. 잘못된 코드로 인해 누군가의 생명이 위험에 처해질 수도 있습니다.

어쨌든 개발자는 모든 코드를 명시적으로 작성해야할 필요가 있고 다행스럽게도 C# 4.0에서는 이름을 직접 지정해야하도록 스펙을 구성하였습니다. y를 생략한채 함수를 호출하는 방법은 다음과 같이 3가지 방법이 있겠습니다.

M(1, z: 3); // z를 지정해서 전달
M(x: 1, z: 3); // x와 z를 지정해서 전달
M(z: 3, x: 1); // 순서를 바꾸는 것도 가능

정말 간단하죠? 추가적인 설명이 필요없을 정도로 간단한 방법으로 함수를 호출할 수 있겠네요~

여기까지는 C# 스펙에 나와있는 내용을 간추려서 정리한 것이구요. 다음은 제가 이 스펙의 내용을 보고 생각해볼 문제점들에 대해서 추가적으로 정리해 보았습니다. 여러분들은 어떻게 생각하시는지요?

1. 매개 변수의 이름이 중요하다.

이전까지는 함수 정의시에 매개 변수의 이름은 작성자와 사용자의 이해를 돕기 위한 것일뿐 실제로 코드 상에서는 어떠한 의미도 갖지 못했습니다. 하지만 Named Parameter가 적용되는 C# 4.0이후부터는 개발자들이 매개변수의 이름에도 주의를 해야할 것입니다. 지나치게 길어서 사용하기 불편해서도 안되며 실제로 사용되는 의미와 크게 벗어나는 이름을 만들지 않도록 주의해야 합니다. 심지어는 이로 인해 회사의 코드 규칙(Coding Rules)이 업데이트[각주:2] 되어야 할 수도 있겠네요.

2. 매개 변수 이름 변경이 어려워진다.

네, 그렇습니다. 매개 변수의 이름을 통해서 함수 호출이 가능하기 때문에, 매개 변수 이름을 바꾸면 관련된 코드를 모조리다 바꿔야 하겠습니다. 리팩토링 기법이 꼭 필요하겠네요. 어쩌면 이런 이유 때문에 Named Parameter를 사용하지 못하도록 코드 규칙을 만들어 둘수도 있겠군요. 항상 새로운 기술을 도입해야 할 필요는 없는 거니까요. 지나친 확장성으로 인해서 심각한 문제가 발생해서는 안될테니까요. 만약 서드파티 라이브러리라면 어떨까요? 매개 변수 이름에 좀더 신중을 기해야겠죠?
  1. C# 3.5 부터는 매개 변수에 기본값 설정이 가능해졌습니다. [본문으로]
  2. 이와 관련해서 Microsoft는 FxCop에 어떤 규칙을 추가할 수 있을것인지를 고민해 봐야할것 같습니다. [본문으로]