TIL (69) | 2023.11.02 | 박싱과 언박싱

kjg5370·2023년 11월 2일
0

TIL

목록 보기
68/91
post-thumbnail

들어가기 앞서

오늘 전에 몰랐던 개념인 박싱과 언박싱에 대해 좀 알아보고 이걸 왜 주의해서 써야하는지 정리해보려고 합니다.

오늘 배운 것

  • 박싱(Boxing)
    박싱은 C#에서 기본 데이터 타입(원시 데이터 타입)을 해당 타입의 객체로 변환하는 과정.
    이로써 기본 데이터 타입을 참조형식으로 다룰 수 있게 됩니다.
    박싱은 주로 값 형식(구조체)을 object나 다른 참조형식으로 저장해야 할 때 사용됩니다.

    • 정수를 박싱하여 object 변수에 저장하는 경우

      int primitiveInt = 42;
      object boxedInt = primitiveInt; // 박싱

  • 언박싱(Unboxing)
    언박싱은 박싱된 객체에서 값을 추출하여 해당 값을 기본 데이터 타입으로 변환하는 과정.
    언박싱을 수행하려면 명시적으로 언박싱 연산자인 (타입)을 사용해야 합니다.

    • object 변수에서 값을 추출하여 정수로 사용하는 경우

      object boxedInt = 42;
      int unboxedInt = (int)boxedInt; // 언박싱

  • 주의 사항

  • 박싱과 언박싱은 메모리와 성능 오버헤드를 발생시킬 수 있음

    • 박싱(Boxing)
      박싱 작업을 수행하면 새로운 Integer 객체가 힙(heap) 메모리에 생성 -> 객체는 기본 데이터 타입 값을 포함->
      이 객체는 참조형식이므로 객체를 가리키는 참조(주소)를 스택(stack) 메모리에 저장.

      박싱은 추가적인 메모리 할당 및 객체 생성 작업을 수반하며, 가비지 컬렉션의 대상이 될 수 있음.
      이로 인해 메모리 오버헤드와 가비지 컬렉션 작업이 발생

    • 언박싱(Unboxing)
      예를 들어, Integer 객체에서 정수를 언박싱한다고 가정하면
      언박싱을 수행하면 먼저 기본 데이터 타입의 변수가 스택 메모리에 생성 -> 박싱된 객체에서 값을 추출하여 이 변수에 복사 ->
      이 과정에서 값 복사 및 데이터 형식 변환 작업이 발생하게 됨.

      추가적인 계산 작업 및 메모리 사용이 필요해짐.

기억 할 것

  • 박싱된 객체가 null인 경우
    박싱된 객체가 null인 상태에서 언박싱을 시도하면 예외(NullReferenceException)가 발생할 수 있음.
    따라서 언박싱 작업을 수행하기 전에 박싱된 객체가 null 여부를 확인하거나 예외 처리를 수행해야 함.

    object boxedValue = null;
    if (boxedValue != null)
    {
        int unboxedValue = (int)boxedValue; // 언박싱 전에 null 체크
    }
  • 안전한 언박싱
    박싱된 객체가 어떤 타입인지 확인 후 언박싱해야 함.
    잘못된 타입으로 언박싱하려고 하면 InvalidCastException 예외가 발생할 수 있음.

    object boxedValue = 42;
    if (boxedValue is int)
    {
        int unboxedValue = (int)boxedValue; // 안전한 언박싱
    }
    else
    {
        // 처리할 수 없는 타입일 때의 예외 처리
    }
profile
학생입니다

0개의 댓글