반응형
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 함수만 호출 가능
- 혹은 객체를 할당해서 해당 객체의 함수를 호출 가능
프로그램 진입점인 Main함수는 왜 static 정적 함수일까?
- 프로그램의 진입점은 프로그램 실행 시 가장 먼저 실행되는 코드로, 다른 모든 코드의 시작점 역할을 한다.
- 이때, 운영 체제 또는 런타임 환경이 Main() 함수를 호출한다. 이 시점에 특정 클래스의 객체가 생성되지 않았기 때문에, Main() 함수는 정적이어야지만 호출이 가능하다.
- 프로그램의 진입점은 프로그램에서 단 하나만 존재하면 된다.
- 정적 함수는 클래스 수준에서 존재하므로, 불필요한 객체 생성을 방지하여 메모리를 효율적으로 사용 가능하다.
- 예시) 싱글톤 패턴의 경우에도 객체가 오직 하나만 필요하기 때문에 보통 static을 사용한다.
정리하자면
- 운영 체제 / 런타임에서 직접 호출 : 객체를 생성하지 않고도 바로 호출이 가능해야 하기 때문에
- 독립적이고 효율적인 실행 : 정적 객체들은 메모리 구조에서 Data영역에 존재하기 때문에 프로그램 시작 시 생성되고 종료 시에 소멸된다.
- 일관성과 명확성 : 프로그램의 유일한 진입점으로, 객체의 생성과 무관하게 작동이 보장되어야 하기 때문에
함께 읽으면 좋은 글
'프로그래밍 > C#' 카테고리의 다른 글
C# 비동기 프로그래밍 TAP이란 무엇인가? (0) | 2024.11.22 |
---|---|
C# 비동기 프로그래밍 APM이란 무엇인가? (0) | 2024.11.21 |
C# 비동기 프로그래밍 시작하기 (0) | 2024.10.08 |
C# HttpClient.PostAsync 사용하기 (0) | 2024.10.07 |
C# HTTP 프로토콜과 Web 사용 (0) | 2024.10.02 |
댓글