00_데이터 보관하기

Rio·2022년 1월 28일
0

C# 도감

목록 보기
1/3

✏️값 형식과 참조 형식

  • 값 형식(Value Type) : 변수가 값을 담는 데이터 형식
  • 참조 형식(Reference Type) : 변수가 값 대신 값이 있는 위치(주소)를 담는 데이터 형식
  • 메모리 영역

Stack과 값 형식

- 컴파일 타임에 크기가 결정 => 정적인 영역
- 변수가 코드 블럭을 벗어나면 데이터가 사라짐

Heap과 참조 타입

- 런 타임에 동적으로 생성 가능
- 데이터가 코드블록의 여부와 상관없이 데이터가 유지 => 가비지컬렉터가 필요

✏️object 형식

- obect 형식은 참조 형식

"돈은 여기 있다. 이제 물건을 넘겨" => 물건 : 어떤 것이든 의미할 수 있음

object 타입의 변수는 다른 데이터 형식의 데이터를 다 담을 수 있다.

모든 데이터 형식을 자동으로 object 형식으로부터 상속을 받는다.
따라서 컴파일러는 어떤 형식의 데이터라도 object에 담아 처리할 수 있다.
cf_var과 object는 다르다. var은 자동으로 데이터 형식을 파악해 스택에 할당하고 object는 힙에 할당한다

✏️박싱과 언박싱

object 형식은 참조 형식이기 때문에 Heap에 데이터를 할당한다.
그럼 값 형식의 데이터를 object 형식 객체에 담는 과정은 어떻게??

박싱

object a = 20;

1. 20은 박스에 담겨 힙에 할당
2. object type 변수 a는 stack에 할당되어 20의 주소를 참조

언박싱

object a = 20;
int b = (int)a;

1. b가 a가 참조하고 있는 메모리로부터 값을 복사하려는 과정
2. 박싱된 값을 꺼낸다 -> 언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려면 오류(InvalidCastException)가 발생. 미리 같은 타입인지를 먼저 확인하는 절차 필요. is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전
3. 일치하는 값 형식 변수에 저장한다

🤷‍♀️왜 사용하는가?

  • 값을 타입의 형식에 상관없이 저장을 할 수 있어서 사용

    ArrayList arryL = new ArrayList();
    arrL.add("Rio");
    arrL.add(2022); // 박싱
    arrL.add(myClassObject);
    int thisYear = (int)arrL[1]; //언박싱

  • 성능
    캐스팅 여부 확인 및 지연 시간, 메모리 생성과 복사 시간, 가비지 발생 등 가급적 제네릭 사용으로 박싱/언박싱을 피하자

profile
우당탕탕 개발 기록지

0개의 댓글