[C#][02] 기본 문법 - 출력, 문자열, 주석과 코드 작성 규칙

송제백
∙∙조회 0

1. 콘솔 출력

C#에서는 Console 클래스를 이용해 콘솔에 값을 출력할 수 있다.

대표적인 출력 메서드는 Write()와 WriteLine()이다.

메서드기능
Console.Write()출력 후 줄바꿈하지 않음
Console.WriteLine()출력 후 줄바꿈
Console.WriteLine()인수 없이 호출하면 줄만 바꿈
csharp
using System;

Console.Write("Hello");
Console.Write(" World");
Console.WriteLine("!");

Console.WriteLine("C# 프로그래밍");

실행 결과

text
Hello World!
C# 프로그래밍

Write()는 출력 내용을 이어서 작성할 때 사용하고, WriteLine()은 한 줄을 출력하고 다음 줄로 넘어갈 때 사용한다.

계산 결과 출력하기

출력 메서드의 괄호 안에는 문자열뿐만 아니라 숫자나 연산식도 넣을 수 있다.

csharp
Console.WriteLine(10 + 20);
Console.WriteLine(100 - 30);
Console.WriteLine(5 * 4);
Console.WriteLine(20 / 4);

실행 결과

text
30
70
20
5

여기서 중요한 점은 큰따옴표의 유무에 따라 결과가 달라진다는 것이다.

csharp
Console.WriteLine("10 + 20");
Console.WriteLine(10 + 20);

실행 결과

text
10 + 20
30

큰따옴표로 감싸면 문자열로 취급하기 때문에 그대로 출력되지만, 숫자로 구성된 연산식은 계산한 결과가 출력된다.

2. 문자열 연결과 보간

문자열을 합칠 때는 + 연산자를 사용할 수 있다.

csharp
int hp = 85;
int maxHp = 100;

Console.WriteLine("체력: " + hp + "/" + maxHp);

실행 결과

text
체력: 85/100

하지만 연결해야 할 값이 많아지면 + 연산자가 반복되어 가독성이 떨어진다.

이를 해결하기 위해 문자열 보간(String Interpolation)을 사용할 수 있다.

csharp
Console.WriteLine($"체력: {hp}/{maxHp}");
Console.WriteLine($"부족한 체력: {maxHp - hp}");

실행 결과

text
체력: 85/100
부족한 체력: 15

문자열 앞에 $를 붙이고 중괄호 {} 안에 변수나 연산식을 작성하면 된다.

문자열 보간을 사용하면 출력 결과의 형태를 코드에서 쉽게 파악할 수 있다.

3. 이스케이프 시퀀스

문자열 안에서 줄바꿈이나 큰따옴표처럼 특별한 문자를 표현할 때는 이스케이프 시퀀스(Escape Sequence)를 사용한다.

이스케이프 시퀀스는 백슬래시(\)로 시작한다.

표현의미
\n줄바꿈
\t탭
\\백슬래시
\"큰따옴표
csharp
Console.WriteLine("Hello\nWorld");
Console.WriteLine("이름\t레벨");
Console.WriteLine("그가 \"안녕\"이라고 말했다.");

실행 결과

text
Hello
World
이름    레벨
그가 "안녕"이라고 말했다.

일반적인 문자열에서 큰따옴표를 그대로 작성하면 문자열의 끝으로 인식하기 때문에 \"를 사용해야 한다.

4. 주석(Comment)

주석은 코드에 설명을 남기거나 특정 코드를 일시적으로 실행하지 않도록 할 때 사용한다.

C#에서 주석을 작성하는 방법은 크게 두 가지이다.

csharp
// 한 줄 주석
/*
여러 줄
주석
*/

주석은 컴파일 과정에서 실행 코드로 취급되지 않기 때문에 프로그램 동작에 영향을 주지 않는다.

csharp
Console.WriteLine("첫 번째 출력");

// Console.WriteLine("두 번째 출력");

Console.WriteLine("세 번째 출력");

실행 결과

text
첫 번째 출력
세 번째 출력

코드를 삭제하지 않고 특정 부분의 동작을 확인할 수 있다.

좋은 주석이란?

주석은 무조건 많이 작성하기보다는 코드만으로 이해하기 어려운 내용을 설명하는 것이 좋다.

csharp
// Hello를 출력한다.
Console.WriteLine("Hello");

// 기획이 확정되기 전까지 임시 인사말을 사용한다.
Console.WriteLine("Hello");

첫 번째 주석은 코드의 내용을 그대로 반복하지만, 두 번째 주석은 해당 코드를 작성한 이유를 설명한다.

따라서 무엇을 하는 코드인지보다 왜 그렇게 작성했는지를 설명하는 것이 더 유용할 수 있다.

5. 최상위문과 Main 메서드

C# 프로그램은 일반적으로 Main() 메서드를 진입점으로 사용한다.

csharp
using System;

class Program
{
    static void Main()
    {
        Console.WriteLine("Hello, World!");
    }
}

각 구성 요소의 역할은 다음과 같다.

구성 요소의미
class Program클래스를 정의
static인스턴스 생성 없이 호출 가능
void반환값이 없음
Main()프로그램의 진입점
{ }코드 블록의 범위

C# 9.0부터는 최상위문(Top-level statements)을 지원하기 때문에 다음과 같이 간단하게 작성할 수도 있다.

csharp
using System;

Console.WriteLine("Hello, World!");

최상위문을 사용하면 컴파일러가 프로그램 진입점을 자동으로 생성해 준다.

단, 하나의 프로젝트에서 최상위문을 포함하는 파일은 하나만 사용할 수 있다.

6. 들여쓰기와 공백

들여쓰기(Indentation)는 코드의 계층 구조를 보기 쉽게 표현하기 위해 사용한다.

csharp
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello");
    }
}

C#에서는 중괄호로 코드 블록을 구분하므로 들여쓰기 자체가 프로그램의 동작을 결정하지는 않는다.

하지만 들여쓰기를 제대로 작성하지 않으면 코드의 구조를 파악하기 어려워진다.

일반적으로 한 단계마다 공백 4칸을 사용하는 스타일이 권장된다.

공백 역시 필요한 경우를 제외하면 프로그램의 동작에 영향을 주지 않지만, 일관된 형식을 유지하면 가독성이 좋아진다.

csharp
Console.WriteLine(10 + 20);
Console.WriteLine(10+20);

두 코드의 실행 결과는 같지만 연산자 양옆에 공백을 사용하는 편이 읽기 쉽다.

결국 문법 규칙은 컴파일러가 코드를 이해하기 위해 필요하고, 코드 스타일은 사람이 코드를 이해하고 유지보수하기 위해 필요하다는 차이가 있다.

7. nameof 연산자

이번에 처음 알게 된 기능 중 하나는 nameof 연산자이다.

nameof는 변수, 클래스, 메서드 등의 이름을 문자열로 반환하는 연산자이다.

csharp
using System;

int playerScore = 100;

Console.WriteLine(nameof(playerScore));
Console.WriteLine(playerScore);

실행 결과

text
playerScore
100

nameof(playerScore)는 변수에 저장된 값이 아니라 변수의 이름인 "playerScore"를 반환한다.

그렇다면 문자열을 직접 작성하는 것과 어떤 차이가 있을까?

csharp
Console.WriteLine("playerScore");
Console.WriteLine(nameof(playerScore));

현재는 두 코드의 결과가 같지만 변수의 이름이 변경되면 차이가 발생한다.

예를 들어 playerScore를 score로 변경했다고 가정하자.

csharp
int score = 100;

Console.WriteLine("playerScore");
Console.WriteLine(nameof(score));

실행 결과

text
playerScore
score

문자열은 기존 이름을 그대로 유지하지만, nameof는 실제 코드에서 참조하는 이름을 사용한다.

특히 Visual Studio의 이름 바꾸기 기능(Ctrl + R, Ctrl + R)을 사용하면 nameof 안의 참조도 함께 수정할 수 있다.

또한 nameof는 컴파일 시점에 이름을 검사하기 때문에 존재하지 않는 이름이나 오타를 미리 발견할 수 있다.

단순히 이름을 출력하는 기능처럼 보이지만, 변수나 메서드의 이름을 변경할 때 유지보수에 도움이 되는 기능으로 많이 쓰인다고 한다.

앞으로도 단순히 문법을 외우기보다는 각 기능이 왜 필요한지 어떤 상황에서 사용하면 좋은지 이해하면서 공부하는게 기본이 되어야 할것이다.