일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 초대장
- 알고리즘
- 자바
- 파이썬
- 자바 프로젝트
- hyperledger
- 학점
- oracle
- 리눅스
- 운영체제
- smart cast
- 문법 정리
- 파이썬 소스
- 프로젝트
- SQL
- c#
- 백준 알고리즘
- 오라클 디비
- K6
- dynamic query
- JVM
- 오라클
- jsp
- MongoDB
- 티스토리
- spring
- auto configure
- resilience4j
- 유사코드
- gradle
- Today
- Total
모종닷컴
Value Type/Reference Type 본문
오늘은 C#에서 Value Type/Reference Type에 대하여 알아보도록 하겠습니다.
□값 형식(Value Type)
먼저 기본 자료형(string을 제외한)과 사용자 정의 구조체의 변수는 값 형식이며 스택에 저장됩니다.
ex) int x = 10; // 변수 x는 스택에 저장.
값 형식으로 저장된 변수들은 범위 밖을 나가면 스택에서 제거됩니다.
□참조 형식(Reference Type)
이번엔 참조형식인데 인스턴스 변수(클래스,배열)들은 참조 형식이며 힙 영역에 저장됩니다.
ex) Student stu = new Student(); // 인스턴스 변수 stu는 힙 영역에 저장.
참조 형식으로 저장된 변수들은 C#에서 효율적인 메모리 관리를 위해 가비지 컬렉터란 것이 소멸 되는 시점을 판단하여 객체를 수거해갑니다.
이 두개의 차이점은 엑세스에 있는데요. 값 형식은 효율적이지만 수명이 제한되어 서로 다른 클래스 간에 데이터를 공유하는 데 적합하지 않고, 참조 형식은 다른 클래스에서 엑세스하는데 적합하지만 오버헤드가 커진다는 단점이 있습니다.
□값 형식과 참조 형식의 변환
C#에서는 서로 형식을 변환할 수 있게 Boxing과 UnBoxing 이라는 개념을 제공하는데요.
값 형식 → 참조 형식 Boxing(*스택에 있는 데이터가 힙으로 복사)
참조 형식 → 값 형식 UnBoxing(*힙에 있는 데이터가 스택으로 복사)
이라고 합니다.
여기서 주의할 것은 모든 객체가 값 형식으로 언박싱 되는 것이 아닌 한번 박싱한 객체에 대해서만 가능하다는 점입니다. 또한 언박싱은 박싱하기 전 형식을 준수해야 하는 것입니다.
ex) object o = new object();
int j = (int)0; //예외 발생
short i =123;
object o = i;
int j = (int)o; //언박싱 불가능
□컬렉션에서의 박싱/언박싱
박싱 언박싱은 ArrayList 같은 컬렉션에서 자주 일어납니다.
컬렉션의 장점으로 어떤 타입의 데이터든지 전부 담을 수 있다는 것인데 이 말은 즉슨 컬렉션에서는 데이터를 받으면 어떤 형식으던지 object형식으로 박싱되어 저장되고 그 데이터를 사용할 때 언박싱이 된다는 것입니다.
이 과정 변환되는 과정에 대하여 MSDN 에서는
“boxing 및 unboxing 과정에는 많은 처리 작업이 필요합니다. 값 형식을 boxing할 때는 완전히 새로운 개체가 만들어져야 하며, 이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다”
라고 설명하였습니다.
□일반화 컬렉션
위에 따라 컬렉션에서는 특별한 경우(다양한 변수를 넣어 관리)를 제외하고 일반화 컬렉션을 사용한다.
일반화 컬렉션이랑 컬렉션에 제네릭(컬렉션에 특정한 타입만 넣을 수 있도록 지정)을 더한 것과 같다,
ex) List<int> list = new List<int>(); // int 타입만 저장 가능
타입을 지정해서 사용하기 때문에 불필요한 형식 변환을 발생시키지 않으며, 잘못된 형식의 객체를 담는 위험을 피할 수 있다.