티스토리 뷰

 

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

Value 타입은 주로 값을 저장할 때 쓰는 저장소이며 다형적이지 못하다. 그리고 System.Object는 .NET 프레임워크에서 모든 타입의 최상위 타입으로 정의하고 있는데 언뜻 보면 Value 타입과 System.Object는 양립하지 못하는 것처럼 보인다. 하지만 .NET 프레임워크는 박싱과 언박싱이라는 방법을 통해서 두 타입을 서로 변환하게 해준다.


박싱과 언박싱(Boxing and Unboxing)

박싱 : Value 타입의 객체를 타입이 정해져 있지 않은 임의의 참조 타입 내부에 포함시키는 방법

언박싱 : 박싱되어 있는 참조(reference) 타입의 객체로부터 Value 타입 객체의 복사본을 가져오는 방법

이런 박싱과 언박싱은 System.Object 타입이나 인터페이스 타입이 필요한 부분에 Value 타입의 객체를 적용하기 위해서 필요한 기능이지만 가능하면 쓰지 않는 것이 좋다.

박싱과 언박싱을 최소화하는 이유

우선 첫번째로 성능에 안 좋은 영향을 준다.

다소 억지로 변환해주는 방법이다 보니 예상치 못한 곳에서 버그가 발생할 수 있다.

박싱과 언박싱을 최소화하는 방법

대부분의 경우에는 .NET 2.0에 추가된 제네릭(Generic) 클래스와 제네릭 메서드를 사용하면 박싱과 언박싱을 피할 수 있다.

하지만 .NET 프레임워크 곳곳에 System.Object 타입의 객체를 요구하는 API들이 많고 여전히 박싱과 언박싱을 수행한다. 이러한 박싱과 언박싱은 모두 자동으로 이뤄지고 reference 타입의 객체가 필요한 곳에 value 타입의 객체를 사용하면 컴파일러는 자동으로 박싱과 언박싱을 수행한다. 아래 코드가 그 예이다.

firstNumber, secondNumber, thirdNumber는 int 타입이지만 보간 문자열에 대입되면서 System.Object 타입으로 변환하면서 박싱을 수행하게 된다. 그리고 보간 문자열의 string화 되기 위해 자동으로 ToString() 메서드를 수행한다.

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

이런 방법은 성능에 좋지 않은 영향을 주게 된다. 이런 성능상의 취약점을 개선하고 싶다면 WriteLine 메서드에 Value 타입의 객체를 직접 전달하지 말고 string 인스턴스를 전달하는 것이 좋다. 아래 코드가 그 예이다.

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

박싱을 피하는 규칙

위의 코드가 박싱을 피하는 첫 번째 규칙으로 System.Object 타입으로 박싱이 이루어지는지 유심히 살펴보고 이를 개선하라이다.

그리고 비교적 손쉬운 또 다른 규칙은 가능한 한 .NET 2.0 이전의 컬렉션 사용을 피하고 .NET 2.0에 추가된 제네릭 컬렉션을 사용하라이다. .NET 2.0이전의 컬렉션은 System.Object 타입의 객체에 대한 참조를 저장하도록 구현되어 있기 때문에 컬렉션에 Value 타입의 객체를 추가하려는 경우 자동으로 박싱을 수행한다.

결론!!

Value 타입과 System.Object 타입(혹은 다른 인터페이스 타입)간의 변환이 가능한 박싱과 언박싱이라는 기능이 있다. 하지만 이 기능은 암시적으로 이루어져 변환 작업을 알기 어렵고, 이로 인해 알 수 없는 버그가 발생할 수가 있다. 또한 Value 타입을 다형적으로 처리하는 과정에서 성능을 느리게 한다.

따라서, Value 타입을 System.Object 타입이나 인터페이스 타입으로 변경하는 코드는 가능한 작성하지 않는 것이 좋다.


다소 이해하기 어려운 파트였다.

박싱과 언박싱이라는 개념도 모르고 나도 모르게 그런 코드를 작성하고 있었기 때문이다.

지금 당장만 해도 나도 모르게 박싱과 언박싱을 수행한 코드가 몇몇 생각난다. 고치러 가자..

참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함