C#LAB
C# 1.2 · 1부. 기초

Hello World와 프로그램 구조

프로그램이 어디서 시작하는지, 최상위 문(top-level statements)이 무엇인지 봅니다.

예상 학습 시간 10분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

프로그램은 어디서 시작하나

모든 프로그램에는 가장 먼저 실행되는 자리가 있습니다. 이것을 진입점(entry point)이라고 부릅니다. C#에서 이 자리는 오랫동안 Main 이라는 이름의 메서드였습니다. 프로그램을 시작하면 런타임이 Main 을 찾아 그 안의 코드를 첫 줄부터 실행합니다.

그런데 화면에 한 줄을 찍어 보는 것이 전부인 프로그램에도 Main 을 감싸는 클래스와 메서드를 모두 적어야 했습니다. 배우는 사람 입장에서는 아직 배우지 않은 것들을 먼저 적어야 하는 셈이었습니다.

그래서 C# 9.0부터 최상위 문(top-level statements) 이 생겼습니다. 파일에 실행할 문장만 적으면, 컴파일러가 그것을 감쌀 Main 을 대신 만들어 줍니다. 지금 dotnet new console 로 프로젝트를 만들면 이 형태로 나옵니다.

최소 예제 · 편집 가능

한 줄짜리 프로그램

아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.

Program.cs
Console.WriteLine("Hello, World!");
출력
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부터는 중괄호로 감싸지 않는 파일 범위 네임스페이스를 사용할 수 있어, 아래처럼 들여쓰기가 한 단계 줄어듭니다.

C# 9 까지
namespace MyApp {
    class Program {
        static void Main() {
            Console.WriteLine("Hello");
        }
    }
}
C# 10 부터
namespace MyApp;

class Program {
    static void Main() {
        Console.WriteLine("Hello");
    }
}
버전 배지

이 문법, 몇 버전부터 사용할 수 있나요

1.0
2.0
3.0
5.0
6.0
8.0
9.0
10.0
14.0
  • 9.0최상위 문(top-level statements)
  • 10.0암시적 using · 파일 범위 네임스페이스
C# 9.0+

최상위 문은 C# 9.0(2020, .NET 5)부터 사용할 수 있습니다. 그 이전 버전에서는 Main 메서드를 반드시 직접 적어야 했습니다. ImplicitUsingsusing 이 생략되는 것과 파일 범위 네임스페이스는 그다음인 C# 10.0(2021, .NET 6)부터입니다. 오래된 코드에서 Main 이 보이는 것은 잘못된 것이 아니라 그때의 방식일 뿐입니다.

실습 문제

직접 해보기

1. 세 줄로 자기소개 찍기 난이도 하

Console.WriteLine 을 세 번 작성해서 이름, 사는 곳, 좋아하는 것을 각각 한 줄씩 출력해보세요.

문장 하나가 한 줄을 찍습니다. 줄 끝마다 세미콜론(;)을 빠뜨리지 마세요.
Console.WriteLine("이름: 홍길동"); Console.WriteLine("사는 곳: 서울"); Console.WriteLine("좋아하는 것: 커피");
2. Main 형태로 바꿔 작성하기 난이도 중

위에서 작성한 세 줄을 최상위 문이 아니라 Main 메서드 안에 들어가는 형태로 고쳐 작성해보세요. 클래스 이름은 마음대로 정해도 됩니다.

클래스로 감싸고 그 안에 static void Main() 을 둡니다. 찍는 문장은 그 중괄호 안으로 옮기면 됩니다.
class Intro { static void Main() { Console.WriteLine("이름: 홍길동"); Console.WriteLine("사는 곳: 서울"); Console.WriteLine("좋아하는 것: 커피"); } }
요약
  • 프로그램은 진입점에서 시작합니다. C#에서 그 자리는 Main 입니다.
  • C# 9.0부터는 문장만 적으면 컴파일러가 Main 을 대신 만들어 줍니다.
  • 최상위 문은 한 프로젝트에 한 파일만 사용할 수 있습니다.
  • 모든 문장은 세미콜론으로 끝납니다.

C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.