본문 바로가기
ETC/C#

메소드 / 가변길이 매개 변수 / 로컬 함수

by 빡구동동 2021. 1. 20.

메소드 / 가변길이 매개 변수 / 로컬 함수 


출력 전용 매개 변수

out : 출력 전용 매개 변수

대개 메소드의 결과는 하나면 충분하다.

그러나 두 개 이상의 결과를 요구하는 특별한 메소드도 있다.

 

ref 키워드를 사용해도 되지만 out 키워드를 사용하면 좀 더 안전한 방법으로 똑같은 일을 할 수 있다.

 

 // out : 출력 전용 매개 변수
        static void Divide(int a, int b, out int quotient, out int remainder)
        {
            quotient = a / b;
            remainder = a % b;
        }
        static void Main(string[] args)
        {
            int a = 20;
            int b = 3;
            // int c; int d; 출력 전용 매개 변수는 메소드를 호출하기 전에 미리 선언할 필요가 없다
            // 호출할 때 매개 변수 목록 안에서 즉석으로 선언하면 됨
            Divide(a, b, out int c, out int d);

            Console.WriteLine($"quotient : {c}, remainder = {d}");

            a = 40; b = 8;
            Divide(a, b, out c, out d);
            Console.WriteLine($"quotient : {c}, remainder = {d}");
        }

  안전한 이유는?

ref 키워드를 이용해서 매개 변수를 넘기는 경우엔 메소드가 해당 매개 변수에 결과를 저장하지 않아도 컴파일러는 아무런 경고를 하지 않음.

그러나 out 키워드를 사용하면 매개 변수를 넘길 때는 메소드가 해당 매개 변수에 결과를 지정하지 않으면 컴파일러가 에러 메시지를 출력함.

 


메소드 오버로딩

하나의 메소드 이름에 여러 개의 구현을 올릴 때 사용

class Program
    {
        //함수 1번
        static int Plus(int a, int b)
        {
            return a + b;
        }
        //함수 2번
        static int Plus(int a, int b, int c)
        {
            return a + b + c;
        }
        //함수 3번
        static double Plus(double a, double b)
        {
            return a + b;
        }
        //함수 4번
        static double Plus(int a, double b)
        {
            Console.WriteLine("Calling Plus(int, double)");
            return a + b;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Plus(1, 2));
            Console.WriteLine(Plus(1, 2, 3));
            Console.WriteLine(Plus(1.0, 2.4));
            Console.WriteLine(Plus(1, 2.4));        
//'묵시적 형변환'이 일어나서 함수 3번으로도 가능
        }
    }

가변길이 매개 변수

개수가 유연하게 변할 수 있는 매개 변수

예를 들면 입력되는 모든 매개 변수의 합을 구하는 메소드를 오버로딩하지 않고도 구현할 수 있다.

params 키워드 + 배열을 사용해서 선언

       // 가변길이 매개변수 params & 배열조합
static int Sum(params int[] args)
        {
            int sum = 0;
            for (int i = 0; i < args.Length; i++)
            {
                sum += args[i];
            }
            return sum;
        }
        
static void Main(string[] args)
        {
            int sum = Sum(3, 4, 5, 6, 7, 8, 9, 10);
            Console.WriteLine($"Sum : {sum}");
        }

메소드 오버로딩 vs 가변길이 매개 변수

메소드 오버로딩매개 변수의 수뿐 아니라 형식이 다른 경우에 사용 가능

또한 매개 변수의 개수가 유연하게 정해져 있다면 가변길이 매개 변수보다는 메소드 오버로딩을 사용하는 게 적절

 

한편 가변길이 매개 변수형식은 같으나 매개 변수의 개수만 유연하게 달라질 수 있는 경우에 적합

 


로컬 함수

로컬 함수는 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 함수

클래스의 멤버가 아니기 때문에 메소드가 아니라 함수(function)라고 부름

로컬 함수는 자신이 존재하는 지역에 선언되어 있는 변수를 사용할 수 있음

 

* 로컬 함수는 메소드 밖에서는 다시 쓸 일 없는 반복적인 작업을 하나의 이름 아래 묶어 놓는 데 제격

 

        // 로컬 함수, 클래스의 멤버가 아니기 때문에 메소드가 아니라 함수로 불림
        // 대문자 -> 소문자 만들기
        static string ToLowerString(string input)
        {
            var arr = input.ToCharArray();
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = ToLowerChar(i);
            }

            char ToLowerChar(int i)
            {
                if (arr[i] < 65 || arr[i] > 90)
                    return arr[i];
                else
                    return (char)(arr[i] + 32);
            }
            return new string(arr);
        }    
        static void Main(string[] args)
        {
            Console.WriteLine(ToLowerString("Hello!"));  
            Console.WriteLine(ToLowerString("Good Morning."));  
        }

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

객체 지향 / 클래스 / 정적 필드  (0) 2021.01.20
매개 변수 / 참조 지역 변수  (0) 2021.01.18
데이터를 가공하는 연산자  (0) 2021.01.11
C# 문자열 다루기  (0) 2021.01.10
C# 데이터 보관하기 (3)  (0) 2021.01.10

댓글