[C# Basic] 데이터 형식
업데이트:
C#의 기초부터 차근차근 다시 한 번 짚어보자.
이번 시간에는 C#의 데이터 형식에 대해 알아보자.
* 데이터의 종류
- 기본 데이터 형식 과 기본 데이터 형식으로 구성되는 복합 데이터 형식으로 나뉜다.
- 복합 데이터 형식은 구조체, 클래스, 배열 등이 해당된다
- 값 형식은 스택 이라는 메모리 영역을 사용한다
- 참조 형식은 힙 이라는 메모리 영역을 사용한다
* 스택과 힙
- 스택은 책 더미와 같은 구조이다. 데이가 하나씩 쌓이며 맨 아래 있는 책을 빼내려면 위에 쌓인 모든 책을 걷어내야 한다.
- 값 형식의 변수는 모두 스택에 저장된다.
-
스택에 저장된 값 형식의 변수는 } 를 만나면 메모리에서 모두 제거된다.
- 힙에 저장된 데이터를 스스로 제거하는 메커니즘은 없다. 가비지컬렉터가 제거해준다.
- 참조 형식의 변수는 힙과 스택을 함께 이용하는데, 힙 영역에 데이터를 저장하고 스택 영역에는 데이터가 저장된 힙 메모리의 주소를 저장한다.
- 참조 형식의 변수는 } 를 만나면 스택에 저장된 힙 메모리 주소만 제거되고 힙에 저장된 값은 여전히 남아있는 상태이다. 이는 가비지 컬렉터가 수거해간다.
* 기본 데이터 형식
- C#에서 제공하는 기본 데이터 형식은 모두 15가지가 있는데, 이 중 문자열 형식과 오브젝트 형식만 참조 형식에 해당하며 나머지는 값 형식이다.
- C#의 15가지 기본 데이터 형식 중 12가지는 숫자 데이터 형식. 이들은 정수, 부동소수, 소수 계열 3가지로 나뉨
-
정수계열형식은 정수 데이터를 담기 위해 사용. (byte, sbyte, short, ushort, int, unit, long, ulong, char)
- 숫자형 데이터 타입에서 데이터가 넘치는 경우 overflow가 발생. 이 때는 0이 출력된다. underflow는 -1이 출력
- 부동소수점형식은 산술과정이 정수계열형식보다 복잡해서 느림. (float, double)
- decimal 형식은 실수를 다루는 형식. 부동소수점과는 다른 방식으로 소수를 다루며 정밀도가 훨씬 높음
- char은 문자 형식. 따옴표 ‘ ‘ 로 문자를 감싸주어야 함
- string은 문자열 형식. 큰 따옴표 “ “ 로 문자를 감싸주어야 함
- bool은 논리 형식. true와 false 두 개의 데이터만 다룰 수 있음
- object 형식은 모든 데이터 형식의 부모. C#의 데이터형식은 모두 object를 상속받게 됨
* 박싱과 언박싱
object a = 10;
int b = (int)a;
- object 형식은 참조 형식이기 때문에 힙에 데이터를 할당. int나 double 형식은 값 형식이므로 스택에 데이터를 할당.
- 위 예제에서 object 형식에 10을 할당하는 경우 스택에 힙 영역의 메모리 주소를 참조하고 힙에 데이터가 저장됨. 이를 박싱이라 함 (값 형식의 데이터를 박스에 담아 힙 영역에 저장한다는 느낌으로 생각해보자)
- 이를 int 형식으로 변환하는 경우 int는 값 형식이므로 스택에 데이터가 저장되어야 함
- 박싱된 값을 꺼내 값 형식 변수에 저장하는 과정을 언박싱 이라 함
* 데이터 형식 변환
sbyte a = 127;
int b = (int)a; // sbyte를 int로 변환
- 데이터 형 변환시 부주의로 인해 데이터에 손상을 입힐 수 있음.
- 예를 들어 큰 숫자를 작은 숫자형에 담는 경우 오버플로우가 발생할 수 있음
int a = int.Parse("100");
string b = 123.ToString();
- 문자 -> 숫자 사이의 변환시 C#의 Parse() 메소드 사용 가능
- 숫자 -> 문자 로 변환시 object의 ToString() 메소드 사용 가능
* 상수와 열거형
const int a = 10; // 상수
enum Test = {Yes, No, True, False} // 열거형
enum Test2 : double {Yes, No, True, False} // 기반자료형을 double로 선언. 기본값은 int
- const 키워드를 사용해 불변하는 데이터 선언 가능. (readonly가 더 좋다)
- enum 열거형은 여러개의 상수를 정의하는 경우 사용. 상수는 0, 1, … 순서로 값을 자동으로 할당받는다.
* Nullable 형식
int? a = null;
double? b = null;
- 값 형식에 한해 Nullable 형식 사용 가능. 원래 데이터 형식 뒤에 ? 를 붙이면 된다.
* 데이터 형식을 유추하는 var
var a = 10;
- C#은 강력한 형식검사를 하는데, 이는 컴파일 타임에 오류를 발생시켜 프로그래머의 실수를 줄여줌
- var 키워드를 통해 약한 형식검사를 하는 언어의 편리함도 함께 제공
- var 키워드를 통해 변수를 선언하는 경우 반드시 선언과 동시에 초기화를 해주어야 함. 초기화 하지 않으면 어떤 타입의 변수인지 알 수 없기 때문
- var는 지역변수로만 사용 가능. 클래스의 필드를 선언하는 경우 반드시 명시적 선언을 해주어야 함. 지역변수란 코드블록 안에서 선언되는 변수를 의미