[C#] 함수

김승태·2025년 3월 18일

C#

목록 보기
8/13

🧩 static과 함수(Function)에 대한 이해


⚙️ static이란?

클래스의 멤버(변수, 메서드 등)를 개별 인스턴스에 종속되지 않고 클래스 자체에 속하도록 지정하는 키워드

✅ 특징

  • 클래스의 개별 인스턴스가 아닌, 클래스 자체에 속함
  • 메모리에 한 번만 할당되고, 프로그램 종료 시까지 유지
  • 모든 객체가 공유하는 전역적인 데이터 (정적 변수)
  • 객체를 생성하지 않고 접근 가능
  • static 메서드는 인스턴스 멤버에 직접 접근 불가
    • 이유: static 멤버는 인스턴스와 무관하기 때문

🧩 static 함수란?

클래스 자체에 속하는 메서드. 객체를 생성하지 않고 클래스 이름으로 직접 호출 가능

✅ Main 함수는 static 메서드만 호출 가능

  • 이유: Main() 함수는 프로그램 시작점으로서, 클래스 인스턴스를 만들지 않고 실행됨
  • 따라서, Main() 내부에서 호출할 함수는 반드시 static이어야 함
  • 단, 인스턴스 메서드를 사용하려면 클래스 객체를 생성해야 함

🧍‍♂️ 인스턴스 메서드

특정 클래스의 인스턴스를 통해 호출되는 메서드

  • static 키워드가 붙지 않음
  • 클래스의 멤버 변수(필드)에 접근 가능
  • 개별 객체마다 다른 데이터 유지 가능

🔧 함수(Function)

미리 정해진 동작을 수행하는 코드 묶음
어떤 처리를 미리 함수로 만들어 두면 반복적으로 재사용 가능


✅ 1. 입력 없이 출력도 없는 함수

static void Function1()
{
    Console.WriteLine("함수 1입니다.");
}

static void Main(string[] args)
{
    Function1();
}

✅ 2. 입력은 있지만 출력은 없는 함수

static void Function2(string input)
{
    Console.WriteLine($"함수 2의 입력은 {input} 입니다");
}

static void Main(string[] args)
{
    Function2("아무입력");
}

🔙 반환형

  1. 함수의 결과값 자료형
  2. return을 통해 반환형에 맞는 값 반드시 반환해야 함
  3. void 반환형은 return 생략 가능

✅ 3. 입력 없이 반환 있는 함수

static double Function3()
{
    double pi = 3.141592;
    Console.WriteLine("원주율 값을 반환했습니다.");
    return pi;
}

static void Main(string[] args)
{
    double returnPrintPie = Function3();
    Console.WriteLine(returnPrintPie);
}

✅ 4. 입력과 반환 모두 있는 함수

📌 예시 1

static string Function4(string taste, float time)
{
    Console.WriteLine("피자를 만드는 중입니다");
    Console.WriteLine($"{time}만큼 피자를 굽습니다.");

    if (time < 10)
    {
        Console.WriteLine($"{taste}맛 피자 완성!");
        return $"{taste}맛 피자 완성";
    }
    else
    {
        Console.WriteLine($"{taste}맛 피자 만들기 실패...");
        return "피자가 탔습니다.";
    }
}

static void Main(string[] args)
{
    string pizza = "파인애플";
    int pizzaTime = 10;

    string output1 = Function4(pizza, pizzaTime);
    Console.WriteLine(output1);
}

📌 예시 2

static float Area(float height, float width) 
{
    return height * width;
}

static void Main(string[] args)
{
    float num1 = 5.5f;
    float num2 = 10.5f;
    Console.WriteLine($"높이가 {num1}, 너비가 {num2}인 사각형의 넓이는 {Area(num1, num2)}입니다.");
}

🔁 5. 재귀 함수 (자기 자신을 호출)

static int Function5(int input)
{
    if (input <= 1)
    {
        return input;
    }
    else
    {
        return Function5(input - 1) + Function5(input - 2);
    }
}

static void Main(string[] args)
{
    int output = Function5(10);
    Console.WriteLine(output);
}

📤 6. 다중 반환 — out 키워드 사용

static int Divide(int left, int right, out int remain)
{
    remain = left % right;
    return left / right;
}

static void Main(string[] args)
{
    int result;
    int remain;

    result = Divide(10, 3, out remain);
    Console.WriteLine($"몫은 {result}, 나머지는 {remain}");
}

🔄 값 전달 방식


📌 Call by Value (값만 전달)

함수 호출 시, 변수의 값만 복사해서 전달
원본 데이터는 변경되지 않음

static void Swap(int left, int right)
{
    int temp = left;
    left = right;
    right = temp;
}

static void Main(string[] args)
{
    int a = 10;
    int b = 20;

    Swap(a, b);
    Console.WriteLine($"a: {a}, b: {b}"); // 값 변화 없음
}

📌 Call by Reference (참조 전달)

함수 호출 시, 변수의 메모리 주소를 전달
원본 데이터가 변경됨

static void SwapReference(ref int left, ref int right)
{
    int temp = left;
    left = right;
    right = temp;
}

static void Main(string[] args)
{
    int a = 10;
    int b = 20;

    SwapReference(ref a, ref b);
    Console.WriteLine($"a: {a}, b: {b}"); // 값 변경됨
}
profile
긍정머신

0개의 댓글