C# 프로그래밍 3번째 시간 - 서식지정자와 상수
유니티의 세걸음, C# 공부시작 17일차
오랜만에 포스팅을 하게 되네요.. 최근에 훈련이 있어서 바쁘기도 하였고, 글을 쓰려면 사이버지식정보방에서 해야되는데, 컴퓨터의 오류로 한동안 작성하지 못했습니다..ㅜㅜ
대신 남은 시간동안 포스팅에 관련된 내용들을 공부하여서 좀 더 수월하게 작성할 수 있을 것 같습니다!!
본격적인 공부를 시작하겠습니다! 오늘은 시석지정자와 상수에 대해서 배우겠습니다!
서식지정자 (Format Specifier)
서식 지정자는 우리가 지정한 형식대로 문자열을 출력할 수 있도록 도와줍니다. 예시를 먼저 들겠습니다.
int a = 81, b = 27;
Console.WriteLine("{0} + {1} = {2}", a, b, a + b); // 81 + 27 = 108
Console.WriteLine("{1} - {0} = {2}", a, b, b - a); // 27 - 81 = -54
여기서 차례대로 {0}은 a, {1}은 b, {2}는 a+b가 됩니다. 사용하는 형식은 이러합니다.
{인덱스[, 출력 너비][:서식 문자열]} 여기서 대괄호로 쓴 것은 선택적인 요소라서 보통은 잘 쓰지않습니다.
인덱스는 0부터 시작하는데, 이는 위에 “a,b,a+b”같이 열거된 값의 순서라고 생각하면 됩니다.
이에 관련된 수치 서식 문자열을 표로 정리하고, 이를 활용한 예제를 만들어보겠습니다.
서식 | 종류 | 사용 예시 | 출력 예시 |
---|---|---|---|
c / C | 통화 Currency |
{0:c} | \12,345 |
d / D | 10진법 Decimale |
{0:d} | 12345 |
e / E | 지수 표기법 Exponential Notation |
{0:e} | 1.2345000e+004 |
f / F | 고정 소수점 Fixed Point |
{0:f} | 12345.00 |
g / G | 일반 General |
{0:g} | 12345 |
n / N | 숫자 Number |
{0:n} | 12,345.00 |
x / X | 16진법 Hexadecimal |
{0:x} | 3039 |
p / P | 백분율 Percentage |
{0:p} | 23.45% |
[수치 서식 문자열을 활용한 예제]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int a = 12345678;
double b = 12.345678;
Console.WriteLine("통화 (C) . . . : {0:C}", a);
Console.WriteLine("10진법 (D) . . : {0:D}", a);
Console.WriteLine("지수 표기법 (E): {0:E}", b);
Console.WriteLine("고정 소수점 (F): {0:F}", b);
Console.WriteLine("일반 (G) . . . : {0:G}", a);
Console.WriteLine("숫자 (N) . . . : {0:N}", a);
Console.WriteLine("16진법 (X) . . : {0:X}", a);
Console.WriteLine("백분율 (P) . . : {0:P}", b);
}
}
}
이에 따른 출력은 이러합니다.
통화 (C) . . . : \12,345,678
10진법 (D) . . : 12345678
지수 표기법 (E): 1.234568E+001
고정 소수점 (F): 12.35
일반 (G) . . . : 12345678
숫자 (N) . . . : 12,345,678.00
16진법 (X) . . : BC614E
백분율 (P) . . : 1,234.57%
또 사용자 지정 수치 서식 문자열에 대한 표를 정리해보고, 이에 따른 예시를 쓰겠습니다.
서식 | 종류 | 사용예시 | 출력예시 |
---|---|---|---|
0 | 0자리 표시 | {0:00.0000} | 12345.1200 |
# | 10진수 자리 표시 | {0:#.##} | 12345.12 |
. | 소수점 | {0:0.0} | 12345.12 |
, | 천 단위 자릿수 표시 | {0:0.0} | 12,345 |
% | 백분율 자리 표시 | {0:0%} | 1234512% |
e | 지수 표기법 | {0:00e+0} | 12e+3 |
참고로 0과 #차이를 보자면 -> 0은 서식 문자열에서 0이 있는 위치가 숫자가 있으면 숫자를 출력하고,
없으면 0으로 출력하며
#은 서식 문자열에 #이 있는 위치에 숫자가 있으면 출력하고, 숫자가 없으면 출력하지 않습니다.
[사용자 지정 수치 서식 문자열을 활용한 예제]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int a = 1234;
double b = 12.345678;
Console.WriteLine("0 자리 표시 (0) . . . .: {0:00000}", a);
Console.WriteLine("10진수 자리 표시 (#) . : {0:#####}", a);
Console.WriteLine("소수점 (.) . . . . . . : {0:0.00000}", b);
Console.WriteLine("천 단위 자릿수 표시 (,): {0:0,0}", a);
Console.WriteLine("백분율 자리 표시 (%) . : {0:0%}", b);
Console.WriteLine("지수 표기법 (e) . . . .: {0:0.000e+0}", b);
}
}
}
이에 따른 결과는 이러합니다.
0 자리 표시 (0) . . . .: 01234
10진수 자리 표시 (#) . : 1234
소수점 (.) . . . . . . : 12.34568
천 단위 자릿수 표시 (,): 1,234
백분율 자리 표시 (%) . : 1235%
지수 표기법 (e) . . . .: 1.235e+1
또 출력너비를 지정하고, 값을 왼쪽, 또는 오른쪽으로 정렬하는 예제를 보겠습니다.
[출력너비 지정 및 값 정렬 예시]
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int a = 12345;
Console.WriteLine("|{0,15}|", a);
Console.WriteLine("|{0,-15}|", a);
Console.WriteLine("|{0,15:N0}|", a);
Console.WriteLine("|{0,-15:N0}|", a);
}
}
}
이에 따른 출력결과는,
| 12345|
|12345 |
| 12,345|
|12,345 |
로 나옵니다.
여기서, |{0,15}|
와 같이 적으면 바로 오른쪽 맞춤이 되고, |{0,-15}|
로 출력 너비 앞에 -을 붙이면 왼쪽맞춤이 되는 것을 확인할 수 있습니다.
|{0,15:N0}|
은 출력 너비 지정과 앞부분의 서식 문자열을 같이 활용하였습니다.
형식 변환 (Type Conversion)
형식 변환은 특정 형식의 값을 우리가 원하는 형식의 값으로 변환하는 것을 의미합니다.
따라서, 어떤 형태이건 우리가 원하는 형식으로 바꿀 수 있다는 의미입니다. 다양한 예제를 보면서 풀어나가겠습니다!
정수와 실수 간의 형식 변환
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int a = 500;
float b = a; // 암시적 변환으로 별도의 구문이 필요하지 않음
Console.WriteLine("a={0}, b={1}", a, b);
double c = 123.45;
int d = (int)c;
Console.WriteLine("c={0}, d={1}", c, d);
}
}
}
이에 따른 출력결과는
a=500, b=500
c=123.45, d=123
입니다.
여기서 중요한 것은, 정수를 실수로 변환하는 것은 데이터손실이 없어서 암시적 변환이라고 부릅니다. 여기서 암시적 변환은 일반적으로 형식 변환이 안전하고 데이터 손실의 우려가 없을 경우 컴파일러에 의해 수행되는 변환을 의미합니다.
반대로, 실수를 정수로 바꾸는 과정에서는 소수점이하가 모두 버려지면서 데이터 손실이 일어납니다. 여기서 사용하는 변환은 명시적 변환으로, 데이터손실이 일어나도 형식 변환을 컴파일러에게 요구하는 형식입니다.
실수와 정수를 문자열로 변환, 문자열을 실수나 정수로 형식 변환
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int a = 500;
float b = 60.44f;
string c = a.ToString();
string d = b.ToString();
Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
string e = "123";
string f = "123.456";
int g = int.Parse(e);
float h = float.Parse(f);
Console.WriteLine("e={0}, f={1}, g={2}, h={3}", e, f, g, h);
}
}
}
이에 따른 결과는
a=500, b=60.44, c=500, d=60.44
e=123, f=123.456, g=123, h=123.456
로 나옵니다.
여기서 봐야되는 것은 ToString()이라는 메소드와 Parse()란 메소드입니다. ToString()은 특정 형식의 값을 문자열 형식으로 바꿔주고, Parse()은 문자열을 정수나 실수로 바꿔줍니다.
상수
우리가 나중에 큰 프로그램을 만들 것입니다. 거기에는 수만 줄이 넘어갈텐데, 여기서 다양한 변수를 선언하면서 코드를 만들 것입니다. 근데, 많은 변수들에서 변경되면서 프로그램에 영향을 미치는 것과 미치지 않은 것이 있습니다.
프로그램에 영향을 미친다면, 프로그램에 큰 오류가 발생하겠죠?
이런 문제를 대비해서 C#프로그래밍에는 이런 문제를 쉽게 해줄 수 있는 const라는 키워드가 있습니다!
const키워드는 사용하면 한번 초기화를 시킨 값은 절대 변하지 않습니다. 상수를 정의하는 것은 변수를 선언하는 것과 비슷합니다. 예시를 들어보겠습니다.
const double PI = 3.141592;
const int month = 12;
이를 활용하여 예제를 만들어보겠습니다.
상수 이용 예제
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
const int a = 50;
Console.WriteLine(a);
}
}
}
이에 따른 결과는 50으로 나옵니다.
이 예제는 a라는 상수에 50이라는 값을 초기화시켜준 것과 동일합니다. 아직 값을 바꾸지 않아서 const의 역할을 하지 않았습니다. 그러면 상수 a의 값을 바꿔보겠습니다.
상수 이용 및 값 변환 예제
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
const int a = 50;
a = 60;
Console.WriteLine(a);
}
}
}
이렇게 임의적으로 값을 바꿔버린다면, 오류가 발생합니다. 이를 통해 상수의 값은 변경을 할 수 없다는 것을 알았습니다.
또한, 상수의 선언과 초기화를 분리하면 오류가 발생합니다. const int a; a=60;처럼 하게 된다면, const필드에 값을 바로 입력해야되는데, 입력하지 않았기 때문에 오류가 발생합니다.
마무리하며
오늘 배운 부분들중 서식지정자는 잘 쓰이지를 않는 것 같고, 앞으로도 잘 쓰질 않을 것 같습니다. 아직 공부 초기단계라 잘 모를수도 있는데, 차후 프로그래밍하면서 기대해보겠습니다!!
앞으로는 포스팅을 좀 더 자주 해보는 것을 바라면서, 다음 시간은 C에서도 기초적이면서 중요한 연산자에 대해서 공부해보겠습니다.
Comments