C# 과 .NET 시작하기 - 첫 콘솔 앱
이 장에서 배우는 것
카페 주문 관리 프로그램을 만들려면 먼저 코드를 저장하고 실행하는 작업 환경이 필요하다. 화면에 메뉴 몇 줄을 표시하는 작은 프로그램이라도 실행 도구, 소스 파일, 프로젝트 설정이 함께 움직인다. 이 장에서는 그 연결을 확인하고, 동네 카페의 영업 준비 안내를 출력하는 첫 콘솔 앱을 만든다.
콘솔 앱(console application)은 터미널에서 실행하며 글자로 결과를 보여 주는 프로그램이다. 이번 프로그램은 주문을 받거나 재고를 바꾸지 않는다. 정해진 안내문을 같은 순서로 출력한다. 기능을 작게 잡는 이유는 코드의 동작과 실행 환경의 문제를 구분하기 위해서다. 실행 결과가 예상과 같다면 이후에 기능을 추가할 출발점이 마련된 셈이다.
- .NET SDK 설치 여부와 설치된 버전을 확인한다.
dotnet new로 프로젝트를 만들고dotnet run으로 실행한다.- 최상위 문으로 작성한 코드가 위에서 아래로 실행됨을 이해한다.
Program.cs와 프로젝트 파일의 역할을 구분한다.- 소스 코드를 수정한 뒤 다시 실행하여 결과를 확인한다.
문제 상황
동네 카페에서 매일 사용하는 주문 관리 도구를 만들기로 했다고 하자. 첫 작업은 직원이 프로그램을 켰을 때 카페 이름과 메뉴를 확인하도록 만드는 것이다. 아직 주문 수량이나 결제 기능은 필요하지 않다. 터미널에 메뉴가 일정한 형태로 나타나면 첫 작업의 요구를 충족한다.
작업을 시작하면 코드보다 먼저 환경에서 막히기도 한다. 컴퓨터에 .NET을 설치했다고 들었는데 dotnet 명령을 찾지 못할 수 있다. 명령은 실행되지만 새 프로젝트를 만들 도구가 없을 수도 있다. 프로젝트를 만든 뒤 다른 폴더에서 실행해서 파일을 찾지 못하는 경우도 있다.
이런 문제는 출력문을 고쳐서 해결되지 않는다. 설치된 도구를 확인하고, 프로젝트가 있는 폴더를 확인한 다음, 실행할 소스 코드를 확인해야 한다. 이번 실습은 이 순서를 그대로 따른다. 작업 폴더 이름은 CafeConsole로 정하고, 그 안에 카페 안내문을 출력하는 코드를 저장한다.
성공 조건도 미리 정한다. 프로젝트는 .NET 10을 대상으로 하고, 터미널에서 dotnet run을 실행하면 여섯 줄의 안내가 나온다. 현재 시각이나 사용자 입력을 사용하지 않으므로 반복 실행해도 안내 내용이 바뀌지 않는다. 이 기준을 바탕으로 환경 준비와 코드 작성을 각각 확인한다.
C#과 .NET SDK의 역할
C#은 프로그램의 동작을 적는 언어다. .NET은 C#으로 작성한 프로그램을 만들고 실행하는 데 사용하는 기반을 제공한다. 둘은 함께 쓰이지만 같은 이름의 도구는 아니다. 우리는 C# 문법으로 소스 파일을 작성하고, .NET 도구로 그 파일을 빌드하고 실행한다.
빌드(build)는 소스 코드와 프로젝트 설정을 바탕으로 실행에 필요한 결과물을 만드는 과정이다. 컴파일(compile)은 그 과정에서 소스 코드의 문법과 의미를 검사하고 실행 가능한 형태로 변환하는 작업이다. 코드에 세미콜론이 빠진 것처럼 문법 문제가 있으면 실행 단계에 도달하기 전에 진단 메시지가 나온다.
소프트웨어 개발 키트(Software Development Kit, SDK)는 프로젝트 생성과 빌드 등에 필요한 개발 도구를 묶은 것이다. 런타임(runtime)은 만들어진 .NET 프로그램을 실행하는 데 필요한 구성 요소다. 실행만 하는 컴퓨터와 개발하는 컴퓨터의 요구가 다른 이유가 여기에 있다. 이번 실습에는 .NET 10 SDK가 필요하다.
SDK에는 개발에 사용하는 런타임도 포함된다. 따라서 이 장의 일반적인 개발 환경에서는 .NET 10 SDK를 설치하여 시작한다. 런타임만 설치되어 있다고 해서 dotnet new와 빌드에 필요한 개발 도구까지 준비된 것은 아니다.
| 요소 | 역할 | 이번 실습에서 확인할 것 |
|---|---|---|
| C# | 프로그램의 동작을 표현하는 언어 | 안내문을 출력하는 문장 |
| .NET SDK | 프로젝트 생성과 빌드에 필요한 도구 | 10.0 계열 SDK 설치 여부 |
| .NET 런타임 | 빌드한 .NET 프로그램 실행 | SDK 설치로 함께 준비되는 실행 환경 |
| dotnet | .NET 작업을 요청하는 명령 | 터미널에서 명령 실행 가능 여부 |
설치 상태 확인하기
macOS나 Linux의 터미널을 열고 다음 두 명령을 실행한다. 명령 앞에 프롬프트 기호를 붙이지 않았으므로 각 줄을 그대로 입력하면 된다. 첫 명령은 현재 위치에서 선택되는 SDK의 버전을 보여 주고, 두 번째 명령은 설치된 SDK 목록을 보여 준다.
dotnet --version
dotnet --list-sdks
확인할 핵심은 SDK 목록에 10.0.으로 시작하는 버전이 있는지다. 뒤에 붙는 숫자는 설치한 SDK에 따라 다르므로 이 책과 같게 맞출 필요가 없다. 목록의 설치 경로 역시 운영체제와 설치 방식에 따라 달라진다. 이 출력은 환경 확인용이며, 뒤에서 만드는 카페 프로그램의 출력과는 성격이 다르다.
dotnet --version은 설치된 모든 버전을 보여 주는 명령이 아니다. 여러 SDK가 함께 설치된 환경에서는 프로젝트 주변의 SDK 선택 설정 등에 따라 한 버전이 선택된다. 목록에는 .NET 10 SDK가 있는데 생성이나 빌드가 예상대로 진행되지 않는다면, 현재 위치에서 선택된 SDK도 함께 확인한다.
명령을 찾을 수 없다는 메시지가 나오면 아직 코드 작성으로 넘어가지 않는다. SDK가 설치되지 않았거나, 터미널이 실행 파일의 위치를 찾지 못하는 상태일 수 있다. 설치 직후라면 터미널을 새로 열어 다시 확인한다. dotnet 명령은 보이지만 SDK 목록이 비어 있다면 개발용 SDK 설치 여부를 확인한다.
설치가 필요하면 .NET 10 다운로드 안내에서 운영체제와 프로세서에 맞는 SDK를 선택한다. macOS에서는 Apple Silicon과 Intel을 구분하고, Linux에서는 사용하는 배포판의 설치 안내를 따른다. 배포판마다 패키지 관리 명령이 다르므로 서로 다른 배포판의 설치 명령을 섞지 않는다.
이후 설명은 .NET 10 SDK가 준비되어 있고, 현재 작업 위치에서 .NET 10 프로젝트를 생성하고 빌드할 수 있다고 가정한다. 설치 프로그램을 실행했다는 사실보다 터미널에서 SDK를 확인했다는 결과가 다음 작업의 기준이다.
프로젝트를 만들고 실행하는 흐름
프로젝트(project)는 소스 코드와 빌드 설정을 하나의 작업 단위로 묶는다. 이번에는 콘솔 앱용 프로젝트를 생성한다. 예제를 보관할 폴더로 이동한 뒤 다음 명령을 차례로 실행한다. 같은 이름의 작업 폴더가 이미 있다면 새 실습 위치를 마련한 뒤 진행한다.
dotnet new console --name CafeConsole --framework net10.0
cd CafeConsole
dotnet new는 템플릿(template)을 바탕으로 프로젝트의 기본 파일을 만든다. 여기서 템플릿은 시작에 필요한 파일과 설정을 준비해 둔 틀이다. console은 콘솔 앱용 틀을 선택하며, --name CafeConsole은 프로젝트 이름을 지정한다. 이 명령은 현재 위치 아래에 같은 이름의 폴더도 만든다.
--framework net10.0은 생성할 프로젝트가 .NET 10을 대상으로 하도록 지정한다. 이 옵션이 SDK를 다운로드하거나 설치해 주는 것은 아니다. 해당 대상을 지원하는 SDK가 준비되어 있어야 한다. 환경을 확인한 다음 프로젝트를 생성하는 이유가 여기에 있다.
cd CafeConsole은 생성된 폴더 안으로 이동하는 셸 명령이다. 이 이동을 생략하면 다음 명령이 프로젝트 바깥에서 실행될 수 있다. 터미널은 편집기에서 열어 둔 파일을 보고 작업 위치를 결정하지 않는다. 터미널 자체의 현재 폴더가 기준이다.
프로젝트를 생성하면 안내 메시지와 함께 복원 작업의 결과가 표시될 수 있다. 복원(restore)은 프로젝트가 요구하는 의존성을 사용할 수 있도록 준비하는 과정이다. 이번 예제에는 외부 패키지를 직접 추가하지 않지만, 프로젝트 생성과 실행 흐름에 복원 단계가 포함될 수 있다는 점은 알아 둔다. 관련 메시지가 나온다고 해서 카페 코드가 실행된 것은 아니다.
프로젝트 폴더 안에서는 다음 명령으로 실행한다. 처음에는 생성 도구가 준비한 기본 소스 코드가 실행된다. 기본 안내가 표시되는지 확인하면 프로젝트 생성과 실행 경로가 연결되었음을 알 수 있다. 이 기본 소스는 잠시 뒤 카페 안내 코드로 교체한다.
dotnet run
dotnet run은 필요한 복원과 빌드를 수행한 뒤 프로그램을 실행한다. 개발 중에는 소스를 수정할 때마다 실행 전에 별도의 빌드 명령을 입력하지 않아도 된다. 다만 실행 자체를 생략할 수 있다는 뜻은 아니다. 파일을 저장한 뒤 다시 dotnet run을 입력해야 변경한 동작을 확인할 수 있다.
빌드만 확인하려면 dotnet build를 사용할 수 있다. 이 명령은 실행 결과물을 만들지만 카페 안내를 출력하는 프로그램까지 실행하지는 않는다. 문법 검사를 통과했는지 확인하는 일과 실제 화면의 문구를 확인하는 일은 구분된다. 이번 장의 최종 확인에는 두 가지가 모두 포함된다.
작업 중 현재 위치가 헷갈리면 다음 명령을 사용한다. pwd는 현재 폴더의 경로를 출력하고, ls는 그 안의 파일과 폴더를 보여 준다. 목록에서 CafeConsole.csproj와 Program.cs를 확인한다. 이 두 명령은 .NET 명령이 아니라 macOS와 Linux 셸에서 사용하는 명령이다.
pwd
ls
프로젝트 생성은 작업 단위를 처음 준비하는 과정이다. 안내 문구를 바꿀 때마다 dotnet new를 반복하지 않는다. 한 번 만든 프로젝트에서 소스를 편집하고 저장한 뒤 실행하는 흐름을 반복한다.
최상위 문과 프로젝트 파일 읽기
Program.cs에 실행할 문장 적기
Program.cs는 이번 프로젝트의 C# 소스 파일이다. 확장자 .cs는 C# 코드가 담긴 파일임을 나타낸다. 편집기에서 이 파일을 열면 생성 도구가 작성한 기본 코드가 보인다. 완성 코드를 적용할 때는 기존 내용 뒤에 덧붙이지 않고 파일 전체를 교체한다.
최상위 문(top-level statements)은 클래스로 감싼 시작 메서드를 직접 작성하지 않고도 파일의 최상위 위치에 실행할 문장을 적는 방식이다. 실행 진입점(entry point)은 프로그램의 실행이 시작되는 곳을 뜻한다. 최상위 문을 사용하면 컴파일러가 필요한 진입점을 마련하므로 이번 예제에서는 출력할 문장부터 작성할 수 있다.
최상위 문이라고 해서 프로젝트 설정이 없어지거나 모든 C# 문법을 생략하는 것은 아니다. 문장 끝의 세미콜론, 문자열을 감싸는 큰따옴표, 이름의 대소문자 같은 규칙은 그대로 적용된다. 최상위 문은 시작 코드를 적는 형식을 간결하게 해 준다.
이번 코드에 등장하는 Console.WriteLine은 콘솔에 내용을 쓰고 줄을 바꾼다. 괄호 안의 큰따옴표로 감싼 부분은 출력할 문자열(string)이다. 예를 들어 Console.WriteLine("오늘의 메뉴");를 실행하면 큰따옴표는 화면에 나타나지 않고 그 안의 글자만 한 줄에 표시된다.
마침표는 Console에 있는 WriteLine을 지정하는 표기에 쓰인다. 괄호에는 출력할 내용을 넣고, 세미콜론으로 문장을 마친다. 이 장에서는 이 표기를 하나의 출력 동작으로 읽으면 충분하다. 출력할 글자를 바꾸는 것과 출력 동작의 이름을 바꾸는 것은 다르므로 Console.WriteLine 부분은 그대로 둔다.
최상위에 출력문을 여럿 적으면 이번 프로그램에서는 파일 위쪽 문장부터 아래쪽 문장까지 차례대로 실행된다. 메뉴 제목이 메뉴 항목보다 먼저 보이는 이유도 작성 순서 때문이다. 마지막 문장이 실행되면 프로그램이 끝나고 터미널이 다음 명령을 받을 수 있는 상태로 돌아온다.
CafeConsole.csproj의 설정 확인하기
프로젝트 파일의 확장자는 .csproj다. 생성한 CafeConsole.csproj에는 다음과 같은 기본 설정이 들어 있다. 이 내용은 C# 코드가 아니며, Program.cs에 붙여 넣으면 안 된다. 파일을 열어 구조와 값을 확인하되 이번 실습에서는 생성된 설정을 그대로 사용한다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
첫 줄의 Microsoft.NET.Sdk는 프로젝트에 적용할 SDK의 빌드 기능을 지정한다. 이것은 dotnet --version에 나오는 설치 버전 번호를 적는 자리가 아니다. PropertyGroup 안에는 결과물의 종류와 대상 프레임워크 등 빌드에 사용할 속성이 들어 있다.
OutputType의 Exe는 실행 가능한 프로그램을 만들도록 설정한다. macOS나 Linux에서 이 값이 Windows의 .exe 파일만을 뜻하는 것은 아니다. 여기서는 운영체제의 파일 확장자를 지정하는 것이 아니라 프로젝트 결과물의 용도를 지정한다고 이해한다.
TargetFramework의 net10.0은 프로그램이 대상으로 삼는 .NET 버전을 나타내는 대상 프레임워크 식별자다. SDK 버전은 개발 도구의 버전이고, 이 값은 프로그램의 대상이다. 두 값은 서로 관련이 있지만 같은 형식의 숫자를 적는 항목은 아니다.
ImplicitUsings의 enable은 콘솔 프로젝트에서 자주 사용하는 이름을 찾는 데 필요한 일부 선언을 자동으로 포함한다. 그래서 이번 코드에서는 System.Console이라는 전체 이름 대신 Console을 사용할 수 있다. 이 설정을 끄면 같은 소스라도 이름을 찾지 못하는 진단이 생길 수 있으므로 예제의 실행 조건에 포함하여 읽는다.
Nullable의 enable은 참조가 없을 가능성과 관련된 코드 분석을 켠다. 이번 프로그램은 고정된 문자열만 출력하므로 이 설정을 바꿀 이유가 없다. 여기서는 생성된 프로젝트에 이런 검사 설정이 있다는 사실만 확인하고, 관련 타입의 의미는 이후에 다룬다.
기본 SDK 프로젝트는 프로젝트 폴더의 C# 소스 파일을 규칙에 따라 찾아 빌드에 포함한다. 따라서 위 설정에 Program.cs라는 이름이 직접 보이지 않아도 파일이 빌드된다. 이번 실습에서는 실행 문장을 이 파일 하나에 모은다. 최상위 문을 여러 소스 파일에 나누어 적는 방식은 사용할 수 없다.
생성이나 빌드를 거친 뒤에는 obj와 bin 폴더도 보인다. obj에는 복원과 빌드 과정의 중간 자료가, bin에는 빌드 결과물이 놓인다. 카페 안내 문구를 바꿀 때 편집할 곳은 이 폴더 안의 파일이 아니라 Program.cs다.
완성 코드
CafeConsole 폴더의 Program.cs를 열어 기존 내용을 모두 지운 뒤 다음 코드를 저장한다. 소스는 이 파일 하나이며, 앞에서 생성한 .NET 10 콘솔 프로젝트의 설정을 사용한다. 한글을 보존할 수 있도록 파일은 UTF-8로 저장한다.
Console.WriteLine("동네 카페 · 영업 준비");
Console.WriteLine("--------------------");
Console.WriteLine("오늘의 메뉴");
Console.WriteLine("아메리카노 | 3,000원");
Console.WriteLine("카페라테 | 3,800원");
Console.WriteLine("주문 입력은 이후에 추가한다.");
가격은 계산에 쓰이는 값이 아니라 안내문에 포함된 글자다. 쉼표나 원 단위도 그대로 출력된다. 지금은 메뉴와 가격을 저장하는 구조를 만들지 않으며, 실제 주문을 접수했다는 의미의 메시지도 출력하지 않는다. 완성 범위는 실행 가능한 영업 준비 안내다.
이 코드는 추가 라이브러리나 별도 소스 파일을 요구하지 않는다. 생성된 프로젝트의 기본 설정에서 경고나 오류 없이 빌드할 수 있으며, 입력을 기다리지 않고 여섯 줄을 출력한 뒤 종료한다. 터미널이 이미 열려 있으므로 프로그램이 종료되어도 출력 내용을 확인할 수 있다.
줄별 해설
첫 줄은 카페 안내의 제목을 출력한다. 문자열 가운데의 ·는 C# 연산자가 아니라 큰따옴표 안에 들어 있는 글자다. 글자의 기능을 판단할 때는 그 글자가 코드의 어느 위치에 있는지 함께 보아야 한다.
둘째 줄은 하이픈 스무 개를 출력한다. 제목과 메뉴를 시각적으로 구분하기 위한 문구이며, 계산이나 반복을 수행하지 않는다. 이 줄도 나머지 줄과 같은 출력문이다.
셋째 줄은 오늘의 메뉴라는 소제목을 출력한다. 앞의 두 문장이 실행된 뒤에 실행되므로 제목과 구분선 아래에 나타난다. 출력 순서를 바꾸고 싶다면 실행할 문장의 순서를 바꿔야 한다.
넷째 줄은 아메리카노의 이름과 가격을 출력한다. 세로 막대는 이름과 가격 사이의 구분 문자다. 큰따옴표 안에 있으므로 C#에서 다른 용도로 사용하는 기호와 구분된다. 화면에는 큰따옴표를 제외한 문자열의 내용이 그대로 나온다.
다섯째 줄은 카페라테 안내를 출력한다. 메뉴 이름 뒤에는 공백 세 개가 있다. WriteLine이 표의 열을 자동으로 맞추는 것은 아니다. 코드에 적힌 공백을 그대로 출력하며, 보이는 간격은 터미널 글꼴의 한글 표시 폭에 따라서도 달라질 수 있다.
여섯째 줄은 현재 프로그램의 범위를 알린다. 아직 입력 기능이 없음을 문구로 보여 줄 뿐, 입력을 기다리는 동작은 없다. 이 문장이 끝나면 더 실행할 문장이 없으므로 프로그램이 종료된다.
각 문장의 마지막에는 세미콜론이 있다. 편집기에서 줄을 바꿨다는 사실만으로 문장이 끝나지는 않는다. 반대로 출력 화면의 줄바꿈은 소스 파일의 줄바꿈 때문에 생기는 것이 아니라 WriteLine이 수행한 결과다. 소스 배치와 화면 출력을 구분하여 읽는 습관이 필요하다.
실행 결과
파일을 저장한 뒤 CafeConsole.csproj가 있는 폴더에서 다음 명령을 실행한다.
dotnet run
프로그램이 출력하는 내용은 다음과 같다. 터미널의 명령 프롬프트는 포함하지 않았다. SDK의 초기 안내나 도구의 진단 메시지가 나타나는 환경이라면 그것은 아래의 프로그램 출력과 구분한다.
동네 카페 · 영업 준비
--------------------
오늘의 메뉴
아메리카노 | 3,000원
카페라테 | 3,800원
주문 입력은 이후에 추가한다.
다시 같은 명령을 실행하면 같은 여섯 줄이 나온다. 코드가 날짜, 파일 내용, 입력값을 읽지 않기 때문이다. 예상 출력과 비교할 때는 문구뿐 아니라 줄 순서, 구분선의 길이, 메뉴 이름 뒤의 공백도 확인한다.
기본 프로젝트의 안내가 함께 출력된다면 원래 있던 출력문이 남아 있는지 확인한다. 수정 전 문구만 보인다면 저장 여부와 터미널의 현재 폴더를 확인한다. 눈앞의 결과를 바탕으로 원인을 좁혀야 하며, 같은 프로젝트를 계속 새로 생성할 필요는 없다.
실무에서 자주 틀리는 것
프로젝트 바깥에서 실행하기
다음은 프로젝트를 만들고도 생성된 폴더로 이동하지 않은 예다. 명령을 입력한 위치에 다른 프로젝트가 없다면 실행할 프로젝트를 찾지 못한다. 편집기에서 Program.cs를 열었다고 해서 터미널 위치까지 바뀌지는 않는다.
dotnet new console --name CafeConsole --framework net10.0
dotnet run
프로젝트를 이미 생성했다면 다시 생성하지 않고 다음과 같이 이동한 뒤 실행한다. 이 명령은 생성 직후의 상위 폴더에 머물러 있는 상황을 기준으로 한다.
cd CafeConsole
dotnet run
상위 폴더에 머물러야 하는 작업이라면 프로젝트 경로를 명시할 수도 있다. 아래 명령과 폴더 안에서의 dotnet run은 같은 프로젝트를 실행하는 두 가지 방법이다.
dotnet run --project CafeConsole/CafeConsole.csproj
대상 프레임워크에 SDK 버전을 적기
dotnet --version에서 확인한 숫자를 프로젝트 설정에 그대로 옮기는 경우가 있다. 다음은 프로젝트 파일에서 잘못 설정한 부분이다. 설치된 SDK 버전이 이 숫자와 같아도 대상 프레임워크 값으로 쓰는 형식은 아니다.
<TargetFramework>10.0.100</TargetFramework>
.NET 10을 대상으로 하는 이 프로젝트에서는 다음 값을 사용한다. SDK가 여러 개 설치되어 있더라도 개발 도구의 버전 번호와 프로그램의 대상 식별자는 구분하여 관리한다.
<TargetFramework>net10.0</TargetFramework>
출력문 끝의 세미콜론을 빼기
다음 코드는 줄 끝에서 세미콜론을 빠뜨렸다. 사람이 보기에는 한 줄의 문장이지만 C# 문법에서는 문장을 마치는 기호가 필요하다. 이런 상태에서는 정상적인 프로그램 출력을 확인하기 전에 컴파일 오류를 해결해야 한다.
Console.WriteLine("오늘의 메뉴")
다음처럼 끝에 세미콜론을 붙인다. 오류가 여러 개 보일 때는 첫 진단이 가리키는 위치와 그 앞부분을 함께 확인한다. 하나의 누락 때문에 뒤쪽 코드에서도 연달아 진단이 나타날 수 있다.
Console.WriteLine("오늘의 메뉴");
문자열에 문서용 곡선 따옴표 사용하기
문서 편집기에서 코드를 작성하거나 옮기면 곧은 큰따옴표가 곡선 모양으로 바뀌기도 한다. 다음 코드는 눈으로 읽을 수 있지만, 사용한 따옴표가 C# 문자열을 여닫는 기호가 아니다.
Console.WriteLine(“오늘의 메뉴”);
코드 편집기에서 곧은 큰따옴표로 바꾼다. 문자열 안의 한글에는 문제가 없다. 출력할 글자와 그 글자를 감싸는 문법 기호를 나누어 확인하면 수정할 범위가 분명해진다.
Console.WriteLine("오늘의 메뉴");
한눈에 보기
| 작업 | 명령 또는 파일 | 확인 기준 |
|---|---|---|
| 선택된 SDK 확인 | dotnet --version | 현재 위치에서 사용할 SDK 버전 |
| 설치된 SDK 확인 | dotnet --list-sdks | 10.0 계열 SDK 존재 여부 |
| 프로젝트 생성 | dotnet new console | 소스 파일과 프로젝트 파일 생성 |
| 실행 동작 편집 | Program.cs | 여섯 출력문의 내용과 순서 |
| 빌드 설정 확인 | CafeConsole.csproj | 대상 프레임워크가 net10.0 |
| 빌드 확인 | dotnet build | 경고와 오류 없이 빌드 완료 |
| 프로그램 실행 | dotnet run | 예상한 카페 안내 출력 |
설치 확인은 도구가 준비되었는지 살피는 작업이고, 프로젝트 생성은 작업 파일을 마련하는 과정이다. 소스 수정과 실행은 그다음에 반복한다. 문제가 생기면 이 흐름의 어느 지점까지 확인했는지 구분하여 살핀다.
현재 메뉴 이름과 가격은 모두 출력문 안에 고정되어 있다. 다음에는 변수와 기본 타입을 통해 프로그램이 다룰 값에 이름을 붙이고, 값 형식과 참조 형식의 차이를 살펴본다. 여기서 만든 프로젝트를 그 작업의 출발점으로 사용할 수 있다.
연습 문제
- 카페 안내의 첫 줄을
골목 카페 · 영업 준비로 바꾸어라. 나머지 다섯 줄은 유지하고, 같은 프로젝트에서 다시 실행하여 확인하라. 어떤 파일을 고치고 어떤 명령을 실행했는지도 적어라. - 완성 코드의 마지막 안내 다음에
포장 주문을 준비 중이다.를 한 줄 더 출력하라. 추가할 문장과 변경 후 전체 예상 출력을 적어라. 별도의 프로젝트를 만들 필요는 없다. - 터미널의 현재 위치가
CafeConsole의 상위 폴더다. 그 위치에는 프로젝트 파일이 없고CafeConsole안에만 있다. 폴더를 이동하여 실행하는 방법과 이동하지 않고 실행하는 방법을 각각 작성하라. - 설치된 SDK 버전 번호와
TargetFramework의 값은 무엇이 다른지 설명하라. 이어서Program.cs와CafeConsole.csproj중 카페 안내 문구를 바꿀 파일을 고르고 이유를 적어라.
정답과 해설
1. 제목 수정하기
Program.cs의 첫 문장을 다음과 같이 바꾸고 저장한다. 프로젝트 파일은 수정하지 않는다. 제목은 빌드 대상에 관한 설정이 아니라 프로그램이 출력할 내용이기 때문이다.
Console.WriteLine("골목 카페 · 영업 준비");
CafeConsole.csproj가 있는 폴더에서 실행한다. 첫 줄만 아래 내용으로 바뀌고 나머지 다섯 줄은 완성 코드의 출력과 같다. 변경이 보이지 않으면 파일 저장 여부와 실행한 프로젝트의 경로를 확인한다.
dotnet run
골목 카페 · 영업 준비
2. 안내 한 줄 추가하기
각 문제는 본문의 완성 코드를 기준으로 한다. 따라서 첫 줄은 원래 제목을 사용한다. 다음 문장을 기존 마지막 문장 아래에 추가한다. 최상위 문은 작성된 순서대로 실행되므로 새 안내가 마지막 줄에 나온다.
Console.WriteLine("포장 주문을 준비 중이다.");
저장한 뒤 dotnet run으로 실행하면 전체 프로그램 출력은 다음과 같다. 새 문장도 WriteLine을 사용하므로 이전 안내와 같은 줄에 붙지 않는다.
동네 카페 · 영업 준비
--------------------
오늘의 메뉴
아메리카노 | 3,000원
카페라테 | 3,800원
주문 입력은 이후에 추가한다.
포장 주문을 준비 중이다.
3. 실행할 프로젝트 지정하기
폴더를 이동하는 방법은 다음과 같다. 이동 후에는 현재 폴더의 프로젝트를 찾아 실행한다.
cd CafeConsole
dotnet run
상위 폴더에서 이동하지 않고 실행하려면 다음 명령을 사용한다. 두 방법은 각각 상위 폴더에서 시작하는 대안이며, 위 명령을 실행한 직후 아래 명령까지 연속으로 입력하는 순서가 아니다.
dotnet run --project CafeConsole/CafeConsole.csproj
--project 뒤의 경로는 터미널의 현재 폴더를 기준으로 해석된다. 파일이 존재하는데도 찾지 못한다면 경로의 철자와 대소문자, 현재 위치를 함께 확인한다.
4. 개발 도구와 빌드 대상 구분하기
SDK 버전은 프로젝트를 생성하고 빌드하는 개발 도구의 버전이다. TargetFramework는 프로그램이 대상으로 삼는 프레임워크를 지정하며, 이번 프로젝트에서는 net10.0을 사용한다. SDK 목록에 보이는 전체 버전 번호를 이 값으로 복사하지 않는다.
카페 안내 문구는 Program.cs에서 고친다. 이 파일에는 실행할 C# 문장이 들어 있다. CafeConsole.csproj는 결과물의 종류와 대상 프레임워크 같은 빌드 설정을 담는다. 수정하려는 것이 화면의 동작인지 빌드 조건인지 먼저 구분하면 편집할 파일을 판단할 수 있다.