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; // 오류 발생!
...
'프로그래밍 관련 > C#' 카테고리의 다른 글
C# 강좌 5편. 조건문(if, else, switch) [최근 수정 2017.11.10] (18) | 2018.01.12 |
---|---|
C# 강좌 4편. 연산자(Operators) [최근 수정 2017.10.29] (30) | 2018.01.12 |
C# 강좌 3편. 변수, 데이터 형식, 상수 [최근 수정 2017.10.29] (50) | 2018.01.12 |
C# 강좌 2편. Hello, world! [최근 수정 2017.11.27] (38) | 2018.01.12 |
C# 강좌 1편. 시작 (26) | 2018.01.12 |
C# 고급 2편. 링크(LINQ) (16) | 2013.07.15 |
프로그래밍을 처음 해보는 사람입니다.
Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
a={0} <-- 이 역할이 무엇인지 알고싶습니다. ^^;; 그냥 출력만 하는건줄알았는데 어디에 쓰는건지 잘 이해가 안가서요..
float a = 123.567891011f;
decimal c = 1234.56789101112131415161718m;
맨끝에 f와m이 오류가 뜬다는건 알겠는데 왜 해야하는거죠?
double c = 1234.567891011121314151617m;
암시적으로 'decimal' 형식을 'double' 형식으로 변환할 수 없습니다. 명시적 변환이 있습니다. 캐스트가 있는지 확인하십시오.라고 뜹니다 m이 뒤에 붙여져야하나요?
정수를 실수로 변환할떄 float b = (float)a; 이런식으로 (float)를 붙이셨는데 이게 어떤기능을 하는지 알 수 있을까요?
float b = a; 이런식으로 (float)를 때도 바른 실수값이 나오는것같아서 여쭤봅니다.
그리고 좋은강좌글 올려주셔서 감사합니다.
이렇게 좋은 자료 공유해 주셔서 너무 감사합니다,
너무 많은 도움이 되네요 !
감사히 글 잘 보고 있습니다. 근데 저같은 경우는 맨위 4개의 using 문에 더해 using System.Threading.Tasks라는 문장이 하나 더 있는데 이건 어떤 역할인가요? 그리고 다른 프로그램의 코딩문을 봐도 using 문이 3개가 있기도 하고 4개가 있기도 하고 저처럼 5개가 있기도 한데 이 차이는 어디서 생기는지요...?
좋은 강의 감사합니다.
명시적 형변환에서 500이라는 정수값을 float이라는 말로 저장했을때 출력이 500이더라고요.
이거는 자동으로 소숫점 뒷자리를 표현해주지 않은건가요?
오늘 처음 접하는데 이해가 잘 되네요 공부 잘하겠습니다 감사합니다.
좋아요 머리에 쏙쏙 들어오네요
좋은 게시글 감사합니다~!
한가지 질문이 있어서요 int형을 char형으로 변환하는 법은 없을까요?
오늘 처음 시작하는 초보입니다. 궁금한게 있는데요, Console.WriteLine() 이 안에는 중괄호를 쓰지 않으면 두 개의 변수를 같이 나타낼 수 없나요?
그리고 Console.WriteLine("{0}{1}", a, b); 여기에서 "{0}{1}"은 무슨 역할이죠?
원래 귀찮아서 댓글 잘 안남기는데요..
진짜 저 완전 쌩초보자인데 알기 쉽게 강의해주시네요
진짜 너무너무 감사드려요 !!!!
안녕하세요, 개발 공부를 해보려고 검색하다가 하나씩 읽어 나가고 있습니다.
아무것도 모르는 사람도 이해하기 쉽게 정리해주셔서 대단히 감사합니다.
소수점 표기시 7이사라졋는데 그 이유는 무엇인가요?
정수와 실수 간의 형식 변환 예시코드 10번째 줄에서 의도하신 것이 이것인가요?
10 float b = a;
안녕하세요! 질문드릴께 있어서 코멘트를 작성합니다.
상수에 대한 예제에서 1,2번 행에
const double PI = 3.141592;
const int month = 12;
이 부분은 왜 입력을 하는 것인가요? 어떤 의미가 있는건가요?
알려주시면 감사하겠습니다.
세상에 너무 쉽게 설명 해주시네요. 진짜 강의비를 드려야 합니다. 소박하지만 후원금같은 계좌는 없나요. 프로그램 의뢰도 하고 싶네요.
질문 드립니다!
할 때 터미널만 나오게 하는 방법이 있나요
질문 드립니다!
할 때 터미널만 나오게 하는 방법이 있나요