2 분 소요

이 글은 한빛미디어의 이것이 C#이다를 보고 헷갈리는 부분 위주로 정리한 글입니다.

메소드

일련의 코드를 하나의 이름안에 묶어둔 것

참조에 의한 매개변수 전달

  • ref키워드를 사용하여 매개변수를 참조형으로 넘겨줄 수 있음
  • 메소드의 매개변수와 넘겨주는 인수에 모두 ref키워드를 써야함

ex)

public static void A(ref int i) // ref 사용
    {
        i = i + 10000;
    }
    static void Main(string[] args)
    {
        int a = 0;
        A(ref a); // ref 사용
        Console.WriteLine(a); // 10000이 출력
    }

값 형인 int형 변수 a를 인수로 넘겨줬으나 ref키워드로 인해 a의 값 자체만 넘어간 것이아닌 a가 직접 메소드에 들어갔다 나옴

메소드의 결과를 참조로 반환하기

  • ref 키워드를 이용해 메소드를 선언
  • return으로 반환하는 변수앞에 ref키워드 사용
  • 위 두가지만 하면 일반적인 함수와 다르지 않지만 지역변수에 리턴값을 참조로 담고싶다면 지역변수와 호출할 메소드 앞에 ref를 붙여야함

ex)

class Product
    {
        int price = 0;

        public ref int GetPrice() //ref사용
        {
            return ref price; //ref사용
        }
    }

    static void Main(string[] args)
    {
        Product carrot = new Product();
        ref int refPrice = ref carrot.GetPrice(); //ref사용
        refPrice = 500; // 지역 변수를 수정했으나 carrot객체의 price가 바뀜
        Console.WriteLine(carrot.GetPrice()); // 500출력
    }

위 코드처럼 클래스 안의 필드 변수를 클래스 밖으로 끄집어 낼 수 있다.

출력 전용 매개변수

반환값은 보통 return을 통해 하나만 반환해줄 수 있다.

하지만return을 사용하지 않고 반환해줄 수 있는 방법이 있는데 바로 out키워드를 사용하는 것이다

ref를 통한 참조 매개변수 전달과 거의 같지만 out키워드를 사용하면

함수 내에서 무조건 out키워드가 적용된 변수에 값이 대입되어야 한다.

  • 매개 변수에 out키워드 사용
  • 넘겨주는 인수도 out을 사용
  • 무조건 메소드 내에서 값이 대입되어야 함 (그렇지 않으면 오류 발생)

ex)

class OutClass
    {
        public static int SetNum(out int a) //out 사용
        {
            a = 1;
            return 2;
        }
    }
    static void Main(string[] args)
    {
        int outNum;
        int b = OutClass.SetNum(out outNum); // out 사용
        Console.WriteLine($"{outNum} {b}"); //출력 1 2
    }

위 코드에서 메소드 하나로 return을 통해서와 out를 사용해서 두 가지 값을 반환 받았다.

메소드 오버로딩 overloading

  • 하나의 메소드 이름에 여러 개의 구현을 올리는 것.
  • 같은 이름의 메소드지만 가지각색의 매개변수를 받을 수 있고 받는 매개변수에 따라 다르게 동작하도록 구현할 수 있음.

Console.WriteLine()도 대표적인 오버로딩의 예로 볼 수 있다. 1

class OverLoadingClass
    {
        public static int Sum(int a, int b)
        {
            return a + b;
        }
        public static float Sum(float a, float b)
        {
            return a + b;
        }
    }
    static void Main(string[] args)
    {
        int a = OverLoadingClass.Sum(10, 5); 
        float b = OverLoadingClass.Sum(10.0f, 5.0f);
    }

가변 개수의 인수

  • 인수의 개수 만 다를 경우 사용가능
  • 오버로딩이 개수나 형식이 다를 때 사용한다면 이것은 개수만 다를 때 사용하는 방법
  • params 키워드를 사용

ex)

		static void Add(params int[] args)
    {
        int sum = 0;
        for (int i = 0; i < args.Length; i++)
        {
            sum += args[i];
        }
        Console.WriteLine($"숫자의 합은 {sum} 이다");
    }
    static void Main(string[] args)
    {
        Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 7, 8, 9, 4, 5); //출력 결과 숫자의 합은 78이다
    }

명명된 인수

  • 함수를 호출할 때 순서에 따라 인수를 대입하는 것이 아닌 직접 : 을 통해 원하는 매개변수에 인수를 대입할 수 있다.
  • 작성은 더 귀찮으나 코드를 읽기 훨신 좋아짐
static void PrintMethod(int print, int noPrint)
    {
        Console.WriteLine(print);
    }
    static void Main(string[] args)
    {
        PrintMethod(noPrint: 0, print: 50); //출력 50
    }

선택적 인수

  • 메소드의 매개변수가 기본값을 가지는 것
  • 메소드를 선언하면서 매개변수의 초기화하듯이 값을 넣어줄 수 있음.
static int Add(int a, int b = 50)
    {
        return a + b;
    }
    static void Main(string[] args)
    {
        Console.WriteLine(Add(5)); // 출력 55
    }

위 코드처럼 매개변수는 2개지만 b가 기본값을 가지기에 a만 넣어줘도 된다.

로컬 함수

  • 메소드 안에서 선언되어, 메소드 안에서만 쓰이는 함수
static int calc(int a, int b)
    {
        return Add(a,b);
        int Add(int a, int b) // 로컬 함수
        {
            return a + b;
        }
    }
    static void Main(string[] args)
    {
        Console.WriteLine(calc(1, 2)); //출력 3
    }

태그:

카테고리:

업데이트:

댓글남기기