Hello World와 프로그램 구조
프로그램이 어디서 시작하는지, 최상위 문(top-level statements)이 무엇인지 봅니다.
프로그램은 어디서 시작하나
모든 프로그램에는 가장 먼저 실행되는 자리가 있습니다. 이것을
진입점(entry point)이라고 부릅니다. C#에서 이 자리는 오랫동안
Main 이라는 이름의 메서드였습니다. 프로그램을 시작하면
런타임이 Main 을 찾아 그 안의 코드를 첫 줄부터 실행합니다.
그런데 화면에 한 줄을 찍어 보는 것이 전부인 프로그램에도
Main 을 감싸는 클래스와 메서드를 모두 적어야 했습니다.
배우는 사람 입장에서는 아직 배우지 않은 것들을 먼저 적어야 하는 셈이었습니다.
그래서 C# 9.0부터 최상위 문(top-level statements) 이 생겼습니다.
파일에 실행할 문장만 적으면, 컴파일러가 그것을 감쌀
Main 을 대신 만들어 줍니다. 지금
dotnet new console 로 프로젝트를 만들면 이 형태로 나옵니다.
한 줄짜리 프로그램
아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.
Console.WriteLine("Hello, World!");
코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.
Console.WriteLine 은 값을 화면에 찍고 줄을 바꿉니다. 줄을
바꾸고 싶지 않을 때는 Console.Write 를 사용합니다. 문장 끝의
세미콜론은 "여기까지가 한 문장"이라는 표시이며, C#에서는 빠뜨리면
컴파일되지 않습니다.
컴파일러가 대신 적어 주는 것
앞에서 실행한 한 줄은 사실 아래 두 코드와 같은 뜻입니다. 우리가 적는 것과, 그것을 받아 컴파일러가 만들어 내는 모양입니다.
Console.WriteLine("Hello, World!");
using System; class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); } }
각 조각이 무엇을 뜻하는지 하나씩 보겠습니다.
| 조각 | 뜻 | 비고 |
|---|---|---|
| using System; | System 이라는 묶음 안의 것들을 이름만으로 사용하겠다는 선언 | System.Console → Console |
| class Program | 코드를 담는 틀. 2부에서 자세히 다룹니다 | 이름은 무엇이든 됩니다 |
| static | 객체를 만들지 않아도 부를 수 있다는 표시 | 진입점은 반드시 static |
| void | 돌려주는 값이 없다는 뜻 | int 로 두면 종료 코드를 냅니다 |
| string[] args | 실행할 때 함께 넘긴 값들 | dotnet run -- 값1 값2 |
최상위 문에서 알아둘 것
- 한 프로젝트에 한 파일만 최상위 문을 사용할 수 있습니다. 진입점이 둘이면 어디서 시작할지 정할 수 없기 때문입니다.
-
args는 그대로 사용할 수 있습니다. 따로 선언하지 않아도 컴파일러가 넣어 줍니다. -
종료 코드를 내려면
return 0;처럼 값을 돌려주면 됩니다. -
using을 한 줄도 적지 않았는데Console이 그냥 사용되었습니다. 프로젝트 설정의 ImplicitUsings 가 켜져 있어 자주 사용하는 묶음을 미리 넣어 주기 때문입니다.
직접 Main 을 적어야 할 때도 있습니다. 그때는 파일 맨 위에
네임스페이스를 적어 코드가 어느 묶음에 속하는지 밝힙니다. C# 10부터는 중괄호로
감싸지 않는 파일 범위 네임스페이스를 사용할 수 있어, 아래처럼
들여쓰기가 한 단계 줄어듭니다.
namespace MyApp { class Program { static void Main() { Console.WriteLine("Hello"); } } }
namespace MyApp; class Program { static void Main() { Console.WriteLine("Hello"); } }
이 문법, 몇 버전부터 사용할 수 있나요
- 9.0최상위 문(top-level statements)
- 10.0암시적 using · 파일 범위 네임스페이스
최상위 문은 C# 9.0(2020, .NET 5)부터 사용할 수 있습니다. 그 이전 버전에서는
Main 메서드를 반드시 직접 적어야 했습니다.
ImplicitUsings 로 using 이
생략되는 것과 파일 범위 네임스페이스는 그다음인 C# 10.0(2021, .NET 6)부터입니다.
오래된 코드에서 Main 이 보이는 것은 잘못된 것이
아니라 그때의 방식일 뿐입니다.
직접 해보기
Console.WriteLine 을 세 번 작성해서 이름, 사는 곳, 좋아하는
것을 각각 한 줄씩 출력해보세요.
위에서 작성한 세 줄을 최상위 문이 아니라 Main 메서드 안에
들어가는 형태로 고쳐 작성해보세요. 클래스 이름은 마음대로 정해도 됩니다.
- 프로그램은 진입점에서 시작합니다. C#에서 그 자리는
Main입니다. - C# 9.0부터는 문장만 적으면 컴파일러가
Main을 대신 만들어 줍니다. - 최상위 문은 한 프로젝트에 한 파일만 사용할 수 있습니다.
- 모든 문장은 세미콜론으로 끝납니다.
C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.