[Effective C#] 박싱과 언박싱을 최소화하라

2024. 8. 5. 21:16·독서/Effective C#


값 타입과 참조 타입

C#을 다루다보면 값 타입과 참조 타입에 대한 이야기를 듣게 된다. 이전에 작성한 CLR 게시글에서도 지금 작성하는 이야기와 비슷한 내용을 다뤘었다. 값 타입은 메모리의 스택 영역에 저장이 되고 참조 타입은 메모리의 힙 영역에 저장이 된다. 그렇기 때문에 서로 연산을 하기 위해서 같은 공간으로 데이터를 가져와야 하는데, 이 경우에는 값 타입을 박싱을 통해서 메모리의 힙 영역으로 이동시킨다. 

 

내가 제대로 기억하고 있는게 맞다면 값 타입은 박싱 과정에서 힙 영역에 해당 타입을 수용할 수 있는 용량만큼 할당하고 값을 복사하게 된다. 그렇기 때문에 흔히들 박싱 작업이 무거우며 성능에 좋지 않다고 이야기한다.

 


박싱의 예시

박싱을 찾는 것은 생각보다 많은 곳에서 찾을 수 있다. 아래의 코드는 박싱을 나타내는 예시다.

int firstNumber, secondNumber, thirdNumber;
firstNumber = secondNumber = thirdNumber = 5;

Console.WriteLine($"A few numbers : {firstNumber}, {secondNumber}, {thirdNumber}");

 

WriteLine 메서드는 매개변수로 String 타입을 받고 있는데 정수 타입인 int를 Object 타입으로 박싱하고 다시 String 데이터를 가져오는 것이다. 해당 코드를 풀어서 작성하면 다음과 같은 느낌일 것이다.

int i =25;
object o = i;
Console.WriteLine(o.ToString());

 

예시 코드 박싱 해결법

int firstNumber, secondNumber, thirdNumber;
firstNumber = secondNumber = thirdNumber = 5;
Console.WriteLine($"A few numbers : {firstNumber.ToString()}, {secondNumber.ToString()}, {thirdNumber.ToString()}");

 

ToString 메서드를 통해서 박싱을 피할 수 있도록 할 수 있다. 

 


다른 방법의 박싱 해결 방법

.NET 1.x의 컬렉션은 System.Object 타입 객체에 대한 참조를 저장하도록 구현되어 있다. 컬렉션은 객체를 가져오는 경우 박싱된 객체의 복사본을 가져온다. 매번 객체 복사가 이루어지는 것이다. 그렇기 때문에 2.0에 추가된 제네릭 컬렉션을 사용하는 것으로 박싱을 최소화하자.

 

 

'독서 > Effective C#' 카테고리의 다른 글

[Effective C#] .NET 리소스 관리에 대한 이해  (0) 2024.08.07
[Effective C#] 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라  (0) 2024.08.06
[Effective C#] 이벤트 호출 시에는 null 조건 연산자를 사용하라  (0) 2024.08.03
[Effective C#] 델리게이트를 이용하여 콜백을 표현하라  (0) 2024.08.02
[Effective C#] nameof() 연산자를 적극 활용하라  (0) 2024.08.01
'독서/Effective C#' 카테고리의 다른 글
  • [Effective C#] .NET 리소스 관리에 대한 이해
  • [Effective C#] 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라
  • [Effective C#] 이벤트 호출 시에는 null 조건 연산자를 사용하라
  • [Effective C#] 델리게이트를 이용하여 콜백을 표현하라
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
      오블완
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [Effective C#] 박싱과 언박싱을 최소화하라
    상단으로

    티스토리툴바