전체 코드

namespace CSharp
{
    internal class Program
    {
        // 클래스 안에 있어야 한다.
        // Method Function Procedure
        // 메소드 함수
        //한정자 반환형식 이름(매개변수)
        //{

        //}
        // 덧셈 함수
        static int Add(int a, int b)
        {
            int result = a + b;
            return result;
        }
        // 복사와 참조
        // 
        //static void AddOne(int number)// 복사 
        //{
        //    number = number + 1;
        //}

        static void AddOne(ref int number)// 복사 
        {
            number = number + 1;
        }

        static void HelloWorld()
        {
            Console.WriteLine("HelloWorld");
        }
        static void Main(string[] args)
        {
            HelloWorld();
            //int a = 4;
            //int b = 5;
            //int result = Program.Add(a, b);
            int a = 0;
            Program.AddOne(ref a);
            Console.WriteLine(a);

        }
    }
}

아래는 제공해주신 코드와 설명 내용을 바탕으로 C#에서 함수(메소드)의 기본 사용법, 값 복사(Call by Value)와 참조 전달(Call by Reference)의 개념, 그리고 디폴트 매개변수에 대해 자세하게 정리한 내용입니다.


1. 함수(메소드)의 기본 사용법

함수(메소드)가 필요한 이유

  • 코드 재사용성: 특정 기능이나 연산(예: 덧셈, 사칙연산, 구구단 등)을 하나의 함수로 정의해두면 여러 곳에서 반복 사용 가능
  • 가독성 향상: 복잡한 로직을 함수 단위로 나누어 코드를 모듈화하면 전체적인 코드의 이해가 쉬워짐
  • 유지보수 용이: 기능별로 코드를 분리하면 수정이나 확장이 필요할 때 영향을 받는 부분만 변경하면 됨

기본적인 메서드 정의 형식

static 반환형식 메서드이름(매개변수목록)
{
    // 함수 내부의 로직
}
  • 한정자: public, private, internal 등 접근 제한자를 지정
  • 반환형식: 함수가 반환하는 데이터의 타입(반환할 값이 없다면 void 사용)
  • 매개변수: 함수에 전달되는 값들

예를 들어, 두 수의 덧셈을 수행하는 함수는 아래와 같이 정의할 수 있습니다.

static int Add(int a, int b)
{
    int result = a + b;
    return result;
}

그리고 Main 함수에서 호출 시 다음과 같이 사용할 수 있습니다.

static void Main(string[] args)
{
    int result = Program.Add(1, 2);
    Console.WriteLine(result);  // 3 출력
}

또한, Console.WriteLine() 또한 메서드로서 콘솔에 출력을 담당하는 함수입니다.


2. 값 복사(Call by Value)와 참조 전달(Call by Reference)

C#에서 함수에 인수를 전달하는 방식에는 크게 두 가지가 있습니다.

(1) Call by Value (값 복사)

  • 개념:
    인수를 전달할 때 실제 변수의 을 복사하여 함수의 매개변수에 전달합니다.
    함수 내부에서 매개변수 값을 변경해도 원래 변수에는 영향을 주지 않습니다.

  • 예제 코드:

    class Program
    {
        static void AddOne(int number)
        {
            number = number + 1;
        }
        static void Main(string[] args)
        {
            int a = 0;
            Program.AddOne(a);
            Console.WriteLine(a); // 0 출력: a는 변경되지 않음
        }
    }
    • 여기서 a의 값이 0인 상태로 함수에 전달되고, 함수 내부에서 증가된 값은 number라는 별도의 메모리 공간에 저장되므로 원본 a에는 영향을 주지 않습니다.

(2) Call by Reference (참조 전달)

  • 개념:
    ref 키워드를 사용하여 매개변수를 전달하면, 인수의 메모리 자체를 참조하게 됩니다.
    따라서 함수 내부에서 매개변수의 값이 변경되면 원래 변수도 같이 변경됩니다.

  • 예제 코드:

    class Program
    {
        static void AddOne(ref int number)
        {
            number = number + 1;
        }
        static void Main(string[] args)
        {
            int a = 0;
            Program.AddOne(ref a);
            Console.WriteLine(a); // 1 출력: a의 값이 함수 내부에서 직접 변경됨
        }
    }
    • ref 키워드를 사용함으로써, 함수에 전달된 number는 원래 변수 a와 같은 메모리를 참조하게 되어 함수 내 연산 결과가 그대로 반영됩니다.

두 전달 방식의 비교

  • Call by Value (복사 방식):
    • 원본 데이터는 변경되지 않으므로 안전하지만, 큰 데이터를 전달할 때는 복사 비용이 발생할 수 있습니다.
  • Call by Reference (참조 방식):
    • 원본 데이터를 직접 변경할 수 있어 효율적이지만, 의도하지 않은 값 변경이 발생할 위험이 있으므로 사용에 주의해야 합니다.

또한, 함수에서 값을 반환하는 방식(return)을 이용해 원본을 변경하지 않고 새로운 값을 만들어 내는 방법도 있으며, 상황에 따라 효율성과 디자인 측면에서 적절한 방식을 선택하게 됩니다.

예를 들어:

class Program
{
    static int AddOne2(int number)
    {
        return number + 1;
    }
    static void Main(string[] args)
    {
        int a = 0;
        a = Program.AddOne2(a);  // 원본 a를 직접 변경하지 않고, 리턴 값을 이용해 할당
        Console.WriteLine(a); // 1 출력
    }
}
  • 이 방식은 함수가 입력값을 변경하지 않으므로, 부수 효과(side-effect)가 없어 안전하게 사용할 수 있습니다.
  • 단, 입력값이 크거나 복사 비용이 큰 경우에는 참조 방식이 더 효율적일 수 있습니다.

3. 디폴트 매개 변수 (Default Parameters)

C#에서는 함수 정의 시 매개변수에 기본값을 설정할 수 있습니다.
이렇게 하면 함수를 호출할 때 해당 인수를 생략하면 기본값이 사용됩니다.

예제 코드:

class Program
{
    static int Add(int a, int b, int c = 0, float d = 1.0f, double e = 3.0)
    {
        return a + b + c;
    }
    static void Main(string[] args)
    {
        // c, d, e 매개변수 중 원하는 것만 인수를 지정할 수 있음.
        // 예를 들어, d만 값을 지정하고 싶다면 다음과 같이 호출할 수 있습니다.
        Program.Add(1, 2, d: 2.0f);
    }
}
  • 설명:
    • 매개변수 c, d, e는 각각 기본값(디폴트 값)이 설정되어 있어서, 인수를 생략해도 해당 기본값이 사용됩니다.
    • C#에서는 인수의 순서를 명시적으로 지정할 수 있기 때문에, 생략된 매개변수의 기본값을 그대로 사용할 수 있습니다.

profile
李家네_공부방

0개의 댓글