C# Chapter 3 데이터 형식
이 글은 한빛미디어의 이것이 C#이다를 보고 공부한 내용을 정리한 글입니다.
헷갈리는 부분 위주로 정리했습니다.
데이터 형식
다양한 데이터 형식
데이터 형식은 크게 두 가지 개념으로 분류할 수 있습니다.
기본 데이터 형식
과복합 데이터 형식
값 형식
과참조 형식
변수의 선언
변수의 선언은 데이터 형식을 명시하고 그다음 식별자(이름)을 명시함
ex) int num
여기서 int가 데이터 형식 num이 식별자
초기화 :
초기화란 변수에 최초의 데이터를 할당하는 것을 의미.
선언과 동시에 변수의 값이 대입되는 것이다.
ex) int num = 50;
리터럴 :
리터럴은 문자 그대로의 라는 의미로써 고정값을 나타내는 표기법을 말합니다.
즉, 변수에 넣는 변치 않는 데이터 값 그 자체입니다.
ex) int num = 50; 에서 50이 리터럴에 해당
값 형식과 참조 형식
스택과 값 형식
- 스택은 코드블럭
{}
안에서만 존재하는 일시적인 메모리이다. - 값 형식은 값 자체를 저장 하는 변수이고 스택에서 생긴 값 형식들은 코드 블럭을 닫는
}
을 만나면 모두 사라진다.
힙과 참조 형식
- 힙은 코드 블럭에 따라 삭제되는 것이 아닌 별도의 청소부
CLR의 가비지 컬렉터
를 가지는 메모리이다. - 참조 형식은 힙에 데이터 값을 스택에 데이터 값을 주소를 저장하는 2중 저장 방식을 통해 데이터를 보관한다.
- 즉, 코드 블럭 안에서 참조 형식 변수가 선언된다고 해도 코드 블럭이 끝날 때 지워지는 것은 스택에 저장된 힙의 주소를 담은 메모리 뿐이다.
object 형식
- 어떤 데이터든지 다룰 수 있는 형식
- 기본 데이터 형식부터 모든 복합 데이터 형식, 프로그래머가 정의한 형식까지도 모두 담아 처리할 수 있는 형식.
- object가 모든 데이터 형식을 다룰 수 있도록 모든 데이터 형식이 object를 상속 받게 된다. 즉, object는 모든 데이터 형식의 부모이다.
object
의 경우 참조 형식이므로 힙에 저장된다. 하지만 값 형의 데이터는 스택에 저장되기에object
에 저장하려면박싱
이라는 기능이 필요하다.
박싱과 언박싱
박싱
값 형식 데이터를 참조 형식으로 변환하는 것. 원래라면 스택에 저장되어야 했을 값 형식 데이터 참조 형식처럼 힙에 저장하고 스택에서 힙의 주소를 가르키게 하는 것
ex) object obj = 50;
언박싱
참조 형식을 값 형식으로 변환하는 것.
ex) object obj = 50; int a = (int)obj;
상수
- 변하지 않는 값.
- const를 앞에 붙여 선언하고 한 번 선언한 뒤 값을 변경할 수 없음.
- 변수 처럼 이름을 정해주고 사용하는 고정된 값이라고 생각하면 편함.
ex) const int one = 1
열거 형식 enum
- 상수의 집합이라고 생각하면 됨.
- 상수에서의 const 대신 enum을 사용하고 상수와 같이 선언 뒤 값 변경 X.
ex) enum DialogResult {YES, NO, CANCLE, CONFIRM, OK}
- 여기서 중요한 점은 예시에서 선언된 DialogResult는 변수가 아니라 새로운 형식을 선언한 것이라는 것이다.
- 새로 만든 형식으로 취급하여 변수 선언을 할 수 있다.
ex) DialogResult result = DialogResult.YES;
- 이런 enum과 같은 것을 사용자 정의 데이터 형식이라고 하며 enum외에도 class, struct 등이 있다.
Nullable 형식
- 어떤 값도 가지지 않는 변수
- 데이터_형식? 변수_이름; 로 선언
ex) int? a;
- 모든 Nullable 형식은 HasValue와 Value 두가지 속성을 가지고 있음.
- Numllable형식은 값 형만 가능하고 참조 형식은 불가능.
HasValue
- 해당 변수가 값을 가지고 있는지 아닌지 나타냄
- 값을 가지고 있다면 true, 아니라면 false
Value
- 해당 변수의 값을 추출
var
- 형식을 딱히 정해주지않고 컴파일러가 추론하게 하는 형식
- 선언과 동시에 초기화 해주어 컴파일러가 추론하게함.
ex) var a = 3;
a는 int 형식ex) var b = "Hello";
b는 string 형식
var는 지역 변수로만 사용 가능
var과 object의 차이
- object는 object 형식이다. 컴파일돼서 실행되면 CLR은 object를 object형식으로 받아들여 처리하나 var의 경우는 var자체가 사용됐다는 것을 인지하지 못한다.
- ex)
object obj = 20;
은 CLR이 오브젝트 형식이 20을 박싱해서 저장한 것을 알지만var v = 20;
은int v = 20;
으로 인식하게 된다. - 또한 var은 지역 변수로만 사용가능하나 object는 그렇지 않다.
댓글남기기