C# 강좌 3편. 변수, 데이터 형식, 상수 [최근 수정 2017.10.29]
1. 변수(Variable)
변수(variable)란 무엇일까요? 이미 익히 들어보신 분도 계실 거라 생각합니다. 변수는 쉽게 말하면 값을 담아 두는 상자와 같습니다. 변수는 하나의 데이터 값을 가질 수 있으며, 한번 정해진 값은 고정되어 있는 게 아니라 계속해서 변할 수 있습니다. 마치 수학의 변수와 비슷하죠!
변수는 값을 담아 두는 상자와 같다
또한, 이 변수라는 녀석은 담기는 음식에 따라 그릇이 달라지듯 담기는 데이터에 따라 변수의 자료형(data type)이 결정됩니다. 예를 들어, 문자는 문자를 담을 수 있는 char 자료형이, 정수는 정수를 담을 수 있는 int라는 자료형 등과 같이 말이죠. 그럼 우리는 어떻게 해서 이러한 변수를 만들 수 있을까요?
아래와 같이 자료형과 변수명을 가지고 변수를 만들 수 있습니다. 지금부터는 '변수를 만든다'가 아닌 '변수를 선언한다'와 같이 설명할 것입니다. 여기서의 선언(declaration)은 컴파일러에게 어떤 대상의 이름을 알려주는 것을 의미합니다. 컴파일러가 임의의 메모리 공간에 이름을 붙여주면, 우리는 변수의 이름을 가지고 그 메모리의 위치에 접근할 수 있습니다.
자료형 변수명;
그럼 아래와 같은 변수 선언은 어떻게 해석할 수 있을까요?
int a;
위의 코드는 '10진수 정수형 변수를 메모리 공간에 할당하고 그 공간에 a라는 이름을 붙여줘!'라는 말과 같습니다. 여기서 int는 자료형에 해당하고, a는 변수명에 해당하게 됩니다. 그리고 마지막에는 문장의 끝을 알리는 세미콜론(;)이 항상 붙습니다.
<10진수 정수형 변수 메모리 할당>
그러고는, 컴파일러가 임의의 공간에다 메모리 공간을 할당해주고 이 공간에 a라는 이름을 만들어주죠. 그럼 우린 이 공간을 사용할 수 있게 된겁니다. 이제 이 공간에다 값을 넣어볼까요?
a = 1000;
위의 코드는 '변수 a에 1000이란 값을 대입해!'라는 말과 같습니다. 그러면 변수 a가 할당된 공간에 1000이란 값이 기록되는거죠. 참고로, 위에서 쓰인 '='은 수학에서 같음을 나타내는 '='와는 의미가 다릅니다. '할당' 혹은 '대입'의 의미를 가지고 있습니다. 등호를 기준으로, 우측의 값을 좌측으로 넘기는 역할을 합니다.
이제 직접, 우리가 코드를 작성하고 컴파일을 해보도록 합시다. 우선 변수만 하나 선언하고 1000이란 값을 대입하여 그 변수의 값을 출력하는 예제를 보겠습니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int a;
a = 1000;
Console.WriteLine(a);
}
}
}
int a = 1000;
int a = 1000;
int b = 2000;
int c = 3000;
int a = 1000, b = 2000, c = 3000;
구분 | 데이터 형식 | 크기(Byte) | 값의 범위 |
정수 | byte | 1 | 0~255 |
정수 | sbyte | 1 | -128~127 |
정수 | short | 2 | -32,768~32,767 |
정수 | ushort | 2 | 0~65535 |
정수 | int | 4 | -2,147,483,648~2,147,483,647 |
정수 | uint | 4 | 0~4,294,967,295 |
정수 | long | 8 | -922,337,203,685,477,508~922,337,203,685,477,507 |
정수 | ulong | 8 | 0~18,446,744,073,709,551,615 |
문자 | char | 2 |
|
실수 | float | 4 | -3.402823e38~3.402823e38 |
실수 | double | 8 | -1.79769313486232e308~1.79769313486232e308 |
실수 | decimal | 16 | ±1.0x10e-28~±7.9x10e28 |
문자열 | string | ||
논리 | bool | 1 | true, false |
객체 | object |
|
정수 자료형:
우선 정수 자료형부터 다뤄보도록 합시다. 아래 예제는 변수를 각각 byte, sbyte, short, ushort, int, uint, ulong 타입으로 선언하여 값을 담고 그 값을 출력시키는 예제입니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
byte a = 200;
sbyte b = -126;
short c = 30000;
ushort d = 40000;
int e = 100000000;
uint f = 1000000000;
long g = 1000000000000000000;
ulong h = 10000000000000000000;
Console.WriteLine("a={0}, b={1}, c={2}, d={3}, e={4}, f={5}, g={6}, h={7}", a, b, c, d, e, f, g, h);
}
}
}
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
float a = 123.567891011f;
double b = 1234.567878910111213;
decimal c = 1234.56789101112131415161718m;
Console.WriteLine("a={0}, b={1}, c={2}", a, b, c);
}
}
}
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
char a = '안';
string b = "녕하세요";
Console.WriteLine("{0}{1}", a, b);
}
}
}
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool a = true;
bool b = false;
Console.WriteLine("a={0}, b={1}", a, b);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
object a = 12345678910;
object b = 12345.67891011;
object c = true;
object d = "안녕하세요";
Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
}
}
}
{인덱스[, 출력 너비][:서식 문자열]}
예를 들어서, 아래와 같은 코드에서는 각각 어떠한 값을 출력해 낼까요?
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
이제 좀 감이 오시나요? 이번에는 다양한 서식 문자열을 사용하여 출력해 보도록 하겠습니다. 아래는 수치 서식 문자열을 정리해둔 표입니다.
서식 |
종류 |
사용 예 |
출력 예 |
c / C | 통화 Currency | {0:c} | \12,345 |
d / D |
10진법 Decimal |
{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 ConsoleApplication1
{
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);
}
}
}
결과:서식 |
종류 |
사용 예 |
출력 예 |
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이 있는 위치에 숫자가 있다면 숫자를 그대로 출력하고, 그렇지 않다면 0을 출력합니다. 10진수 자리 표시(#)는 서식 문자열에서 #이 있는 위치에 숫자가 있다면 숫자를 그대로 출력하는 것은 같지만, 숫자가 없을 경우에는 아무것도 표시하지 않습니다.
아래의 예제를 통해 직접 확인해 보도록 합시다.
using System;
namespace ConsoleApplication1
{
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);
}
}
}
결과:using System;
namespace ConsoleApplication1
{
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);
}
}
}
결과:using System;
namespace ConsoleApplication1
{
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);
}
}
}
using System;
namespace ConsoleApplication1
{
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);
}
}
}
5. 상수(Constant)
우리가 수천 줄에서 수만 줄이 넘어가는 프로그램을 만들게 될 때, 수많은 변수를 선언하여 코드를 작성하게 됩니다. 그러나, 이 수많은 변수 중 값이 도중에 변경되어도 프로그램엔 영향을 미치지 않는 것과 도중에 변경되면 심각한 오류를 일으킬 수 있는 것들이 있습니다. 만약에, 코드를 작성하다가 나도 모르게 값을 변경하지 말아야 할 변수를 건드려서 버그가 발생할 수 있습니다. C# 프로그래밍은 이 문제를 쉽게 해결해주는 const라는 키워드가 존재합니다.
이 const 키워드를 사용하게 되면 한번 초기화 된 값은 절대 변하지 않습니다. 상수를 정의하는 방법은 변수의 선언방법과 유사합니다. 아래는 상수의 선언 예입니다.
const double PI = 3.141592;
const int month = 12;
예제를 직접 보도록 하겠습니다.
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
const int a = 50;
Console.WriteLine(a);
}
}
}
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
const int a = 50;
a = 60; // 오류 발생!
Console.WriteLine(a);
}
}
}
...
const int a;
a = 60; // 오류 발생!
...