방프리

20.04.15 Chapter1. C# 언어 요소 (Item 9) 본문

C#/Effective C#

20.04.15 Chapter1. C# 언어 요소 (Item 9)

방프리 2020. 4. 15. 18:52

Item 9: 박싱과 언박싱을 최소화하라

 

C++에서 C#으로 넘어와서 편하다고 생각한 것은 바로 데이터 타입이었다. C++은 데이터 타입에 관해 굉장히 엄격하다.

그래서 형변환에도 꽤나 힘든데 C#에서는 Object 개념을 통해 좀 더 유연하게 대처해준다. 

Object는 최상위 타입으로 모든 데이터 타입은 Object 하위에 있으며 Object 타입은 모든 데이터 타입을 커버할 수 있다

굉장히 편하지만 항상 편한 것들은 함정을 가지고 있다. Object는 상자 같은 개념으로 많이 표현하는데

데이터를 넣을 때 Object라는 큰 상자 안에 데이터를 넣고 Object 타입에서 다른 데이터 타입으로 가져올 땐 상자 안에

있는 데이터를 가져온다고 해서 언박싱, 데이터 타입을 Object 타입에 넣을 땐 상자 안에 데이터를 넣는다고 해서

박싱이라는 표현을 사용한다.

하지만 이 언박싱과 박싱을 수행하는 과정에서 굉장히 시간이 많이 걸린다. 

(일반적인 데이터 형변환 등의 수행보다 20배 가량 걸린다고 한다.)

거기다가 임시 객체를 생성하기도 하는데 이를 통해 문제가 발생할 수도 있다. 심지어 이러한 현상은

정상적? 이기 때문에 컴파일러는 그대로 수행한다.

박싱의 예
언박싱의 예

위으 코드들은 전혀 문제가 없지만 전혀 최적화가 안되는 코드이다.

저자는 만약 문자열로 출력해야 한다면 각 타입에 있는 ToString()을 통해 출력하거나 제네릭 컬렉션을 사용해

최대한 박싱, 언박싱을 피하라고 한다.

C#에서 데이터 타입을 배우면 가장 유의해야 하는 점으로 나오는 부분이다. 물론 편하게 쓰라고 만든 것을 

활용하는 것도 좋지만 후에 최적화 이슈가 나온다면....

감당은 알아서....

Comments