본문 바로가기
C#/Basic Syntax

[C#] 8. 함수

by 가든가든 2022. 9. 29.
728x90

함수

프로그래밍을 하다 보면 같은 유형의 코드를 반복할 때가 많다. 이 코드들을 매번 입력하면 불편하고 입력하다 실수도 할 수 있습니다. 이때 ‘함수’를 사용합니다.

함수의 종류(내장 함수와 사용자 정의 함수)

  • 내장함수
    • 내장 함수는 C#이 자주 사용하는 기능을 미리 만들어서 제공하는 함수로, 특정 클래스의 함수로 표현됩니다.
    • 문자열 관리 함수, 날짜 및 시간 관련 함수, 수학 관련 함수, 형식 변환 관련 함수 등으로 이러한 내장 함수를 API(Application Programming Interface)로 표현합니다.
  • 사용자 정의 함수
    • 프로그래머가 필요할 때마다 새롭게 기능을 추가하여 사용하는 함수

함수를 만들고 호출하여 사용하기

using System;

namespace Day7
{
    class Day7
    {
        static void Show()
        {
            Console.WriteLine("Hello World");
        }
        static void Main()
        {
            Show();
        }
    }
}

 

💡 Result
Hello World

 

매개변수가 있는 함수

using System;

namespace Day7
{
    class Day7
    {
        static void ShowMessage(string message) // 매개변수가 있는 함수
        {
            Console.WriteLine(message); //넘어온 매개변수 값을 출력
        }
        static void Main()
        {
            ShowMessage("매개변수");    //ShowMessage() 함수에 "매개변수" 문자열 전달
            ShowMessage("Parameter");    //ShowMessage() 함수에 "Parameter" 문자열 전달
        }
    }
}

 

💡 Result
매개변수

Parameter

 

반환값이 있는 함수

함수의 여러 가지 특징 중 하나인 반환값(return value)은 함수에서 어떤 처리를 진행한 후 그 결과를 다시 함수를 호출한 부분으로 되돌려 주는 것을 의미합니다.

using System;

namespace Day7
{
    class Day7
    {
        static string GetString()
        {
            return "반환값 드릴게요"; // return으로 단순 문자열 반환
        }
        static void Main()
        {
            String ReturnValue = GetString(); // 함수 호출 / 반환값을 ReturnValue 값에 저장
            Console.WriteLine(ReturnValue); 
        }
    }
}

 

💡 Result
반환값 드릴게요

 

정수형 반환값이 있는 함수 만들고 사용

using System;

namespace Day7
{
    class Day7
    {
        static int Calculation(int x, int y) //입력 매개변수
        {
            int i = x * y;
            return i; //반환값
        }
        static void Main()
        {
            int result = Calculation(2, 4); // result = 2 * 4
            Console.WriteLine(result);
        }
    }
}

 

 

💡 Result
8

 

응용

//FunctionValue.cs
using System;

namespace N_FunctionValue
{
    internal class FunctionValue
    {
        static int Result(int x, int y) //Result에서 3, 5 전달 받음
        {
            int i = x * y;
            return i; //반환값
        }
        public void Calculation(int a, int b) // 3, 5 각각 입력 받음
        {
            int result = Calculation(a, b);
            Console.WriteLine(result);
        }
    }
}
//Day7_Main.cs << 실행 cs 파일
using System;
using N_FunctionValue;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            FunctionValue functionValue = new FunctionValue();
            functionValue.Result(3, 5);
        }
    }
}

 

💡 Result
15

 

함수를 사용하여 큰 값과 작은 값, 절댓값 구하기

//Day7_Main.cs << 실행 cs 파일
using System;
using N_FunctionValue;
using N_MaxMin;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            MaxMin maxMin = new MaxMin();
            
            Console.WriteLine("최댓값은 : " + maxMin.Max(55, 80));
            Console.WriteLine("최솟값은 : " + maxMin.Min(75, 50));
        }
    }
}
using System;

namespace N_MaxMin
{
    internal class MaxMin
    {
        public int Max(int x, int y)
        {
            return x > y ? x : y; //3항 연산자
        }
        public int Min(int x, int y)
        {
            if (x < y)
            {
                return x;
            } else
            {
                return y;
            }
        }
    }
}

 

💡 Result
최댓값은 : 80

최솟값은 : 50

 

기본 매개변수

매서드를 선언할 때 매개변수를 선언과 동시에 초기화해 놓으면, 매서드를 호출할 때 매개변수를 지정하지 않아도 기본값으로 자동 설정합니다. 이 기능을 기본 매개변수(default parameter) 또는 선택적 인수(optional argument) 라고 합니다.

//DefaultParameter.cs
using System;

namespace N_DefaultParameter
{
    internal class DefaultParameter
    {
        public void DefaultParameterEx(string name, int age = 27) 
				//age 매개변수 선언과 동시에 초기화
        {
            Console.WriteLine($"나의 이름은 {name}이며, 나이는 {age}살 입니다.");
        }
    }
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            DefaultParameter defaultParameter = new DefaultParameter();
            defaultParameter.DefaultParameterEx("이정원", 50); 
						//할당된 값 출력
            defaultParameter.DefaultParameterEx("이정원"); 
						//입력하지 않아도 초기화 되어 있는 값 출력
        }
    }
}

 

💡 Result
나의 이름은 이정원이며, 나이는 50살 입니다.
나의 이름은 이정원이며, 나이는 27살 입니다.

 

명명된 매개변수

using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            DefaultParameter defaultParameter = new DefaultParameter();
            defaultParameter.DefaultParameterEx("이정원", 50); //할당된 값 출력
            defaultParameter.DefaultParameterEx("이정원"); //입력하지 않아도 초기화 되어 있는 값 출력
            Console.WriteLine();
            defaultParameter.DefaultParameterEx(age : 111, name : "가든가든"); 
						//명명된 매개변수
        }
    }
}

 

 

💡 Result
나의 이름은 이정원이며, 나이는 50살 입니다.

나의 이름은 이정원이며, 나이는 27살 입니다.
나의 이름은 가든가든이며, 나이는 111살 입니다.

매개변수 이름을 지정하면 변수 위치 변경도 가능합니다!

 

함수 오버로드 : 다중 정의

클래스 하나에 매개변수를 달리해서 이름이 동일한 함수 여러 개를 정의할 수 있는데, 이를 함수 오버로드라고 합니다. 우리말로는 함수 ‘다중 정의’, 즉 여러 번 정의한다는 의미입니다.

using System;

namespace N_MethodOverload
{
    internal class MethodOverload
    {
        public void MethodOverloadEx(int age)
        {
            Console.WriteLine("함수는 같지만 매개변수 타입은 (int)" + age);
        }
        public void MethodOverloadEx(long age)
        {
            Console.WriteLine("함수는 같지만 매개변수 타입은 (long)" + age);
        }
    }
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
using N_MethodOverload;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            MethodOverload methodOverload = new MethodOverload();
            methodOverload.MethodOverloadEx(27);
            methodOverload.MethodOverloadEx(27L);
        }
    }
}

 

💡 Result
함수는 같지만 매개변수 타입은 (int)27
함수는 같지만 매개변수 타입은 (long)27

 

매개변수가 없거나 있는 함수 오버로드

using System;

namespace N_MethodOverload
{
    internal class MethodOverload
    {
        //매개변수가 없거나 있는 함수 오버로드
        public void hello()
        {
            Console.WriteLine("넌 이름이 없구나");
        }
        public void hello(string name)
        {
            Console.WriteLine($"너의 이름은 {name}이구나");
        }
				public void hello(string name, int age)
        {
            Console.WriteLine($"너의 이름은 {name}이고, 나이는 {age}살 이구나!");
        }
    }
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
using N_MethodOverload;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            MethodOverload methodOverload = new MethodOverload();
            methodOverload.hello("이정원");
            methodOverload.hello();
						methodOverload.hello("가든", 27);
        }
    }
}

 

💡 Result
너의 이름은 이정원이구나
넌 이름이 없구나
너의 이름은 가든이고, 나이는 27살 이구나!

 

재귀 함수

함수에서 함수 자신을 호출하는 것을 재귀(recursion) 또는 재귀 함수라고 합니다.

팩토리얼 구하기 예제

using System;

namespace N_Recursion
{
    internal class Recursion
    {
        public void RecursionMain()
        {
            Console.WriteLine(4 * 3 * 2 * 1);
            Console.WriteLine(FactorialEx1(4));
            Console.WriteLine(FactorialEx2(4));
            Console.WriteLine(FactorialEx3(4));
        }

        //재귀 함수를 활용한 3항 연산자 사용
        static int FactorialEx1(int n)
        {
            
            return (n > 1) ? n * FactorialEx1(n - 1) : 1;
        }

        //재귀 함수를 활용한 트리 구조 사용 (재귀 함수는 트리구조에 유리함)
        static int FactorialEx2(int n)
        {
            if (n == 1 || n == 0)
            {
                return 1;
            }
            return n * FactorialEx2(n - 1);
        }

        //단순한 팩토리얼 방식에 유용
        static int FactorialEx3(int n)
        {
            int result = 1;
            for (int i = 1; i <= n; i++)
            {
                result *= i;
            }
            return result;
        }
    }
}

함수 범위 : 전역 변수와 지역 변수

클래스와 같은 레벨에서 선언된 변수를 **전역 변수(global variable) 또는 필드(field)**라고 하며, 함수 레벨에서 선언된 변수를 **지역 변수(local variable)**이라고 합니다.

이때 동일한 이름으로 변수를 전역변수와 함수 내의 지역변수로 선언할 수 있습니다.

using System;

namespace N_FunctionScope;

internal class FunctionScope
{
    static string message = "전역변수 메세지"; //클래스 레벨

    static void showmessage()
    {
        string message = "지역변수 메세지"; //함수 레벨 (함수 안에서 선언시 지역변수)
        Console.WriteLine(message); //지역 변수 출력
    }

    public void FunctionScopeMain()
    {
        showmessage(); //지역 변수 출력
        Console.WriteLine(message); //전역 변수 출력
    }
}
using System;
using N_FunctionScope;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            FunctionScope functionScope = new FunctionScope();
            functionScope.FunctionScopeMain();

        }
    }
}

화살표 함수 : =>

화살표 모양의 연산자인 화살표 연산자(=>)를 사용하여 메서드 코드를 줄일 수 있습니다. 이를 화살표 함수(arrow function)라고 합니다.

화살표 함수 사용하기

using System;

namespace N_ArrowFunction
{
    internal class ArrowFunction
    {
        public void ArrowMain()
        {
            Hi();
            Multiply(13, 14);

            Console.WriteLine(YesOrNo(1, 2));
            InputParameter("hello~");
        }

        static void Hi() => Console.WriteLine("안녕하세요");
        static void Multiply(int a, int b) => Console.WriteLine(a + b);

        static bool YesOrNo(int A, int B) => A == B;
        static void InputParameter(string message) => Console.WriteLine(message);
    }
}
using System;
using N_ArrowFunction;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
						ArrowFunction arrowFunction = new ArrowFunction();
            arrowFunction.ArrowMain();

        }
    }
}

 

💡 Result
안녕하세요
27
False
hello~

 

로컬 함수

C# 7.0 버전부터는 로컬 함수(local function) 기능을 제공합니다. 로컬 함수는 함수 내에서만 사용하는 또 다른 함수를 만드는 것입니다. 특정 함수 내에서만 사용하는 또 다른 함수를 로컬 함수라고 합니다.

Demo 예제

using System;

namespace N_LocalFunction
{
    internal class LocalFunction
    {
        internal void LocalMain()
        {
            Hello();
        }
        
        void Hello()
        {
            Console.WriteLine("Hello");
        }
    }
}
using System;
using N_LocalFunction;

namespace Day7
{
    class Day7
    {
        static void Main(string[] args)
        {
            LocalFunction localFunction = new LocalFunction();
            localFunction.LocalMain();

        }
    }
}

 

💡 Result
Hello

 

로컬 함수에 화살표 연산자 사용하기

using System;

namespace N_LocalFunction
{
    internal class LocalFunction
    {
        internal void LocalMain()
        {
            Hello();
            int AddResult = Add(10, 20);
            decimal SubtractResult = Subtract(2.22M, 1.11M);

            Console.WriteLine(AddResult);
            Console.WriteLine(SubtractResult);
            
        }
        
        void Hello()
        {
            Console.WriteLine("Hello");
        }

        int Add(int a, int b) => a + b;
        decimal Subtract(decimal x, decimal y) => x - y;
    }
}
💡 Result
Hello 30
1.11

 

728x90

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

[C#] 10. 구조체 사용하기  (0) 2022.10.22
[C#] 09. 닷넷 API 사용하기  (0) 2022.10.22
[C#] 7. 배열  (1) 2022.09.22
[C#] 6. 제어문 if/else, switch, for, while, foreach 등  (0) 2022.09.20
[C#] 5. 연산자  (0) 2022.09.19