안녕하세요. 애드라이프 입니다.
이전 포스팅에서 간단한 콘솔 프로그램을 제작해 보았고
실행해서 결과까지 지켜 보았는데 어려웠나요??
어려웠다면 차근차근 처음부터 다시 봐보시길 추천드려요!
댓글로 질문하셔도 좋구요~~
이번 포스팅에서는 데이터 형식에 대해서 다뤄볼 예정입니다.
뭐 프로그램을 접해보신 분들이라면 어렴풋이라도 알고 있을 겁니다.
byte, int, long, duble, char, string 등등 많이 보셨을 텐데요~
이번에는 좀더 원초적인 내용부터 시작해볼까 합니다.
변수 먼저 변수에 대해서 알아보겠습니다. 변수는 어떤한 형식의 값을 대입시켜 변화시킬수 있는 요소를 말합니다. 메모리 영역 측면에서 보면 데이터를 저장하고자 하는 공간을 확보하는 의미죠. 앞서 byte, int, long과 같은 데이터 형식을 언급했는데요. 변수의 구조는 int(데이터 형식) x(변수 이름) =(대입연산자) 1(데이터) ; (문장의 끝)
|
메모리 영역을 그림으로 표현하였습니다.
※ C#에서 변수 선언시 주의사항
C나 C++에서는 변수 초기화를 하지 않으면 해당변수에 원하지 않는 값이
대입되어 이상동작을 하는 경우가 있었습니다. C#에서는 컴파일러가 초기화
되지 않은 변수가 있을시 에러문구를 띄워 컴파일 자체를 막아버리기 때문에
반듯이 변수는 초기화 하는 습관을 들이는 것이 좋습니다.
위에서 언급한 메모리 영역은 사실 2가지 종류가 있습니다.
스택(STACK) 메모리와 힙(HEAP) 메모리입니다.
이 개념은 값 형식과 참조형식을 함께 다뤄야 하는데요.
하나씩 차근차근 다뤄보도록 하겠습니다.
스택과 값 형식 메모리 구조중 하나인 스택부터 설명하겠습니다. 우리가 벽돌을 쌓는다고 생각해보면 가정 먼저 쌓은 벽돌은 가장 밑에 위치하게 되고 가장 나중에 쌓은 벽돌은 가장 위에 위치하게 됩니다. 가장 먼저 쌓은 벽돌을 꺼내려면 나중에 쌓았던 벽돌을 다 치우고 나서 꺼낼 수 있죠. 이게 스택 메모리의 개념입니다.
값 형식 데이터는 모두 스택 메모리에 저장되며 스택 메모리에 저장된 데이터는 { (중괄호) 시작에 메모리에 쌓아서 } (중괄호) 끝에 메모리에서 제거됩니다. 여기서 단점이자 장점이 나타나는데요. 스택 메모리는 {}를 벗어나면 값을 유지할 수 없습니다. 값 형식 데이터가 어떤 것들이 있는지 궁금하실 텐데요. 우선은 거의 모든 형식의 데이터가 값형식 데이터라고 알고 계시면 될 것 같습니다. 다른 형식의 데이터는 설명하면서 언급하도록 하겠습니다. |
{
int x = 1;
int y = 2;
int z = 3;
}
|
힙과 참조 형식 힙 메모리는 스택 메모리의 한계인 데이터 보존을 가능하게 해줍니다. 참조형식의 데이터는 보존이 가능한 힙 메모리 영역에 데이터를 저장하고 스택에 힙영역의 데이터 주소값을 저장하는 구조로 되어있습니다. 단순히 스택에서는 실제 데이터가 저장되어 있는 힙 메모리의 주소값을 참조만하고 있는 형태이기때문에 참조형식 데이터라고 합니다. |
{
object x = 1;
object y = 2;
}
|
1 | |||
y = &2 | → | 2 | 2 |
x = &3 | → | 1 | 3 |
스택 | 힙 | 메모리 주소 |
표를 보면 알 수 있듯이 스택에서는 힙에 저장된 데이터 주소를 참조하고 있습니다.
중괄호가 끝나면 스택의 데이터는 사라지겠지만 힙의 데이터는 그대로 보존되죠!
1 | |||
2 | 2 | ||
1 | 3 | ||
스택 | 힙 | 메모리 주소 |
< 값 형식과 참조형식은 데이터 저장을 스택에 할 것인지 >
힙에 할 것인지에 대한 차이가 있습니다.
지금까지 변수와 메모리에 대한 내용을 다뤘습니다.
이제 본격적으로 데이터 형식에 대해서 설명하겠습니다.
가장 먼저 다뤄볼 데이터 형식은 숫자형입니다.
우선 숫자형 데이터 형식에는 어떤것들이 있는지 살펴볼까요?
데이터 형식 | 설명 | 크기(Byte) | 값의 범위 |
byte | 부호 없는 정수 | 1(8bit) | 0 ~ 255 |
sbyte | 부호 있는 byte | 1(8bit) | -128 ~ 127 |
short | 정수 | 2(16bit) | -32,768 ~ 32,767 |
ushort | 부호 있는 short | 2(16bit) | 0 ~ 65,535 |
int | 정수 | 4(32bit) | -2,147,483,648 ~ 2,147,483,647 |
uint | 부호 있는 int | 4(32bit) | 0 ~ 4,294,967,295 |
long | 정수 | 8(64bit) | -922,337,203,685,477,508 ~ 922,337,203,685,477,507 |
ulong | 부호 있는 long | 8(64bit) | 0 ~ 18,446,744,073,709,551,615 |
데이터 형식에 따라 담을 수 있는 크기가 다르기때문에
메모리를 쓸때없이 잡아먹지 않게 하기위해서는 쓰려고하는
데이터 크기에 맞춰 형식을 선정해 쓰는것이 좋습니다.
데이터 형식에 대한 개념을 확실하게 하기위해 간단한 콘솔 프로그램을
만들어 보겠습니다. 콘솔 프로젝트 만드는 방법은 아래 링크를 참고해주세요!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
using static System.Console;
namespace DataFormat
{
class Program
{
static void Main(string[] args)
{ /*정상범위 내에서 변수에 데이터 대입*/
byte x = 20; //0 ~ 255
sbyte y = -20; //-128 ~ 127
short a = -10000; //-32,768 ~ 32,767
ushort b = 10000; //0 ~ 65,535
int c = -10000000; //-2,147,483,648 ~ 2,147,483,647
int d = 10000000; //0 ~ 4,294,967,295
long e = -100000000000; //-922,337,203,685,477,508 ~ 922,337,203,685,477,507
long f = 100000000000; //0 ~ 18,446,744,073,709,551,615
WriteLine($"x={x},y={y},a={a},b={b}\nc={c},d={d},e={e},f={f}");
/*변수에 정상범위를 벗어나는 데이터 대입*/
//byte g = 1000; ////0 ~ 255
/*2진수, 10진수, 16 진수*/
byte h = 200; //10진수
byte i = 0b1100_1000; //2진수
byte j = 0xC8; //16진수
uint k = 0xABCD_ABCD; //16진수 변수형 unsigned int
WriteLine($"h={h},i={i},j={j}\nk={k}");
}
}
}
|
위 프로그램은 숫자형식의 데이터가 표기되는 방식과
데이터 크기보다 클때 어떤 오류가 나는지!! 그리고 보너스로
2, 10, 16진수에 대한 표기 방법까지 다루고 있습니다.
해당 프로그램을 빌드하여 실행해볼까요?
실행방법이 궁금하시다면 아래 링크를 참고해주세요.
해당 데이터 형식에 맞게 수를 대입할 경우에는
오류 없이 결과 같을 출력하는 것을 볼 수 있습니다.
진수 표현에서는 모두 10진수로 표기됩니다.
만약 위 프로그램에서 주석이 되어있는
//byte g = 1000; //0 ~ 255
이 부분을 풀고 빌드를 하면 어떤 결과가 나올까요?
컴파일러에서 위와 같은 에러문구를 확인 할 수 있습니다.
컴파일러가 하는 말을 잘 들어야 좋은 프로그램입니다!!
이번 포스팅에서는 숫자형 데이터 형식중에 <정수>
부분만 다루었습니다. 다음 포스팅에서는 다른 데이터 형식을 다뤄볼테니
계속해서 잘 따라와 주세요!
다음에는 더 유익한 포스팅으로 돌아오겠습니다!!
by 애드라이프
'C# 프로그래밍 > 기초 다지기' 카테고리의 다른 글
C# 프로그램 시작하기 - 데이터 형식 익히기 #3-2 (0) | 2020.04.06 |
---|---|
C# 프로그램 시작하기 - 데이터 형식 익히기 #3-1 (0) | 2020.04.04 |
C# 프로그램 시작하기 - 간단한 콘솔 프로젝트 만들기 #2.5 (0) | 2020.04.03 |
C# 프로그램 시작하기 - 간단한 콘솔 프로젝트 만들기 #2 (0) | 2020.04.02 |
C# 프로그램 시작하기 - 개발환경 구축 #1 (0) | 2020.04.01 |