[C#][01] 프로그래밍의 시작과 첫 프로그램
이번에 쉬어가는 김에 복습하기로 했다.
1. 프로그래밍 언어란?
프로그램(Program)은 컴퓨터가 수행할 명령어의 집합이고, 프로그래밍(Programming)은 이러한 프로그램을 만드는 과정이다.
컴퓨터의 CPU는 기계어를 실행하지만, 사람이 기계어를 직접 작성하기는 어렵다. 따라서 사람이 이해하기 쉬운 문법으로 명령을 작성할 수 있도록 프로그래밍 언어를 사용한다.
프로그래밍 언어는 크게 고수준 언어와 저수준 언어로 구분할 수 있다.
| 구분 | 고수준 언어 | 저수준 언어 |
|---|---|---|
| 특징 | 사람이 이해하기 쉬움 | 하드웨어와 가까움 |
| 예시 | C#, Python, Java | 기계어, 어셈블리어 |
| 장점 | 가독성 및 생산성 | 하드웨어에 대한 세밀한 제어 |
C#은 고수준 프로그래밍 언어에 해당한다.
2. C#과 .NET
C#은 Microsoft에서 개발한 객체 지향 프로그래밍 언어이다.
C#의 주요 특징은 다음과 같다.
- 정적 타입 검사: 변수의 타입을 검사하여 잘못된 타입 사용을 컴파일 단계에서 발견할 수 있다.
- 객체 지향 프로그래밍: 데이터와 기능을 객체 단위로 묶어 관리할 수 있다.
- 자동 메모리 관리: 가비지 컬렉터가 사용하지 않는 관리 객체의 메모리를 회수한다.
- 다양한 활용 분야: Unity 게임 개발, 웹 서버, 데스크톱 애플리케이션 등에 사용된다.
그렇다면 C#과 .NET은 어떤 차이가 있을까?
C#이 프로그램을 작성하는 언어라면, .NET은 프로그램을 개발하고 실행하기 위한 플랫폼이다.
.NET을 구성하는 주요 요소는 다음과 같다.
| 구성 요소 | 역할 |
|---|---|
| CLR | .NET 프로그램의 실행을 관리하는 런타임 |
| BCL | 기본적으로 제공되는 클래스 라이브러리 |
| SDK | 프로그램 개발과 빌드에 필요한 도구 모음 |
예를 들어 C#에서 사용하는 Console.WriteLine()은 .NET 라이브러리가 제공하는 기능이다.
C# 코드는 어떻게 실행될까?
일반적인 .NET의 JIT 실행 방식에서는 C# 코드가 곧바로 기계어로 변환되는 것이 아니라 중간 언어인 IL을 거친다.
- 컴파일(Compile): C# 컴파일러가 작성한 코드를 IL(Intermediate Language)로 변환한다.
- JIT(Just-In-Time): 실행 중 필요한 IL을 해당 CPU에서 실행할 수 있는 기계어로 변환한다.
- 실행: 변환된 기계어를 CPU가 실행한다.
다만 모든 C# 프로그램이 JIT 방식을 사용하는 것은 아니며, Unity의 IL2CPP처럼 AOT 컴파일을 사용하는 방식도 있다.
3. Visual Studio 개발 환경
수업에서는 Visual Studio 2026을 사용하여 C# 콘솔 프로젝트를 만들었다.
Visual Studio에서 구분해야 할 기본 구성 요소는 다음과 같다.
- 솔루션(Solution): 하나 이상의 프로젝트를 관리하는 단위
- 프로젝트(Project): 소스 파일과 빌드 설정 등을 관리하는 단위
- 소스 파일(Source File): 실제 C# 코드를 작성하는
.cs파일
또한 코드를 작성하는 것만큼 빌드와 디버깅 방법을 익히는 것도 중요하다.
| 단축키 | 기능 |
|---|---|
Ctrl + Shift + B | 솔루션 빌드 |
F5 | 디버깅 시작 |
Ctrl + F5 | 디버깅 없이 실행 |
F9 | 중단점 설정 및 해제 |
F10 | 한 단계씩 실행(Step Over) |
빌드(Build)는 작성한 소스 코드를 컴파일하고 실행에 필요한 결과물을 만드는 과정이다.
반면 디버깅(Debugging)은 프로그램의 동작을 확인하면서 오류의 원인을 찾아 수정하는 과정이다.
4. 첫 C# 프로그램
첫 실습으로 콘솔 화면에 Hello, World!를 출력하는 프로그램을 작성했다.
using System;
Console.WriteLine("Hello, World!");
실행 결과
Hello, World!
코드의 각 부분을 살펴보면 다음과 같다.
| 코드 | 의미 |
|---|---|
using System; | System 네임스페이스의 타입을 간단한 이름으로 사용 |
Console | 콘솔 입출력 기능을 제공하는 클래스 |
WriteLine() | 값을 출력하고 줄을 바꾸는 메서드 |
"Hello, World!" | 출력할 문자열 |
; | 해당 명령문의 끝을 표시 |
특히 C#은 대소문자를 구분하기 때문에 Console.WriteLine()을 console.writeline()처럼 작성하면 컴파일 오류가 발생한다.
최상위문(Top-level statements)
기존에는 C# 프로그램의 진입점을 다음과 같이 작성했다.
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
하지만 C# 9.0부터는 최상위문(Top-level statements)을 사용할 수 있어 별도의 Program 클래스나 Main() 메서드를 직접 작성하지 않아도 된다.
using System;
Console.WriteLine("Hello, World!");
컴파일러가 프로그램 진입점을 생성해 주기 때문에 더 간단하게 코드를 작성할 수 있다.
5. 컴파일 오류와 실행 오류
프로그램을 작성하다 보면 다양한 오류를 만나게 된다.
오류는 발생 시점에 따라 구분할 수 있다.
| 구분 | 발생 시점 | 예시 |
|---|---|---|
| 컴파일 오류 | 빌드 과정 | 문법 오류, 타입 불일치 |
| 실행 오류 | 프로그램 실행 중 | 0으로 나누기, 잘못된 인덱스 접근 |
예를 들어 다음 코드는 세미콜론이 빠져 있다.
Console.WriteLine("Hello")
이 경우 CS1002 컴파일 오류가 발생한다.
error CS1002: ;이 필요합니다.
오류 메시지에는 오류 번호와 원인, 발생 위치 등이 표시되므로 이를 확인하면 문제를 해결하는 데 도움이 된다.
오류와 별개로 경고(Warning)도 존재한다. 일반적으로 오류는 빌드를 막지만, 경고는 빌드가 가능하더라도 확인이 필요한 부분을 알려 준다.

