4. C# 기본 문법 알아보기
이번 강의부터는 C# 프로그래밍에서 사용되는 주요 문법과 코드 작성법에 대해서 본격적으로 살펴보도록 하겠습니다.
> // 문법(Syntax): 문법은 반드시 지켜야하는 규칙이고 스타일은 프로그램 작성에 대한 가이드라인
4.1. 문법
문법(Syntax)은 프로그래밍 언어의 코드 작성 규칙이기에 반드시 지켜야합니다. 반드시 정해진 규칙을 따라서 코드를 작성해야 하기에 이러한 규칙은 강의 전반을 거쳐 우리가 학습할 예정입니다. 이번 강의에서 우선적으로 살펴볼 문법은 다음과 같습니다.
- 출력문: 프로그램에서 결과를 출력하는 방법.
- 대소문자 구분: C 언어는 대소문자를 구분합니다.
- 문(Statement): 프로그램에서 실행할 수 있는 최소 단위입니다.
- 공백(White Space): 코드의 가독성을 높이기 위해 사용됩니다.
- 주석(Comment): 코드에 대한 설명을 추가할 수 있으며, 실행에 영향을 미치지 않습니다.
- 키워드(Keywords): C 언어에서 특별한 의미를 가지는 예약어들입니다.
4.1.1. 문법, 스타일, 패턴
프로그래밍 세계에서 문법(Syntax)은 반드시 지켜야하는 규칙(Rule)이고 스타일(Style)은 프로그램 작성에 대한 가이드라인(Guideline)이며 패턴(Pattern)은 자주 사용하는 규칙과 스타일의 모음입니다.
다음 샘플 코드를 보면 C#은 문법에 의해서 반드시 class
와 Main()
메서드가 있어야 하고 하나 이상의 문(Statement)이 있어야 합니다. 하나의 문은 최소 세미콜론(;
) 기호가 포함되어야 합니다. 참고로, 세미콜론(;
)으로만 이루어진 다음 코드는 아무것도 출력되지 않습니다.
코드: EmptyStatement.cs
// EmptyStatement.cs
using System;
class EmptyStatement
{
static void Main()
{
;
;
;
}
}
4.2. 출력문
C#으로 명령 프롬프트(터미널)에 문자열을 출력하려면 System.Console.WriteLine();
코드를 이용하면 됩니다. WriteLine
코드는 반드시 괄호를 사용해야 하는데 이를 박용준 강사의 강의에서는 메서드
라고 합니다.
다음은 이 메서드에 대한 사용 예를 보여줍니다.
코드: WriteLineDemo1.cs
// WriteLineDemo1.cs
class WriteLineDemo1
{
static void Main()
{
System.Console.WriteLine("명령 프롬프트에 출력할 내용");
}
}
앞서 언급했던것처럼 C# 코드 상단에 using System;
코드 구문이 들어왔다면 아래와 같이 줄여서 표현할 수 있습니다.
코드: WriteLineDemo2.cs
// WriteLineDemo2.cs
using System;
class WriteLineDemo2
{
static void Main()
{
Console.WriteLine("명령 프롬프트에 출력할 내용");
}
}
4.2.1. 참고: 정규화된 이름(Fully Qualified Names)
정규화된 이름은 네임스페이스 이름과 형식 이름까지 전체를 지정하는 방식입니다.
다음 그림과 같이 네임스페이스.클래스.메서드
형태로 전체 이름을 다 지정하는 것을 정규화된 이름이라고 합니다.
위 코드는 System
네임스페이스에 있는 Console
클래스의 WriteLine()
메서드를 사용하여 콘솔에 한 줄을 출력하는 코드입니다.
System.Console.WriteLine()
형태로 문자열을 출력해 보겠습니다. 다음 내용을 코드 편집기에 입력 후 실행해보세요.
코드: TriangleExam.cs
using System;
class TriangleExam
{
static void Main()
{
Console.WriteLine("*");
Console.WriteLine("**");
System.Console.WriteLine("***");
}
}
*
**
***
4.2.2. Console.WriteLine()
메서드와 Console.Write()
메서드
명령 프롬프트에서 한 줄 출력을 할 때에는 앞서 Console.WriteLine()
메서드를 사용하였습니다. WriteLine()
메서드는 자동으로 줄바꿈을 해줍니다. 자동 줄바꿈을 안 하려면 어떻게 할까요? Console
클래스의 Write()
메서드는 자동으로 줄바꿈을 하지 않습니다.
다음 코드를 소스 코드 편집창에 입력한 뒤 실행해보세요.
코드: ConsoleWrite.cs
using System;
class ConsoleWrite
{
static void Main()
{
Console.Write("줄바꿈 없음");
Console.WriteLine("줄바꿈 포함");
}
}
줄바꿈 없음줄바꿈 포함
Console.Write()
메서드의 실행 결과는 위와 같이 줄바꿈을 포함하지 않아서 Ctrl + F5를 눌러 실행했을 때 "줄바꿈 없음줄바꿈 포함"
형태로 이어서 출력됩니다.
4.2.3. 참고: 콘솔의 전경색 및 배경색
Console
클래스의 ForegroundColor
또는 BackgroundColor
등의 속성을 사용하면 콘솔 글씨의 전경색 또는 배경색을 변경할 수 있습니다.
하지만, 이 강의에서는 C# 학습의 시간 절약과 지면 절약을 위해서 이러한 추가적인 속성은 다루진 않습니다.
앞으로 이 책을 통해서 계속해서 강조를 하겠지만, C#의 모든 내용을 알 필요는 없습니다. 그리고 특정 기능이 필요하면 검색을 통해서 그때 그때 해당 기능을 적용할 줄 알면 됩니다. 대신에 검색할 수 있는 능력은 계속 학습하면서 조금씩 늘려나가길 권장합니다.
검색 엔진을 통해서 검색해보면 알겠지만, C#과 닷넷의 모든 명령에 대한 도움말은 모두 Microsoft Learn(https://learn.microsoft.com)에 있습니다.
4.2.4. 줄 바꿈 기호: \n
콘솔(명령 프롬프트)에서 내용을 출력할 때 자동으로 줄바꿈을 하고자할 때에는 백슬래시(\
) 기호와 n
기호를 합친 \n
기호를 사용하여 줄바꿈을 할 수 있습니다. 이러한 특수 기호를 이스케이프 시퀀스
라고 하는데 뒤에서 다시 다루도록 하겠습니다.
다음 코드를 소스 코드 편집창에 입력한 뒤 실행해보세요.
***코드: NewLine.cs ***
using System;
class NewLine
{
static void Main()
{
Console.WriteLine("줄\n바꿈");
}
}
줄
바꿈
백슬래시(또는 역슬래시) 기호는 한글 폰트를 사용할 때는 ₩
로 표시되고 영문 폰트를 사용할 때에는 \
로 표시됩니다.
4.3. 들여쓰기(Indent)
프로그램 소스 코드는 가독성(readability)을 위해서 들여쓰기를 해야 합니다. 일반적으로 시작 중괄호 다음 코드는 들여쓰기를 합니다.
그림: 들여쓰기
들여쓰기는 공백(white space) 4칸을 사용하되, 스페이스바를 4번 누르면 되는데 Visual Studio에서는 탭(Tab) 키를 한번 누르면 기본값으로 스페이스 4칸을 들여쓰기 해줍니다. 들여쓰기를 할 때에는 4개의 스페이스로 들여쓰기를 권장합니다.
소스 코드 편집창에 다음 코드를 넣고 실행해보세요.
코드: Indent.cs
using System;
class Indent
{
static void Main()
{
Console.WriteLine("들여쓰기는 공백 4칸을 사용");
}
}
들여쓰기는 공백 4칸을 사용
이외에도 2칸 들여쓰기와 탭을 이용하는 들여쓰기도 있습니다.
그림: 들여쓰기 방법
스페이스와 탭을 함께 쓰지 않습니다. 들여쓰기로 프로그램 코드의 시작과 끝을 명확히 하는 것이 나중에 코드를 다시 살펴보거나 다른 사람이 봤을 때도 이해하기 쉽습니다.
4.3.1. 참고: Visual Studio에서 들여쓰기를 위한 탭 키 입력시 자동으로 공백 삽입하기
Visual Studio는 기본으로 C# 코드 편집시 탭 키를 입력시 기본 4칸을 공백으로 처리합니다. 만약 이에 대한 설정을 바꾸려면 Visual Studio에서 <도구 > 옵션 > 텍스트 편집기 > C# > 탭>
으로 이동한 후 탭에 대한 설정을 공백 삽입으로 두고 탭 크기와 들여쓰기 크기를 정해줍니다.
그림: Visual Studio에서 탭 키 입력시 자동으로 공백 삽입하기
4.3.2. 참고: 공백 보기
Visual Studio의 <편집 > 고급 > 공백 보기>
를 선택하면 공백을 시각적으로 표시해 줍니다.
주석문(코드 설명문 : Comment)
프로그래밍 언어에서의 주석문(Comment)은 코드의 설명을 담당하며, 실제 코드 실행에는 전혀 영향을 주지 않습니다. 주석문은 프로그램의 개요, 프로그램 이름, 사용자 이름, 작성일 등 필요한 부가 정보를 포함할 수 있습니다. 컴파일(Compile) 과정에서 주석문은 무시되므로, 실행 파일에는 어떠한 영향도 주지 않습니다. 주석문은 필요한 코드를 삭제하지 않고도 임시로 숨기는 용도로도 사용할 수 있습니다.
C#에서는 슬래시 기호 두 개(//
)를 사용하여 해당 줄의 나머지 부분을 주석으로 처리합니다.
아래에 제시된 예제 코드를 편집창에 입력하고 실행해보세요. 단순히 눈으로 보는 것보다는, 이 강의를 통해 수많은 cs 파일과 프로젝트를 직접 작성하고 실행해 보는 것이 훨씬 더 효과적일 것입니다. 프로그래밍 학습에서 실습은 무엇보다 중요합니다. 이에, '천 번 보는 것보다 한 번 해보는 것이 낫다'는 마인드로 학습에 임하시는 것을 권장합니다.
코드: Comment.cs
using System;
class Comment
{
static void Main()
{
// 주석문은 실행에 영향을 주지 않는 코드 설명문입니다.
Console.WriteLine("주석문");
}
}
주석문
한 줄 주석: //
C#에서의 주석문은 크게 2가지가 있으나 기본은 한 줄 주석인 //
(더블 슬래시)입니다.
더블 슬래시(//
)를 사용하는 한 줄 주석은 //
뒤에 나오는 모든 구문을 주석 처리합니다.
코드: SingleLineComment.cs
> //Console.WriteLine("현재 구문은 실행되지 않습니다.");
여러 줄 주석: /* */
슬래시 별표(/*
)로 시작해서 별표 슬래시(*/
)를 사용하는 여러 줄 주석 또는 블록 주석은 /*
와 */
사이의 모든 내용을 주석으로 처리합니다.
코드: MultiLineComment.cs
> /*
. Console.WriteLine("현재 구문은 실행되지 않습니다.");
. Console.WriteLine("현재 구문은 실행되지 않습니다.");
. */
TIP
별표(*
) 기호의 원어는 애스터리스크(asterisk
)입니다.
4.5. 이스케이프 시퀀스(Escape Sequence)
C# 에서는 WriteLine()
메서드에서 사용할 확장 문자를 제공하는데 이를 이스케이스 시퀀스
라고 합니다. 역 슬래시(\
) 기호와 특정 문자를 조합하면 특정 기능을 제공합니다. 예를들어 이스케이프 시퀀스는 백슬래시(\
)로 시작하는데 '\n'
은 New Line
을 의미하여 콘솔 화면에서 줄 바꿈을 합니다.
다음은 C# Interactive에서 출력해본 내용입니다.
코드: EscapeSequence.cs
> Console.WriteLine("안녕 \" 난 큰 따옴표야.");
안녕 " 난 큰 따옴표야.
> Console.WriteLine("안녕 \' 난 작은 따옴표야.");
안녕 ' 난 작은 따옴표야.
4.5.1. 이스케이스 시퀀스 사용하기
다음은 프로젝트 기반으로 출력해본 내용입니다. 다음 코드를 소스 코드 편집창에 입력한 뒤 실행해보세요.
코드: Quotes.cs
using System;
class Quotes
{
static void Main()
{
Console.WriteLine("[1] \" 난 큰 따옴표야.");
Console.WriteLine("[2] \' 난 작은 따옴표야.");
}
}
[1] " 난 큰따옴표야.
[2] ' 난 작은따옴표야.
평상시에는 작은따옴표는 백슬래시 기호와 함께 사용하지 않고 바로 사용합니다.
4.5.2. 주요 이스케이프 시퀀스
자주 사용하는 확장 문자는 다음 표와 같습니다.
표: 이스케이프 시퀀스
이스케이프 시퀀스 | 설명 |
---|---|
\n | 한 줄 내리기(다음 행으로 이동), newline |
\t | 탭 들여쓰기(탭 크기만큼 들여쓰기), tab |
\r | 캐리지 리턴(줄의 시작으로 이동), carriage-return |
\' | 작은따옴표 문자 하나 출력 |
\" | 큰따옴표 문자 하나 출력 |
위 내용을 포함한 더 많은 이스케이스 시퀀스는 다음과 같습니다. 지금은 몰라도 됩니다.
이스케이프 시퀀스 | 설명 |
---|---|
\n | 한 줄 내리기(다음 행으로 이동), newline |
\t | 탭 들여쓰기(탭 크기만큼 들여쓰기), tab |
\r | 캐리지 리턴(줄의 시작으로 이동), carriage-return |
\' | 작은따옴표 문자 하나 출력 |
\" | 큰따옴표 문자 하나 출력 |
\\ | 백슬래시 문자 하나 출력 |
\0 | 널(null) 문자 출력 |
\a | 벨 소리 출력 (경고음), alert |
\b | 백스페이스 출력, backspace |
\f | 폼 피드 출력, form-feed |
\v | 수직 탭 출력, vertical-tab |
\uxxxx | 16비트 유니코드 문자 출력, \u 다음에 4자리 16진수 코드가 옴 |
\Uxxxxxxxx | 32비트 유니코드 문자 출력, \U 다음에 8자리 16진수 코드가 옴 |
NOTE
백슬래시(역슬래시)와 원 기호 표시
프로그래밍 언어에서 사용하는 백슬래시(\
) 기호는 원(₩
) 표시와 동일합니다. 단, 글꼴의 형태가 영문 글꼴이면 백슬래시로 표현되고 한글 글꼴이면 원 표시로 표현됩니다.
NOTE
Visual Studio에서 키보드에 없는 특수 문자 입력
키보드를 한글 입력으로 해 놓은 후 한글 자음을 누르고 나서 바로 한자 키를 누르면 각각의 한글 자음에 해당하는 특수 문자 리스트가 출력됩니다.
4.6. 자리 표시자 사용하기
프로그램 실행 결과를 화면에 출력할 때 사용하는 출력문 등에서는 자리 표시자(틀)라는 개념을 통해서 출력 서식을 결정할 수 있습니다. {n}
형태로 {0}
, {1}
, {2}
순서대로 자리를 만들고 뒤에서 순서대로 넘어오는 값을 출력하는 형태입니다. {0}
, {1}
식으로 뒤에 이어 나올 값에 대한 자리 번호(인덱스)를 지정해 놓는 방법을 자리 표시자(Place Holder) 또는 서식 지정자(Format Specifier)라고 합니다. C#에서 순서를 나타내는 번호 인덱스는 0
부터 시작합니다.
다음 코드를 살펴보세요.
코드: PlaceHolder.cs
> Console.WriteLine("{0}", "Hello, C#");
Hello, C#
>
WriteLine()
에 {0}
형태로 0
번째 자리를 만들어 놓으면 콤마 뒤에 있는 "Hello, C#" 문자열이 {0}
자리에서 실행됩니다.
그림: 자리 표시자를 사용하여 문자열 출력하기
4.6.1. 동일한 자리 표시자 여러 개 사용하기
만약, 자리 표시자를 "{0} {0}", "Hello, C#" 형태로 지정하면 어떻게 될까요? 어떤 오류가 발생할까요?
다음 소스 코드를 입력한 후 실행해 보세요.
코드: PlaceHolderTwice.cs
> Console.WriteLine("{0}", "Hello, C#");
Hello, C#
> Console.WriteLine("{0}, {0}", "Hello, C#");
Hello, C#, Hello, C#
{0}
형태의 자리 표시자는 콤마 뒤에 오는 첫번째 문자열을 출력하는데 {0}, {0}
식으로 두 번 지정하면 문자열이 두 번 출력됩니다.
자리 표시자를 사용하여 문자열이 출력될 자리를 만들고 뒤에서 값을 채우는 방식을 사용하는 이유는 반복해서 사용하거나 출력되는 모양을 일괄적으로 바꿀 때 유용합니다.
4.6.2. 자리 표시자의 인덱스를 증가시켜 사용하기
하나 이상의 자리를 만들때에는 {0}
, {1}
, {2}
식으로 자리 표시에 대한 인덱스를 증가시켜 사용할 수 있습니다. 이때 주의할 점은 인덱스의 수와 뒤에서 지정할 내용이 일치하여야 합니다.
코드: PlaceHolderMulti.cs
> Console.WriteLine("{0}, {1}", "Hello", "C#");
Hello, C#
위 코드의 {0}
자리에서 "Hello"가 출력되고 {1}
자리에서 "C#"이 출력됩니다.
그림: 여러 개의 자리 표시자 지정하기
참고로, 자리 표시자를 2개 만들었는데 출력할 문자열을 하나만 넘겨주면 다음과 같은 식으로 에러가 발생합니다.
> Console.WriteLine("{0} {1}", "하나만 넘겨주면");
0에서 시작하는 인덱스는 0보다 크거나 같아야 하며 인수 목록의 크기보다 작아야 합니다.
4.6.3. 자리 표시자의 순서 변경하기
만약, 자리 표시자를 "{1} {0}", "Hello", "C#" 형태로 지정하면 어떻게 될까요? 어떤 오류가 발생할까요? 다음 소스 코드를 입력한 후 실행해 보세요.
***코드: PlaceHolderChange.cs ***
> Console.WriteLine("{1}, {0}", "Hello", "C#");
C#, Hello
자리 표시자의 번호 순서를 변경하면 콤마 뒤에 오는 순서대로 {0}
, {1}
순서의 자리에서 문자열이 표시됩니다.
그림: 자리 표시자의 순서 변경
기타, 자리 표시자에 대한 추가적인 정보는 부록의 자리표시자 주요 서식 부분
을 참고하세요.
4.7. 요약
참고로, 이 강의 전체에서는 C#의 모든 키워드에 대해서 다루지 않습니다. 예를 들어, volatile
과 같이 현업 개발자들도 어려워하는 키워드 및 문법들은 다루지 않고 반드시 알아야 하거나 한번 정도 경험해 보면 좋을 듯 한 내용들을 다룹니다. 모든 키워드와 명령어에 대한 정보는 Microsoft Learn 사이트를 참고하세요.