개탕 IT FACTORY

C#데이터형식과 타입 (1) 본문

프로그래밍/c# 프로그래밍

C#데이터형식과 타입 (1)

rendar02 2018. 3. 16. 21:23
반응형

오늘은 C#에서 데이터 형식과 타입에 대해서 배워볼까 합니다.


C# 데이터 형식


c#에서 구성하는 데이터 타입은 기본데이터와 복합데이터가 존재 

복합데이터는 구조체와 클래스,배열 그리고 이미지나 소리도 나타낼수 있다 ---> 일단 추후에 



쉽게 말해서 기본데이터복합데이터가 존재한다고 생각하면쉽다 

그런데 이 기본데이터와 복합데이터는 또 2가지로 분류되는데 값형식 과 참조 형식으로 구분된다 


나중에 설명하겠지만 값 과 참조는 데이터형식으로 설명이된다 (자료구조에서 나옴)


일단 변수에 대해서 알아봅시다 

변수라고 하니 뭐... 수학잘하신분들은 당혹스럽지 않겠지만 저처럼 수학에대한 민감한분들은 아니... 프로그래밍하는데 

변수가 왜나와 하실수 있습니다. 프로그래밍에서 변수는 데이터를 담는 일정 크기의 공간이라고 생각하시면됩니다 


그러면 여기서 질문이 나오는데 "아니 그럼 변수가 있다면 상수도 존재하나요?" 라고 하실수 있습니다 

네 당연히 있습니다. 하지만 프로그래밍에서 상수는 변하지 않는값이므로 예를들어 3.14같은 원주율이나 정말 고정값을 넣는곳이므로 

정말 필요한 경우가 아니라면 사용을 하진 않습니다 (당연히 사용하지 않는다는건 아님...)


내용이 다른데로 흘렀네요 변수 말씀드렸다시피 데이터를 담는 일정크기의 공간이라고 했습니다 쉽게 프로그래밍에선 

변수를 위해 이공간이 만들어졌구나 라고 생각하시면 됩니다 그래서 프로그래밍에서는 변수를 "선언한다(Declare)라고 합니다.


변수는 어느 프로그램이든 동작하기위해 설정되어야 합니다. 당연히 결과값이 나와야하니 당연하겠죠?


아까 말씀드렸다시피 데이터형식으로 설명된다고했죠 이게 바로 스택,힙,큐 입니다 

사실 자료구조를 배우시면 나오는건데 살짝 개념만 설명해드리겠습니다 


스택은 영어로 stack 뜻으로 무더기,다량의,쌓다의 개념이 있습니다 다 맞는뜻으로 

스택은 데이터를 쌓아 올린다고 생각하시면됩니다 


스택은 첫번째 데이터가 쌓아지고 두번째데이터가 쌓이고..... n번째 데이터가 쌓이고 하는것처럼 올라갑니다 

그러면 나오는 순서는 어디부터일까요 역순으로 n번째가 먼저 나가고 ....2번째 나가고 ...마지막 첫번째까지 이런순으로 나갑니다


그래서 스택은 Last In First Out 구조로 (LIFO)구조라고 합니다 

이것의 예를들면 여러분이 어플을 키시면 어플이 다른 화면으로 넘어가고 그화면에서 또다른 화면으로 넘어갑니다 

하지만 뒤로 가기를 눌르면 그전 화면이 나오고 계속하다보면 홈화면으로 돌아가는 원리랑 비슷한 개념입니다 


값 형식은 스택으로 저장됩니다 


heap 영어 뜻도 더미,많음으로 스택과 비슷한뜻입니다 


하지만 힙은 스택에 비해 자유로운편입니다 쉽게 스택은 엄격하게 후입선출(LIFO)방식으로 되는반면 

힙은 블록의 크기나 횟수 순서가 일정한 규칙이 없습니다 그래서 힙은 데이터를 스스로 제거하는 메카니즘이 없어 

가비지 컬렉터를 이용해서 수거하게 합니다. 


사실 지금 공부하는 입장에서 힙은 정확하게 어떤거다 설명드리기가 좀그렇네요 ㅠㅠ.... 그냥 이렇게만 알고계시면 될듯합니다 


참조형식은 힙으로 저장됩니다 


그리고 마지막 는 영어로 queue 뜻은 줄,대기행렬,줄을 서다 등의 뜻인데 

말뜻그대로 줄을 서서 먼저들어온사람이 먼저 나가는 형태입니다 그래서 First In First Out 의 구조를 가지고 있죠 

이것의 예로는 프린트를 들수 있습니다 먼저 입력된 글씨부터 출력되는것처럼 비슷한 원리입니다 


자 사실 이것을 설명드린건 C#의 값과 참조형식을 설명드릴려한겁니다 (사실 큐는 설명할필요없는데 부연설명으로...)


여기 스택은 값형식으로 들어갑니다 참조형식의경우 스택과 힙을 함께사용하는데 데이터는 힙에 저장하고 스택에는 

데디터가 저장된 힙 메모리 주소가 저장됩니다 


자 그럼 이제 기본적인 개념은 알았으니 데이터 형식을 정말 알아볼까요?


1. 숫자데이터형식 

숫자데이터 형식에는 총3가지가 있습니다 정수계열,부동소수계열,소수계열입니다 


일단 정수계열부터 설명하자면 정수는 음수,0,양수가 전부입니다 하지만 데이터 타입에는 총 9가지가 존재합니다

"응? 왜 9가지래 정수는 3가지잖어" 일단 각각의 데이터 범위가 다르기에 프로그램에 사용될 코드에 적절한 데이터 범위를 써서 

사용하는것입니다 (메모리를 덜 사용하고 프로그램 구동을 효율적으로 하기위해서)


 데이터 형식

 설명

크기(바이트) 

담을수 있는 범위 

 byte

 부호없는 정수

 1(8비트)

 0~255

 sbyte

  singed byte정수

 1(8비트)

 -128  ~ 127

 short

 정수

 2(16비트)

 -32,768 ~ 32,767

 ushort

 unsinged short 부호없는 정수

 2(16비트)

 0~65,535

 int

 정수

 4(32비트)

 -2,147,483,648 ~ 2,147,483,647

 uint

 unsinged int 부호없는 정수

 4(32비트)

 0~4,294,967,295

 long

 정수

 8(64비트)

 -922,337,203,685,477,508 ~ 922,337,203,685,477,507

 ulong

 unsinged long 부호없는 정수

 8(64비트)

 0~18,446,744,073,709,551,615

char

 유니코드 문자

 2(16비트)

 



그럼 이표를 참조하면 들은 생각은 이것일겁니다.


아니 그냥 long하나쓰면 다끝나는문제 아닌가? 왜 9가지나 만들었데? 라고 하실수 있는데 

컴퓨터 같은경우 자원이 풍부해 상관없습니다 하지만 스마트폰이나 작은 디바이스는 자원이 풍부하지 않으니 그에 맞게 데이터 범위를 

설정해주는것입니다 


그리고 부호있는정수와 부호가 없는정수는

http://codedragon.tistory.com/2961 이곳에 잘설명되있으니 참고해주세요 


이제 데이터 담을수 있는 범위까지 설명했으니 궁금한게 생기겠죠

바로 데이터를 범위내에 안담으면 어떻게 되요? 라는 질문이 생길수도 있습니다 


당연히 이것에 대해서도 설명해드릴겁니다 


데이터가 범위를 넘어서는것을 데이터 오버플로우 라고하고 

데이터가 범위에 들지 않았을시 데이터 언더플로우라고합니다 


프로그래머의 지식인과 같은곳 stackoverflow에서 overflow(오버플로우)가 여기 이뜻입니다


아니 그러면 데이터가 넘쳐흘르면 어떻게되요? 하실텐데 실제로 이 현상이 있었습니다 싸이의 강남스타일 영상이 실제로 21억뷰이상으로 int값을 넘어서자 

-2,147,483,648 이라는숫자로 나왔습니다 이건 실제로 발생했었구요 ...

사실 유뷰트측에서도 설마...21억뷰가 넘겠어라는 생각으로 그간 해왔는데 넘어서버린거죠 요즘이야 이런 21억뷰 넘기는 영상이 꽤많지만 그때당시는 엄청났죠 


다시 본론으로 돌아가서 값이 넘어서니 int의 최저값으로 돌아가죠 데이터가 오버플로우되면 최저값이 표시됩니다 왜그럴까요?  int는 32비트로 기니 byte로 설명해드리겠습니다 


byte (8비트)


byte의 최대값을 넣으면 255 모두 1로 채워집니다 
그런데 만약 여기서 오버플로우가 일어나면 어떻게될까요?



byte는 8비트라했는데 9개로늘었죠 그런데 8비트에는 다 0이 표시됩니다 
byte는 8비트밖에 표시를 못하니 당연히 1은 버려지고 0으로 표시된것이 표시되니 
값이 최저값인 0으로 표시됩니다 

언더 플로우도 비슷하게 만약 최저값보다 작게 넣어진다면 최대값인 255가 표시되는것입니다.



오늘은 여기까지..... 한번에 많은 정보를 알려고하면 복잡하게 됩니다 


참고문헌: 뇌를자극하는 C# 5.0프로그래밍

반응형