자바에도 main()메소드가 있고, c#은 Main()메소드가 존재하듯이, 이는 실행파일이면서 없을 경우 프로그램은 컴파일이 되지 않고, 에러창이 뜨는데요. "프로그램 진입점이 없다"라는 에러가 발생되지요.
따라서, 제일 중요한 부분으로써, 컴파일을 할경우 아무런 옵션을 주지 않으면 프로그램은 알아서 Main()메소드를 찾아 진입점으로 인식하기 때문에 기재해 주셔야 합니다. 그렇지 않을 경우 에러가 발생되겠죠.
만약에 진입점이 없는 라이브러리 형태의 프로그램을 작성코저 한다면 컴파일할 시에 옵션에 /reference 를 사용하여 라이브러리 형태라는 것을 명시해줘야 에러가 발생되지 않습니다.
그리고 보통 public 한정자를 표시해 주지만 프로그램 밖에서 호출되도록 정의되어 있기 때문에 어떤 엑세스를 정의해 주던 간에 상관이 없습니다.
public static void Main(); 를 static void Main() 이런식으로 제거해도 에러가 발생되지 않는다는 거죠.
아래는..Main()메소드의 형태를 보여줍니다.
1. public static void Main() { … … } 2. public static void Main(string[] args) { … …} 3. public static int Main() { return 0; //0이면 Main()메서드의 정상종료, 0 이외 수는 비정상종료를 의미 } 4. public static int Main(string[] args) { return 0; }
2번은..프롬프트상에서 매개변수의 입력을 필요로 할때 사용하며, 3번은 메서드 형이 int 형인 경우로써 debugging 할때 쓰이는 경우이며, 0을 반환할 경우 종료를 의미하며, 그 이외의 숫자는 비정상종료를 의미합니다. 그리고 Main() 메소드가 실행이 끝나면 자동적으로 프로그램도 종료가 됩니다.
Main()메소드가 여러개가 있을 경우 컴파일러는 당연히 오류를 발생시키죠. 따라서 만약에 여러 Main 메소드를 진입점으로 사용할 것인가를 컴파일러에 지시를 해주면 에러가 발생되지 않겠죠.
/main 스위치와 진입점으로 사용할 Main 메소드가 정의되어 있는 클래스의 전체 이름을 사용하면 됩니다.(namespace)
소스를 간단히 볼까요?
using System;
namespace Csharp.Zoa.To { class Csharp { public static int Main() { MathExample.Main(); return 0; } }
class MathExample { static int Add(int x, int y) { return x + y; }
public static int Main() { int i = Add(5,10); Console.WriteLine(i); return i; } } }
Main 함수가 2개나 있죠? 따라서 아래와 같이 지정해 주면 에러가 발생되지 않을 겁니다.