C#과 Java언어 비교(10) - Parameter Modifiers

C# and JAVA 2007. 5. 29. 11:23

http://genamics.com/developer/csharp_comparative_part9.htm


14.
파라미터 한정자(Parameter Modifiers)

 “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 파라미터 한정자 그대로 구현한 것이다. ref 한정자가 값이 메소드에 전달되기 전에 확실히 할당되어야 하는데 반해 out 한정자 리턴하기 전에 메소드의 구현이 확실히 파라미터에 값을 할당할 것을 필요로 한다.

“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개의 요소를 가진 배열이 여러분의 값을 갖도록 전달해야 할까, 아니면 다른 클래스가 값을 갖도록 해야 할까?

: