일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이스케이퍼스
- 2021 방탈출 추천
- C#
- 추천
- 정렬 알고리즘
- 강남 방탈출
- 홍대
- 후기
- PC VR
- 방탈출 후기
- 넥스트에디션
- Unity
- 개발
- 방탈출 리뷰
- Android
- 시스템 프로그래밍
- 유니티
- 이스케이퍼스 2호점
- 홍대 방탈출 추천
- 필활
- 방탈출
- C++ 자료구조
- 홍대 방탈출
- 꽃길
- C 자료구조
- 방탈출 추천
- 넥스트에디션 2호점
- 윈도우 프로그래밍
- 홍대 덤앤더머
- 공포 방탈출
- Today
- Total
행복한 연어의 이야기
(C#) 자료형 - 자료형의 2가지 종류와 박싱 / 언박싱 본문
안녕하세요
오늘은 자료형의 2가지 종류와 그와 관련된 박싱 / 언박싱에 대해서 알아보도록 하겠습니다.
자료형이란?
자료형이란 Data(자료) 의 Type(형식)
자료형은 2가지 종류가 있는데 값(Value) 형식, 참조(Reference) 형식이 있습니다.
1. 값(Value) 형식
값형식은 자료값이 메모리에 직접 저장되는 구조이며 스택 메모리 영역에 저장됩니다.
많이 사용하시는 bool, char, int, float 등이 값 형식의 속합니다.
기본적으로 값형식은 null 일수 없으며 nullable 타입일 경우 null 일 수 있습니다.
( int? num = null; 이런식으로 값형식 뒤에 ?를 붙이면 nullable 타입이 됩니다.)
2. 참조(Reference) 형식
찹조형식은 자료값이 저장된 메모리에 대한 참조값이 저장되는 구조이며 힙메모리 영역에 저장됩니다.
기본적으로 string , 배열, 클래스로 생성된 객체 등이 있습니다.
참조형식은 new 연산자에 의해 메모리 동적할당이 되며 C#에서는 명시적으로 메모리 해제를 할 수 없습니다.
자료형의 동일성 비교
값형식과 참조형식의 동일성 비교는 조금 다르게 작동합니다.
아래 선언된 코드를 한번 보시겠습니다.
int a = 1;
int b = 1;
// a == b 는 성립합니다.
TestClass c = new TestClass(2);
TestClass d = new TestClass(2);
// c == d 는 성립하지 않습니다.
TestClass e = new TestClass(3);
TestClass f = e;
// e == f 는 성립합니다.
값형식의 동일성 비교는 자료값 자체를 비교하지만
참조형식은 동일한 메모리(객체)를 가르키고 있는지 참조값을 비교하기 때문입니다.
여기서 참조형식인 string 은 자료값처럼
string str1 = "hello";
string str2 = "hello";
str == str2 가 성립 하게 되는데요.
이는 내부적으로 연산지 오버로딩을 통해 값형식 동일성비교 처럼 작동하기 때문입니다.
자료형의 변환
자료형을 변환 할수 있습니다.
int a = 10;
float b = (float)a;
이런식으로 정수를 실수로 혹은 그 반대인 실수를 정수로 바꾸는 방법을 많이 보셨을 거라 생각합니다.
박싱 언박싱은 자료형을 변환할때 발생합니다.
박싱 과 언박싱 ?
값 형식과 참조 형식 사이에도 자료형 변환이 일어날 수 있는데요.
값 형식을 참조 형식으로 변환하는 것을 박싱 (Boxing)
참조형식을 값 형식으로 변환하는 것을 언박싱 (UnBoxing) 이라고 합니다.
박싱 (값 -> 참조)
스택 -> 힙 으로 복사
묵시적으로 일어나며 명시적으로 해도 무방
언박싱 (참조 -> 값)
힙 -> 스택 으로 복사
명시적으로 해줘야 함
반드시 박싱되었던 객체에 한에서만 언박싱이 가능하다.
박싱 언박싱의 성능과 사용이유
스택과 힙 메모리를 오가는 박싱 언박싱은 최적화 관련 이슈가 있을 때마다 언급 될 정도로 성능이 좋지 않습니다.
MSDN 에 의하면 값 형식을 박싱할 때에는 완전히 새로운 개체가 만들어져야 하며,
이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸린다고 합니다.
언박싱 또한 캐스팅 과정이 할당 작업보다 4배의 시간이 걸릴 수 있다고 합니다.
그럼에도 사용하는 가장 큰 이유는 편의성인데요.
대표적인 예로는 System.Collections.ArrayList 클래스가 있습니다.
ArrayList 클래스에는 문자열, 정수, 실수, 객체 등 원하는 자료형을 넣을 수 있는 복합자료형입니다.
(object 타입으로 저장)
하나의 클래스로 모든 자료형을 넣을 수 있는 ArrayList 클래스는 사용하기에는 편리하지만
박싱 언박싱이 일어난다는 단점이 있습니다.
편리성과 성능을 맞바꿨다고 볼수 있겠네요.
이렇게 자료형의 2가지 종류와 박싱 언박싱에 대해서 알아보았습니다.
감사합니다!