목차
변수(Variable)
중학교 수학을 배우신 분들은 ‘변수’가 이미 어떠한 역할을 하는지 알고 계실겁니다. 그렇습니다. 바로 그 변수와 프로그래밍에서 쓰이는 변수와 의미가 흡사합니다. 프로그래밍에서의 변수는 예를 들자면, 데이터가 들어가는 상자와 같습니다. 값을 저장할 수 있고, 우리가 필요할때는 그 값을 꺼내 참조할 수 있습니다. 타 프로그래밍 언어를 배우신 분들에게는 이미 ‘변수’란 말이 지긋지긋하게 느껴지실텐데, 이 강좌는 방금 C#에 입문한 분들을 대상으로 하므로 자세히 설명해드리겠습니다.
C#에서 변수를 선언하는 방법은 간단합니다. 데이터 형식과 식별자만 있으면 됩니다. 여기서 선언이란 ‘변수를 만든다’와 같은 의미로 쓰이는데 ‘선언하다’라는 말을 자주 씁니다. 데이터 형식은 정수, 실수, 문자열 등을 말합니다. 앞으로 ‘자료형’을 배우면서 자세히 다루게 될 부분입니다. 식별자는 변수의 이름을 의미합니다.
아래는 C# 프로그래밍에서 변수를 선언하는 방법입니다.
int a;
위의 코드는 ’10진수 정수형 변수를 메모리 공간에 할당하고 그 공간에 a라는 이름을 붙여줘!’라는 말과 같습니다. 저기서 int는 데이터 형식 그리고 a는 식별자입니다. 그리고 마지막에는 문장의 끝을 알리는 세미콜론(;)이 항상 붙습니다.

그러고는, 컴파일러가 어느 공간에다 메모리 공간을 할당해주고 이 공간에 a라는 이름을 만들어주죠. 그럼 우린 이 공간을 사용할 수 있게 된겁니다. 이제 이 공간에다 값을 넣어볼까요?
a = 1000;
위의 코드는 ‘a 변수에 1000이란 값을 대입해!’라는 말과 같습니다. 그러면 변수 a가 할당된 공간에 1000이란 값이 기록되는거죠. 이제 직접, 우리가 코드를 작성하고 컴파일을 해보도록 합시다. 우선 변수만 하나 선언하고 1000이란 값을 대입하여 그 변수의 값을 출력하는 예제를 보겠습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 1000; Console.WriteLine(a); } } }
1000 계속하려면 아무 키나 누르십시오 . . .
이미 결과를 예상하신 분들도 있겠지만, 12행을 보시면 선언과 함께 1000이란 값을 대입시키고 있습니다. 이것을 ‘변수의 초기화’라고 말합니다. 초기화란, 최초로 데이터를 할당하는 것을 말합니다. 선언과 초기화를 동시에 할수 있지만, 따로 할 수도 있다는 것도 알아두시기 바랍니다.
그리고, 데이터 형식이 같다면 그 형식의 변수들을 한줄에 여러번 선언할 수 있습니다. 예를 들면,
int a = 1000; int b = 2000; int c = 3000;
int a = 1000, b = 2000, c = 3000;
위의 두 코드는 같은 역할을 수행합니다. 대신 한줄에 여러번 선언할 경우에는 식별자 사이에 콤마(,)를 붙여 구분해 주어야 합니다. 그런데, int형으로 변수를 선언하게 되면 오로지 정수만 넣을 수 있습니다. 실수라던가, 문자열 등은 넣을 수 없다는 말과 같습니다. 당연히 C#에선 int형만 지원하는게 아닌 여러가지의 데이터를 표현할 수 있는 데이터 형식들을 지원합니다. 그 예로, char, long, short, byte 등을 예로 들수 있죠. 이제 이 데이터 형식에 대해 알아볼까 합니다.
기본 데이터 형식(Primitive Types)
C#에서 제공하는 기본 데이터 형식들 중 하나인 정수 형식, 실수 형식, 참과 거짓을 가리는 논리 형식 등을 아래의 표에 정리해 보았습니다.
구분 | 데이터 형식 | 크기(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~4294967295 |
정수 | long | 8 | -922337203685477508~922337203685477507 |
정수 | ulong | 8 | 0~18446744073709551615 |
문자 | 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; using System.Collections.Generic; using System.Linq; using System.Text; 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); } } }
a=200, b=-126, c=30000, d=40000, e=100000000, f=1000000000, g=1000000000000000000, h=10000000000000000000 계속하려면 아무 키나 누르십시오 . . .
위 예제를 보시면 long이나 ulong 같은 경우는 어마어마한 값을 저장할 수 있습니다. 데이터 형식 앞에 u가 붙으면 이것은 unsigned의 줄임말로, 양수를 의미합니다. 음수의 범위만큼 양수의 범위에 확장시켰다라고 생각해두시면 됩니다. 이부분은 비트를 다룰때 자세히 다룰 예정입니다.
실수 데이터 형식
이번에는 실수 데이터 형식을 다룹니다. 아래 예제는 float, double, decimal 형식으로 변수를 선언하여 값을 담고 그 값을 출력하는 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { float a = 123.567891011 f; double b = 1234.567878910111213; decimal c = 1234.56789101112131415161718 m; Console.WriteLine("a={0}, b={1}, c={2}", a, b, c); } } }
a=123.5679, b=1234.56787891011, c=1234.56789101112131415161718 계속하려면 아무 키나 누르십시오 . . .
유의하셔야 할 것은 float나 decimal 형식 같은 경우는 맨 뒤에 f나 m같은 접미사가 붙는다는 겁니다. 만약에 접미사가 없다면 아래와 같은 에러를 띄게 됩니다.
오류 1 double 형식의 리터럴을 암시적으로 'float' 형식으로 변환할 수 없습니다. 이 형식의 리터럴을 만들려면 'F' 접미사를 사용하십시오. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 12 23 ConsoleApplication1 오류2 double 형식의 리터럴을 암시적으로 'decimal' 형식으로 변환할 수 없습니다. 이 형식의 리터럴을 만들려면 'M' 접미사를 사용하십시오. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 14 25 ConsoleApplication1
문자, 문자열 데이터 형식
다음 예제는 문자, 문자열을 다루는 char, string 형식에 대한 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { char a = '안'; string b = "녕하세요"; Console.WriteLine("{0}{1}", a, b); } } }
안녕하세요 계속하려면 아무 키나 누르십시오 . . .
여기서 알아두셔야 할게 있다면, char 형 변수에는 문자만 들어갈 수 있으며, string 형 변수에는 문자열이 들어갈 수 있습니다. 즉, char형 변수에는 문자 하나만 들어갈 수 있으며, 싱글 쿼터(‘)로 감싸주어야 합니다. 그리고 string형 변수에는 한개 이상의 문자가 들어갈 수 있습니다. 한마디로 문자열은 문자들의 모임이라 표현할 수 있습니다. 문자열은 더블 쿼터(“)로 감싸줍니다.
논리 데이터 형식
다음 예제는 참과 거짓을 다루는 bool 형식에 대한 예제입니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { bool a = true; bool b = false; Console.WriteLine("a={0}, b={1}", a, b); } } }
a=True, b=False 계속하려면 아무 키나 누르십시오 . . .
bool 형식은 참(true), 거짓(false)만을 다룰 수 있습니다. 이 논리 데이터 형식은 나중에 배울 if문에서 많이 쓰이게 될겁니다. 지금은 ‘대충 이러하다’라는 것만 알아두시고 넘어가셔도 앞으로 강좌를 진행하는데 지장은 없습니다.
객체 형식
다음 예제는 객체(object)를 다루는 object 형식에 대한 예제입니다.
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); } } }
a=12345678910, b=12345.67891011, c=True, d=안녕하세요 계속하려면 아무 키나 누르십시오 . . .
위 결과를 보고 한가지 의문점이 생길것인데, 도대체 object 형식이 뭐길래 정수든, 실수든, 논리든, 문자열이든 모든 데이터를 담고 처리할수 있는 걸까요? 그것은 바로 나중에 배우게 될 “상속 관계” 때문입니다. 우리가 알고있는 상속 그대로 부모가 유산을 자식에게 물려주는 것과 같습니다. 부모에게 유산(데이터, 메소드)를 물려받은 자식은 부모가 가지고 있던 기능을 똑같이 수행할 수 있습니다. 이 object는 모든 데이터 형식의 최상위 부모 클래스, 즉 C#에서 모든 객체들은 object 클래스로 부터 상속을 받습니다. 한마디로 말하자면, ‘모든 데이터 형식의 조상은 object다!’라고 말할 수 있습니다. 객체(object)는 나중에 좀더 자세히 다룰 예정입니다.
형식 변환(Type Conversion)
말 그대로, 형식 변환이란 다른 데이터 형식에 옮겨 담기위해 데이터 형식을 변환하는 것을 말합니다. 여기에서는, 정수를 실수로 변환 또는 실수를 정수로 변환하거나, 실수, 정수를 문자열로 나타내거나, 문자열을 실수, 정수로 바꾸는 예를 보도록 하겠습니다. 우선은 정수를 실수로 변환하거나 실수를 정수로 변환하는 예입니다.
정수 -> 실수, 실수 -> 정수 형 변환
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 500; float b = (float)500; 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 계속하려면 아무 키나 누르십시오 . . .
결과를 보시면 정수에서 실수로 바꾸는 과정에선 문제가 없지만, 실수를 정수로 바꾸는 과정에서는 소숫점 아래는 모두 버림을 알 수 있습니다. 123.45에서 소숫점 아래의 45가 버려져서 123이란 값이 변수 d에 담긴것을 확인할 수 있습니다.
실수, 정수 -> 문자열, 문자열 -> 실수, 정수 형 변환
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int a = 500; float b = 60.44 f; 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 계속하려면 아무 키나 누르십시오 . . .
주목하셔야 할 부분은 14~15행과 21~22행에 쓰인 ToString이란 메소드와 Parse란 메소드입니다. ToString 메소드에 숫자를 넘기면 그 숫자가 문자열로 변환이 되어 저장이 됩니다. 반대로 Parse 메소드로 넘어온 값을 정수로 변환해주거나, 실수로 변환해줍니다. 참으로 유용하죠?
상수(Constant)
우리가 수천~수만줄이 넘어가는 프로그램을 만들게 될때, 수많은 변수들을 선언하여 코드를 작성하게 됩니다. 그러나, 이 수많은 변수들 중 값이 도중에 변경되어도 프로그램엔 영향을 미치지 않는 것과 도중에 변경되면 심각한 오류를 일으킬 수 있는 것들이 있습니다. 만약에, 코드를 작성하다가 나도 모르게 값을 변경하지 말아야 할 변수를 건들여서 버그가 발생할 수 있습니다. C# 프로그래밍은 이 문제를 쉽게 해결해주는 const라는 키워드가 존재합니다.
이 const 키워드를 사용하게 되면 한번 초기화 된값은 절대 변하지 않습니다. 상수를 정의하는 방법은 변수의 선언방법과 유사합니다. 아래는 상수의 선언 예입니다.
const double PI = 3.141592; const int month = 12;
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { const int a = 50; Console.WriteLine(a); } } }
50 계속하려면 아무 키나 누르십시오 . . .
위의 예제를 보아선 const 키워드의 특징을 파악할 수 없습니다. 만약 상수 a의 값을 변경하게 되면 어떻게 될까요?
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { const int a = 50; a = 60; // 오류 발생! Console.WriteLine(a); } } }
오류 1 할당식의 왼쪽은 변수, 속성 또는 인덱서여야 합니다. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 15 13 ConsoleApplication1
그대로, 한번 초기화 된 상수의 값은 변경이 불가능합니다. 그렇다면 상수의 선언과 초기화를 따로 하게되면?
오류 1 const 필드에 값을 입력해야 합니다. C:\Users\su6net\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 12 24 ConsoleApplication1
위와 같은 에러가 발생합니다. const 키워드의 특징을 정리하자면, 선언과 동시에 초기화를 하여야 하며 초기화가 된 후로부터는 값의 변경이 불가능합니다.
변수와 데이터 형식, 그리고 상수에 대한 설명은 끝났습니다. 여기까지 읽느라 수고하셨습니다.