C#과 Java언어 비교(10) - Parameter Modifiers
C# and JAVA 2007. 5. 29. 11:23http://genamics.com/developer/csharp_comparative_part9.htm
14. 파라미터
“ref” 파라미터
C#은(Java와는 반대로) 여러분이 파라미터를 참조로 전달할 수 있도록 해준다. 이러한 점을 보여주는 가장 극명한 사례는 바로 일반목적용 swap 메소드이다. C++과는 달리 여러분은 ref 파라미터를 받는 메소드를 호출할 때는 물론 선언할 때에도 지정해 주어야만 한다:
public class Test
{
public static void Main ()
{
int a = 1;
int b = 2;
swap (ref a, ref b);
}
public static void swap (ref int a, ref int b) {
int temp = a;
a = b;
b = temp;
}
}
“out” 파라미터
“out” 키워드라는 것도 있는데, 이것은 ref 파라미터
“params” 파라미터
params
public class Test
{
public static void Main () {
Console.WriteLine (add (1, 2, 3, 4).ToString());
}
public static int add (params int[] array) {
int sum = 0;
foreach (int i in array)
sum += i;
return sum;
}
}
여러분이 Java를 배울 때 가장 놀라게 되는 것 중의 하나는 값을 참조로 전달할 수 없다는 점이다. 이것은 여러분이
조금 지나서 이러한 기능을 사용할 필요성을 별로 느끼지 못하고, 또 그러한 기능을 사용하지 않는 코드를 작성하기
때문이다. 필자가 C#의 스펙을 처음으로 다루었을 때 종종 “왜 사람들이 이게 없으면 안된다고 할까? 나는 이것 없이도 코드를 작성할 수 있는데 말야”라고 생각하곤 했다. 조금 자기반성해 보자면, 나는 이러한 별로 유용하지 않은 기능을 제공하는 것이 진정한 논쟁거리가 아니라 여러분이 그것 없이 코드를 작성해 나갈 수 있느냐가 더 큰 논쟁거리임을 깨달았다.
여러분이 C++에서 했던 것을 생각해 보았을 때 Java가 파라미터를 전달하는 방법을 간소화 한 것은 매우 잘한 일이다. C++에서 메소드의 파라미터와 메소드 호출은 값이나 참조, 추가적으로 포인터를 가지는 것들로 전달되는데, 이것은 불필요하게 복잡한 코드로 만들 수 있다. C#은 메소드와 메소드 호출 둘 모두 명시적으로 참조에 의해 전달될 수 있도록 하며 이는 혼동을 대폭 줄여주어 Java의 목표와 동일한 목표를 달성할 수 있도록 해주는 반면 훨씬 더 풍부한 표현력을 제공해 준다. C#의 테마는 프로그래머가 어떠한 일을 수행하는 데 있어 빙빙 돌아서 해결해야 하는 상황으로 치닫지 않게끔 하는데 있다. “참조에 의한 전달” 문제를 극복하는 것을 제시하는 Java 튜토리얼을 떠올려 보면 여러분은 1개의 요소를 가진 배열이 여러분의 값을 갖도록 전달해야 할까, 아니면 다른 클래스가 그 값을 갖도록 해야 할까?