ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메서드 파라미터
    C# 2023. 3. 28. 00:00

    URL : http://www.csharpstudy.com/CSharp/CSharp-method.aspx

     

    C# 메서드 파라미터 - C# 프로그래밍 배우기 (Learn C# Programming)

    C# 메서드 클래스내에서 일련의 코드 블럭을 실행시키는 함수를 메서드라 부른다. 메서드는 0 ~ N개의 인수를 갖을 수 있으며, 하나의 리턴 값을 갖는다. 리턴 값이 없으면 리턴 타입을 void로 표시

    www.csharpstudy.com

     

    C# 메서드란?

     

    * 클래스내에서 일련의 코드 블럭을 실행시키는 함수를 메서드라고 부른다.

    * 메서드는 0 ~ N 개의 인수를 가질 수 있으며 하나의 리턴 값을 갖는다. 

    * 메서드는 public, private 같은 접근제한자를 리턴 타입 앞에 둘 수 있다.

     

    예시 ) 

    public int GetData(int a, string b, bool c)
    {
    }

    Pass by Value

     

    C#은 메서드에 인수를 전달할때 디폴트로 값을 복사해서 전달하는 Pass by Value 방식을 따른다. 

    만약 전달된 인수를 메서드 내에서 변경한다해도 메서드가 끝나고 함수가 리턴된 후, 전달되었던 인수의 값은 호출자에서 원래 값 그대로 유지된다.

    class Program
    {
    	private void Calculate(int a)
        {
        	a *= 2;
        }
        
        static void Main(string[] args)
        {
        	Program p = new Program();
            
            int val = 100;
            Console.WriteLine(val);
            p.Calculate(val);
            Console.WriteLine(val);
        }
    }

    ( val 변수값은 변하지 않음, 이는 메서드 에서 인자값을 복사해서 메서드안에서만 값이 변하고 블럭을 벗어나면 변화된 값이 스택메모리에서 사라지기 때문이다. )


    Pass by Reference

     

    메서드에 파라미터를 전달할때 레퍼런스(참조)로 전달하고자 하면 C# 키워드 ref 를 사용한다. 

    * ref를 사용할 경우 메서드 내에서 변경된 값은 리턴 후에도 유효하다. 

    * ref를 사용하려면 사전에 ref로 전달되는 변수가 초기화되어 있어야 한다.

     

    ref와 비슷한 기능을 하는것으로 out 키워드가 있다. 

    * out을 사용하는 파라미터는 메서드 내에서 그 값을 반드시 지정하여 전달하게 되있다.

    * ref는 해당 변수가 사전에 초기화되어야 하지만, out은 사전에 변수를 초기화할 필요는 없다. 

     

    예시)

    // ref 정의
    static double GetData(ref int a, ref double b)
    { return ++a * ++b }
    
    // out 정의
    static bool GetData(int a, int b, out int c, out int d)
    {
    	c = a + b;
        d = a - b;
        return true;
    }
    
    static void Main(string[] args)
    {
    	// ref 사용, 초기화 필요
        int x = 1;
        double y = 1.0;
        double ref = GetData(ref x, ref y);
        
        // out 사용, 초기화 불필요
        int c, d;
        bool bret = GetData(10, 20, out c, out d);
    }

     

    아래는 C# 버전에 따라 추가되는 기능들이다. 참고하면 좋을것 같다. 


    C# 4.0 : Named 파라미터

     

    메서드에 파라미터를 전달할 때, 일반적으로 파라미터 위치에 따라 순차적으로 파라미터가 넘겨지는데 C# 4.0 부터는 위치와 상관없이 파라미터명을 지정하여 파라미터를 전달할 수 있게 된다. 

    이러한 파라미터를 Named Parameter라고 부른다.

    Method1 (name : "John", age : 10, score : 90);

    C# 4.0 : Optional 파라미터

     

    C# 4.0에서부터 어떤 메서드의 파라미터가 디폴트 값을 갖고 있다면, 메서드 호출 시 이러한 파라미터를 생략하는 것을 허용하였다. 이렇게 디폴트 값을 가진 파라미터를 C#에서는 Optional 파라미터라 부른다.

    Optional 파라미터는 반드시 파라미터들 중 맨 마지막에 놓여 있어야 한다. 

    2개 이상의 Optional 파라미터가 있는경우 반드시 Optional 이 아닌 파라미터들뒤에 위치해야한다.

     

    class Program
    {
    	// Optional Parameter : calcType
        int Calc(int a, int b, string calcType = "+")
        {
        	switch(calcType)
            {
                case "+":
                	return a + b;
                case "-":
                	return a - b;
                case "*":
                	return a * b;
                case "/":
                	return a / b;
                default:
                	throw new ArithmeticException();
            }
        }
        
        static void Main(string[] args)
        {
        	Program p = new Program();
            int ret = p.Calc(1, 2);
            ret = p.Calc(1, 2, "*");
        }
    }

    C# params

     

    일반적으로 메서드의 파라미터 갯수는 고정되어 있다. 하지만 어떤 경우는 파라미터의 갯수를 미리 알 수 없는 경우도 있는데, 이런 경우 C# 키워드 params를 사용한다. 이 params 키워드는 가변적인 배열을 인수로 갖게 해주는데, 파라미터들 중 반드시 하나만 존재해야 하며, 맨 마지막에 위치해야 한다.

     

    // Method
    int Calc(params int[] values)
    
    // Use
    int s = Calc(1, 2, 3, 4);
    s = Calc(6, 7, 8, 9, 10, 11);

    댓글

Designed by Tistory.