C#/C# 기본

[C#] 메서드

로파이 2021. 10. 5. 22:04

함수 매개변수에 사용가능한 ref/out 키워드

ref 키워드

- 참조 전달을 위해 사용할 수 있다.

namespace CSharpClass
{
    class Product
    {
        private int price = 100;

        public ref int GetPrice()
        {
            return ref price;
        }
    }
}

참조 인자로 반환할 경우 return의 반환 변수에도 ref 키워드를 붙여야한다.

    class Program
    {
        static void Main(string[] args)
        {
            Product carrot = new Product();

            // 참조 변수로 밖에서 값을 수정할 수 있다.
            ref int ref_local_price = ref carrot.GetPrice();
            // 지역 변수로 취급된다.
            int local_price = carrot.GetPrice();

            // 에러 : 값 형식을 참조 형식 변수에 초기화
            ref int ref_half_price = carrot.GetPrice();
            // 에러 : 참조 형식을 값 형식에 초기화
            int ref_half_price2 = ref carrot.GetPrice();
            
        }
    }
  • 함수를 참조 형식을 반환한다고 선언했을 지라도 밖에서 지역 변수로 초기화하면 지역 변수로 취급된다.
  • 외부에서도 참조 형식으로 받으려면 ref 키워드를 양쪽에 명식적으로 선언해야하며 총 4번이나 ref라는 키워드를 사용해야한다.
  • 한쪽이라도 참조 형식 짝이 맞지 않는 경우 컴파일 에러가 발생한다.

 

out 키워드

하나 이상의 함수의 반환 인자에 대해 명시적으로 선언할 때 사용한다.

        static void Divide(int x, int y, out int quotient, out int remainder)
        {
            quotient = x / y;
            remainder = x % y;
        }

ref 키워드를 사용하지 않는 이유

- out 키워드로 선언된 매개 변수는 반드시 함수 내에서 값을 할당해야한다. (컴파일 에러)

- 사용자의 실수로 값을 대입하지 않는 것을 방지

해당 매개 변수는 항상 지역 변수로 할당될 것이라는 보장이 있으므로 함수 외부에서 인라인 형태로 변수를 선언할 수 있다.

        static void Main(string[] args)
        {
            int x = 21;
            int y = 8;

            Divide(x, y, out int quotient, out int remainder);

            Console.WriteLine("{0:D}, {1:D}", quotient, remainder); // 2, 5

            Console.Read();
        }

미리 선언된 변수를 매개 변수로 전달할 수 있다. 대신 반드시 out 키워드를 명시해야한다.

int quotient = 0, remainder = 0;
Divide(x, y, out quotient, out remainder);

가변 인자 함수와 지역 함수

        static void Main(string[] args)
        {
            int sum = 0;

            Sum(1, 2, 3, 4, 5);
			
            // values는 int형 배열이다.
            void Sum(params int[] values)
            {
                for (int i = 0; i < values.Length; ++i)
                {
                    // 함수 내 지역변수를 참조할 수 있다.
                    sum += values[i];
                }
            }

            Console.WriteLine("Sum 1 ~ 5 : {0}", sum); // 15
            Console.Read();
        }
  • C#에서는 가변 개수를 가지는 매개 변수에 대한 함수를 선언할 수 있다.
  • params type[]의 선언으로 배열 형태로서 매개 변수에 전달된다.
  • 지역 함수는 함수내 정의된 함수로 지역 함수는 선언된 함수내의 지역 변수를 참조할 수 있다.
  • 구조상 지역 함수의 후 선언 선 호출이 가능하다.

명명된 인수를 통한 함수 호출

    class Program
    {
        static void PrintProfile(string name, string phone)
        {
            Console.WriteLine("Name : {0}, Phone : {1}", name, phone);
        }

        static void Main(string[] args)
        {
            PrintProfile(name: "강감찬", phone: "010-3241-5929");
            PrintProfile(phone: "010-2131-7779", name : "이성계");
            PrintProfile(name: "이순신", "010-3221-4572");
            PrintProfile("유관순", phone: "010-1223-8889");
            PrintProfile("윤봉길", "010-7321-0871");
            Console.Read();
        }
    }

함수에 명명된 인수로 인자를 전달하면, 선언된 매개 변수이름으로 값을 대응시킬 수 있다. 대응되는 매개 변수가 있다면 순서에 상관없이 대응되는 매개 변수로 전달된다.

'C# > C# 기본' 카테고리의 다른 글

[C#] 인터페이스와 추상 클래스  (0) 2021.10.07
[C#] 클래스  (0) 2021.10.06
[C#] 분기문  (0) 2021.10.02
[C#] 연산자  (0) 2021.10.02
[C#] 문자열  (0) 2021.10.02