본문 바로가기
카테고리 없음

메서드와 함수

by 오 복 이 2024. 11. 11.

메서드는 프로그램의 기능을 구성하는 핵심 요소로, 코드를 재사용하고 구조화하는 데 매우 유용합니다. 이 글에서는 메서드 선언과 호출, 매개변수 전달 방식, 메서드 오버로딩, 재귀에 대해 자세히 살펴보겠습니다.


메서드 선언과 호출

메서드는 특정 작업을 수행하는 코드 블록으로, 반환 타입, 메서드 이름, 매개변수 목록으로 구성됩니다. 메서드는 호출되었을 때 실행되며, 결과를 반환할 수도 있습니다.

메서드 선언 형식

반환타입 메서드이름(매개변수 목록)
{
    // 메서드 내부 코드
    return 값; // 반환타입이 있을 경우 반환
}

메서드 선언과 호출 예제

using System;

class Program
{
    // 두 수를 더하는 메서드 선언
    static int Add(int x, int y) // int 타입을 반환하는 메서드, 매개변수로 x와 y를 받음
    {
        int sum = x + y; // 두 수를 더한 결과를 sum에 저장
        return sum; // 결과 반환
    }

    static void Main()
    {
        // 메서드 호출
        int result = Add(10, 20); // Add 메서드를 호출하고 결과를 result에 저장
        Console.WriteLine($"두 수의 합: {result}"); // 출력: 두 수의 합: 30
    }
}

💡 Main 메서드는 프로그램의 시작점이므로, 다른 메서드들은 Main 메서드에서 호출됩니다. static 키워드는 현재 클래스의 인스턴스 생성 없이도 메서드를 호출할 수 있게 합니다.


 

매개변수 전달 방식

메서드에 값을 전달하는 방식은 값 전달, 참조 전달, out 키워드를 사용한 전달 방식이 있습니다.

값 전달 (Pass by Value)

기본적으로 C#에서 매개변수는 값으로 전달됩니다. 이는 호출된 메서드에서 해당 매개변수의 값이 변경되더라도 원본 값은 유지된다는 뜻입니다.

static void ChangeValue(int number)
{
    number = 100; // number 값을 변경
    Console.WriteLine($"메서드 내의 값: {number}"); // 출력: 100
}

static void Main()
{
    int myNumber = 50;
    ChangeValue(myNumber); // 메서드 호출 시 값 전달
    Console.WriteLine($"메서드 호출 후 값: {myNumber}"); // 출력: 50 (원본 값은 변하지 않음)
}

참조 전달 (Pass by Reference)

참조 전달은 ref 키워드를 사용하여 원본 변수의 참조를 전달합니다. 이 경우 메서드 내부에서 값을 변경하면 원본 변수의 값도 변경됩니다.

static void ChangeValue(ref int number)
{
    number = 100; // number의 참조된 원본 값 변경
}

static void Main()
{
    int myNumber = 50;
    ChangeValue(ref myNumber); // ref 키워드로 참조 전달
    Console.WriteLine($"메서드 호출 후 값: {myNumber}"); // 출력: 100 (원본 값이 변경됨)
}

out 키워드

out 키워드는 메서드가 반환할 수 있는 추가적인 출력을 전달할 때 사용됩니다. out 매개변수는 메서드 내부에서 값을 설정해야 하며, 초기화 없이 호출할 수 있습니다.

static void GetValues(out int number1, out int number2)
{
    number1 = 10; // out 매개변수에 값 설정
    number2 = 20;
}

static void Main()
{
    int x, y; // 초기화 없이 선언 가능
    GetValues(out x, out y); // out 키워드로 전달
    Console.WriteLine($"첫 번째 값: {x}, 두 번째 값: {y}"); // 출력: 첫 번째 값: 10, 두 번째 값: 20
}

💡 out 키워드는 함수에서 여러 개의 값을 반환하고 싶을 때 유용합니다. 값이 여러 개인 경우 Tuple이나 out을 사용하는 것이 일반적입니다.


메서드 오버로딩

메서드 오버로딩이란 같은 이름의 메서드를 여러 개 정의하는 것으로, 매개변수의 타입이나 개수로 메서드를 구분할 수 있습니다. 오버로딩을 사용하면 다양한 방식으로 메서드를 호출할 수 있습니다.

메서드 오버로딩 예제

class Program
{
    // 정수형 매개변수를 받는 Add 메서드
    static int Add(int x, int y)
    {
        return x + y;
    }

    // 실수형 매개변수를 받는 Add 메서드 (오버로딩)
    static double Add(double x, double y)
    {
        return x + y;
    }

    static void Main()
    {
        int intResult = Add(10, 20); // 정수형 Add 호출
        double doubleResult = Add(2.5, 3.5); // 실수형 Add 호출

        Console.WriteLine($"정수형 덧셈 결과: {intResult}"); // 출력: 정수형 덧셈 결과: 30
        Console.WriteLine($"실수형 덧셈 결과: {doubleResult}"); // 출력: 실수형 덧셈 결과: 6.0
    }
}

💡 메서드 오버로딩은 다양한 데이터 타입과 상황에 맞게 메서드를 호출할 수 있도록 해 줍니다. 단, 매개변수의 타입이나 개수가 달라야 하며, 리턴 타입만 다르게 설정하는 것은 오버로딩이 아닙니다.


재귀 (Recursion)

재귀는 메서드가 자기 자신을 호출하는 방식입니다. 재귀는 반복문을 사용하지 않고도 반복적인 작업을 수행할 수 있게 해주며, 특정 문제(예: 팩토리얼 계산, 피보나치 수열 계산 등)에 유용하게 사용됩니다. 단, 재귀에는 종료 조건이 반드시 필요합니다. 종료 조건이 없으면 무한히 반복되어 스택 오버플로우 오류가 발생할 수 있습니다.

재귀를 사용한 팩토리얼 계산 코드

팩토리얼 계산은 자연수 n에 대해 n! = n * (n-1) * (n-2) * ... * 1로 정의됩니다. 예를 들어 5!는 5 * 4 * 3 * 2 * 1 = 120입니다.

using System;

class Program
{
    // 재귀를 이용한 팩토리얼 계산 메서드
    static int Factorial(int n)
    {
        // 종료 조건: n이 1이면 1 반환
        if (n <= 1)
            return 1;
        else
            return n * Factorial(n - 1); // 자기 자신을 호출하여 n-1 값을 곱함
    }

    static void Main()
    {
        int number = 5;
        int result = Factorial(number); // Factorial 메서드 호출
        Console.WriteLine($"{number}! = {result}"); // 출력: 5! = 120
    }
}

재귀를 사용한 피보나치 수열 코드

피보나치 수열은 각 항이 이전 두 항의 합인 수열로, 재귀적으로 정의할 수 있습니다. 예를 들어, 0, 1, 1, 2, 3, 5, 8...이 피보나치 수열입니다.

using System;

class Program
{
    // 재귀를 이용한 피보나치 수열 계산 메서드
    static int Fibonacci(int n)
    {
        // 종료 조건: n이 0 또는 1일 때 각각 n 반환
        if (n <= 1)
            return n;
        else
            return Fibonacci(n - 1) + Fibonacci(n - 2); // 피보나치 수열 계산
    }

    static void Main()
    {
        int number = 6;
        int result = Fibonacci(number); // Fibonacci 메서드 호출
        Console.WriteLine($"피보나치 수열의 {number}번째 항: {result}"); // 출력: 피보나치 수열의 6번째 항: 8
    }
}

💡 재귀는 간결하고 이해하기 쉽지만, 반복적으로 함수가 호출되어 성능에 영향을 줄 수 있습니다. 피보나치 수열과 같은 경우에는 메모이제이션 기법을 이용하거나 반복문을 사용하는 것이 성능 면에서 유리할 수 있습니다.

728x90
반응형