행복한 연어의 이야기

(C#) 자료형 - 자료형의 2가지 종류와 박싱 / 언박싱 본문

IT/C#

(C#) 자료형 - 자료형의 2가지 종류와 박싱 / 언박싱

해피살몬 2021. 3. 21. 18:02

안녕하세요

오늘은 자료형의 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가지 종류와 박싱 언박싱에 대해서 알아보았습니다.

감사합니다!

Comments