![Object 형식과 박싱 & 언박싱](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqi8sb%2FbtrI6dppoyL%2FVOzqPZHjVVVYbPz6eMFAM1%2Fimg.gif)
Object 형식
- 닷넷 프레임워크의 C#은 Object형식이 존재한다.
- C#은 모든 객체들이 Object를 상속받도록 되어있다.
- 오브젝트 형식은 모든 닷넷 클래스의 궁극적인 기본 클래스이다.
- 모든 참조형식(문자열, 배열, 클래스 , 인터페이스)와 모든 값형식(int,Boolean,char..등등)의 데이터를 참조할 수 있다.
오브젝트 형식은 상속이 암시적으로 이루어지기 때문에 따로 Object를 선언하는 클래스가 필요하지는 않다.
위에 적은것처럼 닷넷의 모든 클래스는 object의 파생 클래스이기 때문에 object로 정의된 모든 메서드는 시스템의 모든 개체에서 쓸 수 있다.
파생 클래스들은 이 메서드 중 일부를 재정의 할 수 있다.
Equals - 개체 간의 비교를 지원합니다.
Finalize - 개체가 자동으로 회수되기 전에 정리 작업을 수행합니다.
GetHashCode - 해시 테이블 사용을 지원하기 위해 개체 값에 해당하는 숫자를 생성합니다.
ToString - 클래스의 인스턴스를 설명하는 사람이 읽을 수 있는 텍스트 문자열을 제조합니다.
박싱
int같은 형식은 값타입이라 데이터가 스택에 생성되고
object는 참조 타입이라 데이터가 힙에 생성된다.(class 이기 때문에)
그렇다면 이 Obejct라는 형식은 어떤 방법으로 모든 데이터형식을 참조 할 수 있는걸까?
int i = 123;
object o = i;
위와 같은 코드가 있다고 가정해보자.
int형 타입 i를 object 타입의 O라는 변수에 담았다.
이게 Boxing이라는 과정이고, 변수 i에 암시적으로 boxing 연산을 적용한다.
박싱을 하면 힙에 i의 데이터 형식과 값을 저장하여 참조한다.
마치 박스에 타입과 값을 넣어둔것처럼 보인다고 해서 박싱이라고 한다.
언박싱
int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
박싱을 통해 변수 o 에 i의 값을 담고 ,
int j 에 o를 넣었다.
O는 object형식이기 때문에 힙에 참조하고 있는 박스에서 데이터 타입과 값을 꺼내서 j에 넣는다.
이 과정이 박스에 담긴 물건을 꺼내는것과 비슷하다고 해서 언박싱이라고 한다.
이 과정에서 타입을 비교하고 값을 복사한다.
박싱과 언박싱의 문제점
당연히 성능에 문제가 있다.
마이크로 소프트의 도큐먼트를 참조해보면,
단순 할당에서 박싱과 언박싱을 수행하는데 많은 계산 과정이 필요 하다고 한다.
또 박싱을 하는 과정에서 인스턴스를 생성한다.
박싱과 언박싱에 의해 가비지가 생성되고, 시간도 오래 걸린다.
해결 방안
안쓰는것이 최선의 방법이지만
object 타입으로 형변환이 일어나지않게 제네릭 타입을 사용하는 방법도 있다.
참고 문서
Object 클래스 (System) | Microsoft Docs
Object 클래스 (System)
.NET 클래스 계층 구조의 모든 클래스를 지원하며 파생 클래스에 하위 수준 서비스를 제공합니다. 이는 모든 .NET 클래스의 궁극적인 기본 클래스이며 형식 계층 구조의 루트입니다.
docs.microsoft.com
Object Data Type - Visual Basic | Microsoft Docs
Object Data Type - Visual Basic
자세한 정보: 개체 데이터 형식
docs.microsoft.com
Boxing 및 Unboxing - C# 프로그래밍 가이드 | Microsoft Docs
Boxing 및 Unboxing - C# 프로그래밍 가이드
C# 프로그래밍의 boxing 및 unboxing에 대해 알아봅니다. 코드 예제를 살펴보고 사용 가능한 추가 리소스를 확인합니다.
docs.microsoft.com
'프로그래밍 공부 > C# 프로그래밍' 카테고리의 다른 글
[Unity_C#] Switch문 & Switch 식 (0) | 2022.08.21 |
---|---|
클래스와 구조체 / 배열과 리스트 / awake와 start의 차이 (0) | 2022.08.11 |
가비지 컬렉터(garbage collector) (0) | 2022.08.08 |
[OOP]객체 지향 프로그래밍에 대해 (0) | 2022.07.06 |
코루틴(Coroutine)에 관한 고찰 (0) | 2022.06.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!