[C#] 오브젝트 타입

dain·2024년 1월 23일

C#

목록 보기
2/5
post-thumbnail

오브젝트(Object) 타입

  • C#에서 모든 자료형의 부모
    • C#에서의 모든 형식은 System.Object 클래스를 상속받는다.
    • object 형식의 변수에는 모든 형식의 값 할당 가능

      💛 C#의 데이터 자료형

  • 관련 함수
    • GetType()
    • Equals
      • Equals(Object)
      • Equals(Object, Object)
      • ReferenceEquals(Object, Object)
    • ToString()
    • GetHashCode()

  • 오브젝트 타입은 참조 타입이므로 값 타입의 데이터를 오브젝트 타입에 할당할 경우 성능 상의 문제가 발생한다.
    ⇒ Boxing과 Unboxing

    🩵 값 타입과 참조 타입

    • 값 타입 (Value Type)
      • 메모리의 스택 영역에 저장
      • 복사시 실제 데이터가 복사되어 전달 (copy by value)

    • 참조 타입 (Reference Type)
      • 메모리의 힙 영역에 저장
      • 변수의 선언만으론 오브젝트가 생성되지 않음
        new 키워드를 통해 오브젝트를 생성하고 이를 각 변수가 참조
      • 복사시 데이터의 참조만 전달 (copy by reference)
        → 크기가 큰 데이터나 객체 지향 프로그래밍에서 주로 활용

    🩵 메모리

    • 스택 (Stack)
      • 컴파일 타임에 할당
      • 변수의 범위가 끝나면 자동으로 데이터 해제됨
      • 데이터를 저장하고 검색하는데 효율적

    • 힙 (Heap)
      • 런타임에 동적으로 할당
      • C#에서의 메모리 관리는 가비지 컬렉션에 의해 자동으로 이루어짐
      • 데이터 할당 및 해제 과정에서 스택에 비해 큰 오버헤드


Boxing과 UnBoxing

  • Boxing

    • 값 타입의 데이터가 오브젝트 타입으로 변환될 때 발생
      (스택 영역의 데이터를 힙 영역으로 복사)

    • 과정
      1. 스택 영역에서 힙 영역으로 이동할 값 복사
      2. 힙 영역에 메모리 확보
      3. 복사한 값 이동

    • 단점
      • 단순 참조 할당에 비해 20배의 시간 소요

  • Unboxing

    • 박싱된 데이터가 원래의 값 타입으로 변환될 때 발생
      (힙 영역의 데이터를 스택 영역으로 복사)

    • 과정
      1. 언박싱할 수 있는 자료형인지 확인

        🩵 오류

        • null을 unboxing할 경우 NullReferenceException 발생
        • 호환되지 않는 값 형식에 대한 참조를 unboxing할 경우 InvalidCastException 발생
      2. 힙 영역에서 스택 영역으로 이동할 값 복사
      3. 복사한 값 이동

    • 단점
      • 단순 참조 할당에 비해 4배의 시간 소요
      • 언박싱이 발생하면, 기존의 힙 영역의 데이터는 가비지가 됨
        → 가비지 컬렉션 과정에서 오버헤드 증가

  • 예시

    int i = 123;     
    object o = i;     // boxing
    int j = (int)o;   // unboxing

    • boxing
      : 정수 변수 i를 오브젝트 타입의 개체 o에 할당
    • unboxing
      : boxing된 개체 o를 값 타입의 정수 변수 j로 변환

  • 해결
    • 제네릭(Generic)을 사용해 값 형식과 참조 형식 간의 변환 최소화
profile
자라나는 감자

0개의 댓글