2019. 1. 29. 00:05

어떠한 프로그래밍을 공부한다고 해도 제일 먼저 배우는 코딩문법은 변수입니다. 

본인이 프로그래밍 강의 들었을때는 어떤 교수님께서 프로그래밍을 요리에 비교했던 기억이 나네요
여기서에서는 변수를 보겠지만, 요리를 만들기위해서, 
재료를 담기위한 그릇이 항상 필요하다고 강조를 하셨고, 그 변수의 타입(type)에 따라서
그릇의 종류나 크기가 달라져야 음식이 넘치지 않는다고, 비유를 했습니다.

어떤 그릇은 정수형 숫자만 저장하고, 어떤 그릇은 글자를 담고,
어떤 그릇은 실수만을 저장하는 그릇이지요

우리는 C#을 배우기 때문에, C#에 대한 데이타 타입..즉, 어떤 그릇인가, 어떠한 특징을 가지는지
알아봐야할것입니다.
C#은 객체 지향언어이자, 타입안정성을 최우선으로 하는 언어입니다.


1. 닷넷의 타입
  - C#은 닷넷언어이기때문에 type이 모두 System 네임스페이스에 정의 되어 있습니다.
  - 결국은 닷넷프레임워크에 정의되어 있다는것입니다.(CTS정의)
  - 타입에 따라서 변수의 메모리 공간크기, 이름, 부호의 여부가 다릅니다.

2. 타입의 종류
a. 정수형

타 입

실제이름

범위

sbyte

System.SByte

-128 ~ 127

byte

System.Byte

0 ~ 255

char

System.Char

하나의 유니코드 문자. U+0000 ~ U+FFFF

short

System.Int16

-32,768 ~ 32,767

ushort

System.UInt16

0 ~ 65,535

int

System.Int32

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

uint

System.UInt32

0 ~ 4,294,967,295

long

System.Int64

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

ulong

System.UInt64

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


사실 이것을 일일이 다 외울필요는 없습니다. 코딩을 하시다보면, 익숙해지기 때문에 자동적으로
외워지게 됩니다. 특히 타입앞에 u가 붙으면 음수값이 없어지고, 양수값이 2배로 커진다는점
인식하셔야 합니다.
타입명이 있고, 실제이름이 있는데, 이는 CTS에 따라서 닷넷 타입의 내북적인 실제 타입명입니다.
코딩할때 저렇게 직접 적으셔도 무방합니다. 
예를 들어보죠
int x = 10;
System.Int32 x = 10;

int의 실제이름은 System.Int32라고 했습니다.
위의 두 문장은 같은 뜻입니다. 둘중에 어느것을 써도 괜찮은거죠.


b. 실수형 

타 입

실제이름

정밀도

범 위

float

System.Single

7개의 자릿수

±1.5 ×10~45 ~ ±3.4 × 1038

Double

System.Double

15~16개의 자릿수

±5.0 ×10~324 ~ ±1.7 × 10308

Decimal

System.Decimal

28~29개의 자릿수

1.0 ×10~28 ~ 7.9× 1028

 

c. 참조형

타 입

실제이름

특 징

Object

System.Object

모든 타입의 최상위 부모 클래스. C#에서 모든 객체들은 이 Object 클래스로부터 상속받는다.

String

System.String

문자열을 나타내는 타입이다.

Bool

System.Boolean

Boolean 값이며 참(true) 또는 거짓(false)를 나타낸다.



C#은 모든 변수를 
사용하기 전에 초기화를 해주어야 합니다. 안그러면 에러가 날 수도 있죠..
변수에 초기값을 지정해 주지 않으면 디폴트 값으로 초기화가 됩니다.

 

타 입

디폴트 값

bool

false

byte

0

char

'\0'

decimal

0.0M

double

0.0D

enum

0

float

0.0F

int

0

long

0L

sbyte

0

short

0

struct

구조체안의 모든 타입은 그에 해당하는 디폴트 값으로 할당된다.

uint

0

ulong

0

ushort

0

 




2. 값 타입(Value type) / 참조 타입(Reference type)
 a. 값타입 : 스텍에 할당되어 변수가 값 자체를 직접 가집니다. 여기서 Stack(스택)이란것은
     메모리(Ram)내에 데이타를 쌓는기법인데 First In Last Out(FILO)라는 구조로 자료가 저장됩니다.
     자세한 설명은 댓글로 질문주시면, 설명해드릴게요, 즉, 변수를 선언하는 동시에 기억장소에
     저장되고, 일반적으로 별 무리없이 값을 저장, 대입하여 쓸수있는 타입입니다.
     위의 표를 보시고, 참조형이 아닌것은 모두 값타입이라 보시면 됩니다.
    
 a. 참조타입 : 값자체를 가지는것이 아니라, 주소값(저장된 위치)를 가집니다.
     이것은 스택영역이 아닌 힙(heap)이라는 아주 큰 메모리에 저장되는데, 여기 저장된 데이타는
     Garbage Collection 에 의해 자동으로 관리가 됩니다. 즉, 메모리를 이제는 프로그래머가 직접
     관여하지 않아도 되는것이지요. 주로 덩치가 큰 타입들이 참조형입니다.

3. 스택 영역과 힙 영역
  프로그래머라면 반드시 알아야 합니다. 너무 크게 해석하면 힘들기 때문에, 닷넷에서의 스택과
  힙에 대해서만 설명 합니다.
  
1. 스택(Stack)
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간입니다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 되죠. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop(제거 및 값을 리턴)하게 됩니다.
참고로 간단한 예를 들면, 책이 쌓인것과 같은데, 책이 10권이 쌓여있습니다. 제일 밑에 있는책이
제일 처음에 쌓은 책이지만, 제일 위에 있는 책은 제일 마지막에 쌓은것이겠지요. 그렇다면, 책을 한개씩 옮기기 위해서는 제일 위에 있는 책부터 손이 갈것입니다. 이것이 스택구조인데, 즉, 자료저장방식
으로 본다면, 제일 먼저 들어온책(데이타)가 제일 늦게 출력(사용)이 되고, 제일 마지막에 쌓여있는 제일 위에 있는 책이 제일 먼저 나갈수 있는 메모리 구조. 그래서 First In Last Out 방식이라합니다


2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.(자동 쓰레기 처리기) : 필요없는 데이타는 자동으로 삭제/관리

이러한 데이터 타입을 사용하여 변수를 사용할 수 있습니다.


담는 그릇도 중요하지만, 그 그릇이 있어야 하는 공간도 다르다는걸 인지 하셔야합니다.
참조라는 것은 힙이라는 데이타영역의 해당 데이타의 위치를 참조한다는것

4. 데이타 자동 형변환
    먼저 예문을 통해서 본론으로 넘어가도록 하겠습니다.

int number_1 = 15;
int number_2 = 20;
int result = number_1 +  number_2 ;

Console.WriteLine(result);

결론은 당연히 35가 나옵니다. 그리고 다음 예제

string number_1 = "안녕";
string number_2 = "알라뷰!";
string result = number_1 +  number_2 ;

Console.WriteLine(result);

자 이렇게 결론은 본다면 "안녕알라뷰!"라고 출력이 됩니다.
아주 당연해 보일수도 있겠지만, 같은 + 라는 연산이 숫자에도 적용, 문자열도 적용되는데
데이타 타입에 따라서 각기 다른 의미로 해석되어 결론을 도축해냅니다.
이것은 + 연산이라지만, 데이타 타입에 따라서 즉, int, string 에 따라서 작동되는 기능이 
자동으로 달라집니다. 참 신기한 현상입니다. 물론 당연하다고 보는분들도 계시겠지만,
그냥 넘기기엔 좀 찝찝해지셔야합니다. 

string number_1 = "안녕";
int number_2 = 1111;
string result = number_1 +  number_2 ;

Console.WriteLine(result);

이렇게 다른 타입으로 되면 어떻게 되는가? 상식적으로는 에러가 나야한다. 하지만, 나름 융통성있는
CLR은 이를 안녕1111이라고 출력을 합니다. 묵시적으로number_2는 문자열로 인식이 되어 버린것.
그렇지만 이것이 오히려 불편할때도 있긴 할것입니다.

데이타 타입에 관해 정리좀 할랬드만, 이거 너무 데이타타입내용이 방대하니, 한계가 오네요
오늘은 여기까지 정리하고, 다음에 다시 언급하도록 하겠습니다. 


'프로그래밍 > C#' 카테고리의 다른 글

C#-8. C# 응용프로그램의 기본구조  (0) 2019.02.03
C#-7. 객체지향과 클래스  (0) 2019.01.31
C#-4. 컴파일러와 dll파일  (0) 2019.01.25
C#-3. 네임스페이스  (0) 2019.01.25
C#-2. C#으로 첫 발자국  (0) 2019.01.24
Posted by 토실토실천재