C#이란? .NET SDK 설치와 첫 프로그램 만들기(dotnet new console) | C# 강좌 1강
C#과 .NET의 관계를 정리하고, .NET SDK 설치부터 dotnet new console로 첫 프로젝트를 만들어 실행하는 과정까지 단계별로 설명해요. Program.cs 한 줄로 동작하는 최상위 문(top-level statements)과 전통적인 Main 메서드 방식의 차이도 함께 다뤄요.
이번 강에서는 C#이 어떤 언어이고 .NET과 어떤 관계인지 살펴본 뒤, .NET SDK를 설치하고 첫 프로그램을 직접 만들어 실행해요. 개발 도구를 설치하고 프로그램을 실행하는 흐름을 한 번 손에 익혀 두면 앞으로 48강 동안 모든 예제를 같은 방법으로 돌려 볼 수 있어요.
C#은 어떤 언어인가요
C#(씨샵)은 마이크로소프트가 만든 범용 프로그래밍 언어예요. 2000년대 초에 처음 발표된 뒤 해마다 새 기능이 추가되며 꾸준히 발전하고 있어요.
C#으로는 정말 다양한 프로그램을 만들 수 있어요. 대표적인 분야를 표로 정리하면 다음과 같아요.
| 분야 | 예시 |
|---|---|
| 웹 서버·API | ASP.NET Core로 만든 웹 서비스 |
| 게임 | Unity 엔진의 스크립트 언어 |
| 데스크톱 앱 | WPF, WinForms, .NET MAUI |
| 모바일 앱 | .NET MAUI로 만든 안드로이드·iOS 앱 |
| 클라우드·도구 | Azure 서비스, 명령줄 도구 |
C#은 자료형을 엄격하게 검사하는 정적 타입 언어라서 실수를 실행 전에 미리 잡아 주는 편이에요. 문법은 C, C++, Java와 비슷해서 다른 언어로 넘어가거나 넘어올 때도 부담이 적어요.
C#과 .NET의 관계
처음 배우는 사람이 가장 헷갈리는 부분이 'C#'과 '.NET(닷넷)'의 차이예요. 간단히 말하면 C#은 언어이고, .NET은 그 언어로 쓴 프로그램을 만들고 실행해 주는 플랫폼이에요.
언어와 플랫폼은 어떻게 나뉘나요
C#은 문법 규칙의 모음이에요. 여기에 컴퓨터가 실제로 프로그램을 돌리려면 코드를 번역하는 컴파일러, 실행을 담당하는 런타임, 자주 쓰는 기능을 미리 만들어 둔 라이브러리가 필요한데 이것을 모두 묶은 것이 .NET이에요.
| 구성 요소 | 하는 일 |
|---|---|
| C# 컴파일러 | C# 코드를 중간 언어(IL)로 번역 |
| 런타임(CLR) | IL을 실제 기계어로 바꿔 실행하고 메모리를 관리 |
| 기본 라이브러리(BCL) | 화면 출력, 파일, 네트워크 같은 기능 제공 |
| dotnet CLI | 프로젝트 생성·빌드·실행 명령어 도구 |
오늘 쓰게 될 Console.WriteLine도 C# 문법이 아니라 .NET 기본 라이브러리가 제공하는 기능이에요. 그래서 .NET이 없으면 C# 코드를 써도 실행할 수 없어요.
.NET Framework와 .NET은 다른가요
인터넷 자료를 찾다 보면 '.NET Framework'라는 이름도 자주 보여요. .NET Framework는 윈도우 전용이던 예전 플랫폼이고, 지금 쓰는 .NET은 윈도우·macOS·리눅스에서 모두 동작하는 새 플랫폼이에요.
.NET은 매년 11월에 새 버전이 나오고, 짝수 버전(예: .NET 8, .NET 10)은 3년간 지원되는 LTS(장기 지원) 버전이에요. 이 강좌는 LTS인 .NET 10과 C# 14를 기준으로 하지만, 더 최신 버전을 설치해도 예제는 그대로 동작해요.
.NET SDK 설치하기
.NET을 내려받을 때는 SDK와 런타임 두 종류가 있어요. 런타임은 이미 만든 프로그램을 실행만 하는 용도이고, SDK에는 런타임과 컴파일러, dotnet 명령어가 모두 들어 있어요.
프로그램을 만들려면 반드시 SDK를 설치해야 해요.
공식 사이트에서 설치하기
가장 쉬운 방법은 공식 다운로드 페이지(https://dotnet.microsoft.com/download)에서 운영체제에 맞는 SDK 설치 파일을 받아 실행하는 거예요. 설치 마법사의 안내대로 '다음'만 누르면 끝나요.
명령어로 설치하기
패키지 관리자에 익숙하다면 터미널에서 한 줄로 설치할 수도 있어요.
# Windows (winget)
winget install Microsoft.DotNet.SDK.10
# macOS (Homebrew)
brew install --cask dotnet-sdk
# Ubuntu
sudo apt-get update && sudo apt-get install -y dotnet-sdk-10.0
설치 확인하기
설치가 끝나면 새 터미널 창을 열고 다음 명령을 입력해요. 버전 번호가 출력되면 설치에 성공한 거예요.
dotnet --version
10.0.100
숫자는 설치한 시점에 따라 조금 다를 수 있어요. 설치된 SDK 목록을 모두 보고 싶다면 dotnet --list-sdks를 입력하면 돼요.
dotnet new console로 첫 프로젝트 만들기
.NET에서는 프로그램 하나를 프로젝트 단위로 관리해요. 프로젝트를 처음부터 손으로 만들 필요 없이, dotnet new 명령이 정해진 틀(템플릿)대로 파일을 만들어 줘요.
프로젝트 생성
작업할 폴더로 이동한 뒤 다음 명령을 입력해요. console은 콘솔(터미널) 프로그램 템플릿이라는 뜻이고, -o HelloWorld는 HelloWorld라는 폴더를 만들어 그 안에 프로젝트를 넣으라는 옵션이에요.
dotnet new console -o HelloWorld
cd HelloWorld
The template "Console App" was created successfully.
만들어진 파일 살펴보기
HelloWorld 폴더 안에는 다음과 같은 파일이 생겨요.
| 파일·폴더 | 역할 |
|---|---|
HelloWorld.csproj |
프로젝트 설정 파일(.NET 버전, 옵션 등) |
Program.cs |
실제 C# 코드가 들어 있는 파일 |
obj/ |
빌드 과정에서 쓰는 임시 파일 폴더 |
C# 소스 파일의 확장자는 .cs예요. 앞으로 코드는 대부분 Program.cs에 작성하게 돼요.
실행하기
프로젝트 폴더 안에서 dotnet run을 입력하면 코드를 빌드(컴파일)한 뒤 바로 실행해요.
dotnet run
실행 결과
Hello, World!
화면에 Hello, World!가 나왔다면 첫 C# 프로그램을 성공적으로 실행한 거예요. 빌드가 끝나면 bin/ 폴더가 새로 생기는데, 여기에 실행 파일이 저장돼요.
Program.cs와 최상위 문
이제 Program.cs를 열어 보세요. 메모장이나 아무 편집기로 열어도 괜찮고, 편집기 설정은 다음 강에서 자세히 다뤄요.
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
실행 결과
Hello, World!
코드 해설
첫 줄의 //로 시작하는 부분은 주석이에요. 주석은 사람이 읽으라고 남기는 메모라서 컴파일러가 무시해요.
둘째 줄의 Console.WriteLine("...")는 괄호 안의 글자를 화면에 출력하고 줄을 바꾸는 명령이에요. 큰따옴표로 감싼 글자 덩어리를 문자열이라고 부르고, 문장 끝의 세미콜론(;)은 '한 문장이 끝났다'는 표시예요.
최상위 문이란
이렇게 파일에 바로 실행할 코드를 적는 방식을 최상위 문(top-level statements)이라고 해요. C# 9부터 도입된 기능으로, 프로그램의 시작 지점을 따로 정의하지 않아도 파일 맨 위부터 차례대로 실행돼요.
최상위 문 이전에는 같은 프로그램을 쓰려면 다음처럼 길게 작성해야 했어요.
namespace HelloWorld;
class Program
{
// 프로그램이 시작되는 지점(Main 메서드)
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
실행 결과
Hello, World!
두 코드는 결과가 완전히 같아요. 사실 최상위 문으로 쓴 코드도 컴파일러가 내부적으로 Main 메서드를 자동으로 만들어 그 안에 코드를 넣어 줘요.
namespace, class, static void Main 같은 키워드는 클래스와 메서드를 배울 때 자세히 설명할 거예요. 지금은 '프로그램의 시작점은 Main이고, 최상위 문은 그것을 대신 만들어 주는 편의 기능'이라는 정도만 기억하면 충분해요.
전통적인 방식으로 프로젝트 만들기
회사 코드나 오래된 책에서는 Main 방식을 자주 보게 돼요. 처음부터 Main 방식으로 프로젝트를 만들고 싶다면 옵션을 하나 붙이면 돼요.
dotnet new console -o HelloMain --use-program-main
이 강좌의 예제는 짧고 읽기 쉬운 최상위 문 방식으로 작성해요.
using 없이 Console을 쓸 수 있는 이유
옛날 예제에는 맨 위에 using System;이 붙어 있는 경우가 많아요. 요즘 템플릿은 암시적 using(implicit usings) 설정이 켜져 있어서 System 같은 자주 쓰는 네임스페이스를 자동으로 불러와요.
그래서 using 없이도 Console을 바로 쓸 수 있어요.
여러 줄 출력해 보기
Program.cs의 내용을 지우고 다음 코드로 바꾼 뒤 dotnet run을 실행해 보세요.
// 한 줄씩 출력하고 줄을 바꿔요
Console.WriteLine("C# 강좌에 오신 것을 환영해요.");
Console.WriteLine("오늘은 첫 프로그램을 만들어요.");
// Write는 출력만 하고 줄을 바꾸지 않아요
Console.Write("Write는 ");
Console.Write("줄을 바꾸지 않아요.");
Console.WriteLine(); // 괄호를 비우면 줄바꿈만 해요
Console.WriteLine("끝!");
실행 결과
C# 강좌에 오신 것을 환영해요.
오늘은 첫 프로그램을 만들어요.
Write는 줄을 바꾸지 않아요.
끝!
코드 해설
최상위 문은 위에서 아래로 한 줄씩 차례대로 실행돼요. Console.Write는 글자만 출력하고 커서를 그 자리에 두기 때문에, 이어지는 출력이 같은 줄에 붙어요.
괄호 안을 비운 Console.WriteLine()은 아무것도 출력하지 않고 줄만 바꿔요. 빈 줄을 넣고 싶을 때도 이 방법을 쓰면 돼요.
초보자가 자주 겪는 오류
처음에는 오타 하나로도 빌드가 실패해요. 오류 메시지에는 파일 이름과 줄 번호, 오류 코드가 함께 나오므로 그 위치를 먼저 확인하는 습관을 들이면 좋아요.
세미콜론을 빠뜨렸을 때
Console.WriteLine("Hello, World!")
Program.cs(1,35): error CS1002: ; expected
CS1002는 세미콜론이 필요하다는 뜻이에요. (1,35)는 1번째 줄 35번째 글자 근처라는 위치 정보예요.
대소문자를 틀렸을 때
C#은 대문자와 소문자를 엄격하게 구분해요. console.writeline처럼 쓰면 전혀 다른 이름으로 취급해요.
console.WriteLine("Hello, World!");
Program.cs(1,1): error CS0103: The name 'console' does not exist in the current context
CS0103은 그런 이름을 찾을 수 없다는 오류예요. Console, WriteLine처럼 각 단어의 첫 글자를 대문자로 쓴다는 점을 기억하세요.
프로젝트 폴더 밖에서 실행했을 때
dotnet run은 현재 폴더에서 .csproj 파일을 찾아요. 프로젝트 폴더로 이동하지 않고 실행하면 다음과 비슷한 메시지가 나와요.
Couldn't find a project to run. Ensure a project exists in /home/user, or pass the path to the project using --project.
cd HelloWorld처럼 프로젝트 폴더로 이동한 뒤 다시 실행하면 해결돼요.
dotnet 명령을 찾을 수 없을 때
설치 직후 'dotnet'은(는) 내부 또는 외부 명령... 이 아닙니다 같은 메시지가 나온다면, 대부분 설치 전에 열어 둔 터미널을 그대로 쓰고 있기 때문이에요.
터미널을 완전히 닫고 새로 열어 보고, 그래도 안 되면 SDK가 제대로 설치됐는지 확인하세요.
최상위 문은 한 파일에만
최상위 문은 프로젝트 안에서 딱 한 파일에만 쓸 수 있어요. 다른 .cs 파일에도 최상위 문을 쓰면 error CS8802: Only one compilation unit can have top-level statements. 오류가 나요.
프로그램의 시작점은 하나뿐이어야 하기 때문이에요.
연습 문제
문제 1
자기소개를 세 줄로 출력하는 프로그램을 최상위 문으로 작성하세요. 첫 줄은 안녕하세요!, 둘째 줄은 저는 C#을 배우고 있어요., 셋째 줄은 잘 부탁드려요.로 해요.
문제 2
Console.Write를 세 번 사용해 C#은, 정말, 재미있어요!를 출력하되, 결과가 한 줄로 이어져 C#은 정말 재미있어요!가 되도록 만드세요. 마지막에는 줄을 바꿔 주세요.
문제 3
다음 최상위 문 코드를 Main 메서드를 사용하는 전통적인 방식으로 바꿔 보세요.
Console.WriteLine("첫 번째 줄");
Console.WriteLine("두 번째 줄");
정답 예시
문제 1 정답
// 자기소개 세 줄 출력
Console.WriteLine("안녕하세요!");
Console.WriteLine("저는 C#을 배우고 있어요.");
Console.WriteLine("잘 부탁드려요.");
실행 결과
안녕하세요!
저는 C#을 배우고 있어요.
잘 부탁드려요.
문제 2 정답
// Write는 줄을 바꾸지 않으므로 한 줄에 이어서 출력돼요
Console.Write("C#은");
Console.Write(" 정말");
Console.Write(" 재미있어요!");
Console.WriteLine(); // 마지막 줄바꿈
실행 결과
C#은 정말 재미있어요!
공백을 문자열 안에 넣어야 단어 사이가 띄워진다는 점에 주의하세요. 마지막 두 줄은 Console.WriteLine(" 재미있어요!"); 한 줄로 합쳐도 같은 결과가 나와요.
문제 3 정답
namespace Practice;
class Program
{
// 프로그램의 시작 지점
static void Main(string[] args)
{
Console.WriteLine("첫 번째 줄");
Console.WriteLine("두 번째 줄");
}
}
실행 결과
첫 번째 줄
두 번째 줄
실행할 코드는 모두 Main의 중괄호 { } 안에 들어가야 해요. 최상위 문과 결과는 똑같지만 코드를 감싸는 틀이 늘어난 것을 확인할 수 있어요.
핵심 정리
- C#은 프로그래밍 언어이고, .NET은 C# 코드를 컴파일하고 실행해 주는 플랫폼(컴파일러·런타임·라이브러리·도구)이에요.
- 지금의 .NET은 윈도우·macOS·리눅스에서 모두 동작하며, 매년 11월에 새 버전이 나오고 짝수 버전이 LTS예요.
- 프로그램을 만들려면 런타임이 아니라 .NET SDK를 설치해야 하고,
dotnet --version으로 설치를 확인해요. dotnet new console -o 이름으로 콘솔 프로젝트를 만들고, 프로젝트 폴더 안에서dotnet run으로 실행해요.- 최상위 문은
Main메서드 없이 파일에 바로 코드를 쓰는 방식으로, 컴파일러가 Main을 자동으로 만들어 줘요. 한 프로젝트에서 한 파일에만 쓸 수 있어요. Console.WriteLine은 출력 후 줄을 바꾸고,Console.Write는 줄을 바꾸지 않아요.- 문장 끝에는 세미콜론을 붙이고, 대소문자를 정확히 구분해서 써야 해요.
강좌 이어 보기
- 다음 강좌: 2강 개발 환경: Visual Studio와 VS Code (곧 올라옵니다)
- C# 강좌 전체 목차 보기