본문 바로가기
프로그래밍/C#

C# 프로그램 진입점 Main함수가 static인 이유

by bantomak 2024. 11. 19.
반응형

C# 예제 프로젝트를 생성하면 매번 맞이하는 오류

해당 질문에 대해서 고민해 본 적이 있는가? 물론 고민하지 않아도 된다고 생각한다. 이런 질문을 하지 않고도 무수히 많은 코드를 작성하고 프로그램을 만들 수 있기 때문이다. 하지만 매번 Main() 함수가 static이기 때문에 Main 함수에서 함수를 호출하려면 해당 함수도 static 함수여야 한다는 컴파일 오류를 매번 마주한다. 그래서 Main() 함수에서 static 키워드를 제거하면 또 다른 오류가 발생한다.

using System;

class Program
{
    public int Factorial(int num)
    {
        if (num == 0)
        {
            return 0;
        }

        if (num == 1)
        {
            return 1;
        }

        return Factorial(num - 2) + Factorial(num - 1);
    }

    public static void Main()
    {
        Console.WriteLine(Factorial(0)); //CS0120 static이 아닌 필드, 메서드 또는 속성 'Program.Factorial(int)'에 개체 참조가 필요합니다.
        Console.WriteLine(Factorial(1));
        Console.WriteLine(Factorial(5));
        Console.WriteLine(Factorial(6));
    }
}

 

  • Main() 함수는 static 이기 때문에 static 함수만 호출 가능
  • 혹은 객체를 할당해서 해당 객체의 함수를 호출 가능
 

Compiler Error CS0120 - C# reference

Compiler Error CS0120

learn.microsoft.com

프로그램 진입점인 Main함수는 왜 static 정적 함수일까?

  • 프로그램의 진입점은 프로그램 실행 시 가장 먼저 실행되는 코드로, 다른 모든 코드의 시작점 역할을 한다.
  • 이때, 운영 체제 또는 런타임 환경이 Main() 함수를 호출한다. 이 시점에 특정 클래스의 객체가 생성되지 않았기 때문에, Main() 함수는 정적이어야지만 호출이 가능하다.
  • 프로그램의 진입점은 프로그램에서 단 하나만 존재하면 된다.
  • 정적 함수는 클래스 수준에서 존재하므로, 불필요한 객체 생성을 방지하여 메모리를 효율적으로 사용 가능하다.
  • 예시) 싱글톤 패턴의 경우에도 객체가 오직 하나만 필요하기 때문에 보통 static을 사용한다.

정리하자면

  1. 운영 체제 / 런타임에서 직접 호출 : 객체를 생성하지 않고도 바로 호출이 가능해야 하기 때문에
  2. 독립적이고 효율적인 실행 : 정적 객체들은 메모리 구조에서 Data영역에 존재하기 때문에 프로그램 시작 시 생성되고 종료 시에 소멸된다.
  3. 일관성과 명확성 : 프로그램의 유일한 진입점으로, 객체의 생성과 무관하게 작동이 보장되어야 하기 때문에

함께 읽으면 좋은 글

 

메모리 구조(Memory Structure)에 대해서

메모리 구조우리가 exe 파일을 실행하면 운영체제는 프로그램에 정의된 명령어(코드)를 바탕으로 메모리에 프로세스를 적재한다.해당 프로세스를 위한 Code, Data, Heap, Stack 영역이 생성된다. 메모

jettstream.tistory.com

댓글