C# 기본 입출력 Console.WriteLine – C# 초급 6

C# 기본 입출력 Console.WriteLine

콘솔(Console)

Console 클래스의 WriteLine 메소드는 콘솔창에 기본 출력을 합니다. 우선 콘솔이란 단어의 생소함을 어떻게 해봐야 겠습니다. 콘솔(Console) 영어의 뜻이 여러가지라 혼동하기 쉬운 단어입니다. 터미널(Terminal) 쉘(Shell) 과도 헷갈리는 단어이지요. 이 질문은 흔한 질문으로 유튜브 검색으로 봐도 많은 사람들이 혼동한다는 것을 알 수 있습니다.

콘솔은 CLI(명령 라인 인터페이스) 입출력을 표시하는 매개체입니다. 우리가 윈도우즈나 Mac 에서 사용하는 GUI 가 아니라 CLI 에서 보는 화면이 콘솔입니다. 물론 화면이 콘솔은 아닙니다. 콘솔은 사용자의 입력을 받고 출력하는 매개 역할을 합니다. 표준 입출력 개념을 알아야 하는데요. 컴퓨터의 입력 방법에는 여러가지가 있지만 표준은 키보드입니다. 마우스, 카메라, 마이크 이런 것들도 다 입력장치인데 기본은 키보드입니다. 콘솔은 키보드 입력을 받아서 모니터 스크린에 출력합니다.

입출력은 데이터가 흐르는 방향 개념입니다. 데이터를 받는 쪽이 입력(Input)이고 데이터를 내보내는 쪽이 출력(Output)입니다. 컴퓨터 파일(File)은 가장 대표적인 입출력 매체입니다. 메모장에 입력한 텍스트를 저장하면 파일에 출력하는 것이고 저장한 파일을 메모리로 불러오면 파일의 내용을 메모리에 입력하는 것 입니다.

어떤 프로그래밍 언어라도 기본 입출력(Standard Input/Output) 시스템이 있는데 일반적으로 콘솔(Console)이라고 부릅니다. 사용자는 콘솔을 사용해서 프로그램 안에 있는 내용을 확인하여 개발도구로 사용하기도 하고 콘솔로 작동하는 프로그램도 개발할 수 있습니다. GUI 프로그램이 활성화되기 이전 시대에는 콘솔 프로그램을 사용했습니다. MS-DOS의 프로그램을 보면 텍스트 메뉴의 번호를 선택하는 방식이나 또는 실행시 인수(Argument)를 지정하는 방식이 대부분이었는데 그것은 콘솔 프로그램의 특징입니다.

다소 길게 설명했습니다만, 오늘날 프로그래밍 언어의 학습자들이 콘솔을 이해하기에는 너무 과거의 유물이 되어버린 것 같지만 콘솔은 프로그래머에게는 여전히 가장 중요한 도구 중 하나입니다. C# 학습과정에서 그리고 앱 개발 과정에서 많은 시간을 콘솔 창에서 보내게 됩니다.

Console.Write

Console 은 .NET의 CLR이 제공하는 BCL 클래스입니다. C#뿐 아니라 Visual Basic .Net 등의 언어들이 .NET 환경에서 사용할 수 있습니다.

Write는 Console 의 멤버이며 텍스트 문자열을 프로그램의 콘솔창으로 보냅니다. 문자열은 큰따옴표로 ” ” 감싸야 합니다. C#에서 큰따옴표로 ” ” 감싼 리터럴은 문자열이고, 작은 따옴표 ‘ ‘ 로 감싼 리터럴은 문자입니다. 아래 코드는 Hello World 문자열을 콘솔창에 출력합니다.

Console.Write("Hello World!");

[실행]
Hello World!

String 객체를 전달하는 방법은 아래와 같습니다.

String s1 = "Hello World!";
Console.Write(s1);

[실행]
Hello World!

Write 메소드에는 이스케이프 시퀀스를 사용할 수 있습니다. \n을 사용해서 다음 라인에 출력합니다.

String s1 = "Hello World!\n";
Console.Write(s1);
Console.Write(s1);

[실행]
Hello World!
Hello World!

Console.WriteLine

WriteLine 도 Console 의 멤버입니다. Write 와 하는 일은 같지만 개행문자 \n 가 추가되서 문자열이나 변수 등을 출력할 때 편리하게 사용합니다.

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

[실행]
Hello World!
Hello World!
Hello World!

문자열 결합

문자열 결합(concatenate)은 + 연산자를 사용합니다.

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

[실행]
Hello World!

숫자 타입과 문자열을 결합할 수도 있습니다. 이 경우 문자열로 자동 변환됩니다. Console.WriteLine(“She is ” + age.ToString() + ” years old”); 와 같습니다.

int age = 25;
Console.WriteLine("She is " + age + " years old");

String.Format(복합 형식 지정)

String.Format 메서드는 변수나 식의 값을 다른 문자열에 삽입하는 경우에 사용합니다. String 객체에 저장합니다. 보면 {0} {1} {2} 의 표시된 마커가 순서에 따라 후의 변수들로 대체됩니다. 문자열 결합 방식보다 정리가 잘 됩니다. 각 마커의 위치는 자유롭게 지정할 수 있고 여러번 사용될 수 있습니다. 마커의 인덱스인 { } 안의 숫자는 범위를 벗어나면 런타임 에러 (out of index range)를 발생시키므로 컴파일 시에 나타나지 않습니다. 필요한 경우 Exception 처리를 하도록 합니다.

int newPrice = 3000;
int oldPrice = 2500;

String s1 = String.Format("The new price is {0}. The old one is {1}", newPrice, oldPrice);
Console.WriteLine(s1);

// 실행: The new price is 3000. The old one is 2500

WriteLine 에 직접 String.Format 처럼 사용할 수 있습니다.

int newPrice = 3000;
int oldPrice = 2500;

Console.WriteLine("The new price is {0}. The old one is {1}", newPrice, oldPrice);

// 실행: The new price is 3000. The old one is 2500

문자열 보간 (String interpolation)

문자열 앞에 $ 가 나오면 보간된 문자열로 식별합니다. 위의 String.Format과는 작동방식이 차이가 있습니다. String.Format은 변수를 문자열 마커에 대체하는 방식입니다. 반면 분자열 보간은 $”문자열 {변수}” 처럼 변수를 직접 사용합니다. 더 쉽고 편리한 구문으로 이 기능은 C# 6부터 사용할 수 있습니다.

int var1=7, var2=3, var3=4;
            
Console.WriteLine($"var1 : {var1} \nvar2 : {var2}\nvar3 : {var3}");

[실행결과]

var1 : 7
var2 : 3
var3 : 4

복잡한 출력을 할 때 가독성이 더 좋아서 코드의 유지보수가 수월합니다.

String name = "John";
int age = 31;
String city = "New York";
String work = "IT company";
String job = "Programmer";
int careerYear = 8;

Console.WriteLine($"{name} is {age} years old. He lives in {city} and works for a {work}." +
                  $"He has been a {job} for {careerYear} years now he starts thinking starting his own company");

[실행]

John is 31 years old. He lives in New York and works for a IT company.He has been a Programmer for 8 years now he starts thinking starting his own company

정렬 지정자 (Alignment Specifier)

콘솔 출력시 많은 경우 일정한 포맷을 사용합니다. 좌표를 정해 위젯을 출력하는 GUI와 달리 콘솔창은 규칙이 빡빡한데요. 다음 코드의 정렬은 유용합니다.

Console.WriteLine("|{0, 5}|",1);
Console.WriteLine("|{0, 5}|",10);
Console.WriteLine("|{0, 5}|",100);
Console.WriteLine("|{0, 5}|",1000);
Console.WriteLine("|{0, 5}|",10000);
Console.WriteLine("|{0, -5}|",1000);
Console.WriteLine("|{0, -5}|",100);
Console.WriteLine("|{0, -5}|",10);
Console.WriteLine("|{0, -5}|",1);

[실행]

|    1|
|   10|
|  100|
| 1000|
|10000|
|1000 |
|100  |
|10   |
|1    |

문자열 보간에서도 동일하게 적용됩니다. 세부사항은 MS의 C#문서를 참고 하도록 합니다.

int myVar = 300;
Console.WriteLine($"myVar : [{myVar, 5}]");
Console.WriteLine($"myVar : [{myVar, -5}]");

[실행결과]
myVar : [  300]
myVar : [300  ]

형식 필드 (Format Field)

형식필드는 숫자 표현에 관한 형태를 지정합니다. 아래는 문자열 보간의 형식필드 사용법입니다. Double 형 숫자 타입을 다양한 방식으로 표기할 수 있습니다.

double myDouble = 9.7531;

Console.WriteLine($"myDouble : |{myDouble, 7:G}| - general");
Console.WriteLine($"myDouble : |{myDouble, -7}| - default");
Console.WriteLine($"myDouble : |{myDouble, -7:F1}| - Fixed 1 dec");
Console.WriteLine($"myDouble : |{myDouble, -7:F2}| - Fixed 2 dec");
Console.WriteLine($"myDouble : |{myDouble, -7:F3}| - Fixed 3 dec");
Console.WriteLine($"myDouble : |{myDouble, -7:F4}| - Fixed 4 dec");
Console.WriteLine($"myDouble : |{myDouble, -7:C}| - Currency");
Console.WriteLine($"myDouble : |{myDouble, -7:E}| - Scientific Notation");

[실행]
myDouble : | 9.7531| - general
myDouble : |9.7531 | - default
myDouble : |9.8    | - Fixed 1 dec
myDouble : |9.75   | - Fixed 2 dec
myDouble : |9.753  | - Fixed 3 dec
myDouble : |9.7531 | - Fixed 4 dec
myDouble : |\10    | - Currency
myDouble : |9.753100E+000| - Scientific Notation

C#에서는 9개의 Standard format specifiers 를 사용합니다. 역시 세부사항은 MS의 문서를 참고합니다.

요약

C# 기본 입출력 중에 콘솔 출력을 담당하는 Console.Write, WriteLine에 대해서 알아봤습니다. 프로그램을 작성하며 문자열 처리에 많은 시간을 들이게 됩니다. 문자열은 프로그래머가 운영체제와 소통하는 매개체이며 사용자가 앱을 사용하는 인터페이스기도 합니다. 초보자 중에는 프로그래밍의 세계가 화려한 3D VR 이나 마법과 같을 것이라고 생각하는 사람도 있지만 실제로는 문자열 입출력을 통해 하루종일 컴퓨터와 소통하는 시간이 많습니다. 콘솔 창은 화려한 앱의 UI, GUI 에 비해 별볼일 없어 보일지 모르지만 숙련된 프로그래머는 이것으로 수많은 일을 처리 할 수 있습니다. CPU와 메모리를 바이트 단위로 조작하고 지구 반대편의 네트워크에 접속하여 데이터를 받아오는 일까지 콘솔창으로만으로도 가능합니다.

콘솔창 없이 할 수 있는 일이 별로 없기에 프로그래밍을 시작하면 가장 먼저 학습해야 하는 내용이긴 한데 문제는 처음에는 무진장 지루합니다. 콘솔창은 컴퓨터가 아닌 것 처럼 느껴집니다. 하지만 초기에 약간의 지루함을 견디면 그 후에 콘솔창의 진정한 가치를 알게 되고 멋진 앱을 개발할 수 있게 될 것 입니다.

문자열 보간(String Interpolation)과 형식 지정자(Format Specifier)는 편리합니다. 다만 C# 6 이전 버전에는 복합 형식 지정(String.Format) 형식을 사용하는 코드가 남아 있으므로 둘다 알고는 있어야 합니다. 형식 지정자의 사용은 거의 똑같으므로 적응이 어렵지는 않습니다. 워낙 많은 기능이 있으니까 모든 것을 다 외울 필요는 없고 필요할 때 MS의 C#문서를 참조하도록 합니다.

참고문서 링크

https://docs.microsoft.com/ko-kr/dotnet/api/system.string.format?view=net-6.0#Starting

https://docs.microsoft.com/ko-kr/dotnet/standard/base-types/composite-formatting

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/tokens/interpolated

https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings

Leave a Comment