일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |
- 충돌위험 찾기
- CSharp #자료구조
- pccp 기출문제 2번
- Lv2
- Back Tracking
- 프로그래머스
- raycasting
- pccp 기출문제 3번
- 깊이 우선 탐색
- Unity
- ASTAR
- Blend Type
- Algorithm
- 플레이어 방향전환
- heap tree
- 유니티
- LayerMark
- Hp바
- 2D슈팅게임
- Hpbar
- 플레이어 이동
- C#
- 너비 우선 탐색
- pccp 기출문제 1번
- Object Poling
- Animation State Machine
- Ainimation Blending
- Object Pooling
- 오브젝트 풀링
- Scrooling
- Today
- Total
주녘공부일지
[C#] Object 형식과 박싱&언박싱 본문
1. Object 형식
모든 형식의 궁극적인 기반 클래스로 그 어떤 형식도 Object로 업캐스팅 할 수 있음 ( 참조 형식 )
- C#의 모든 클래스 또는 구조체는 Object 클래스를 암시적으로 상속함
ex) object 형식을 다루는 컬렉션 Stack
public class Stack
{
int position;
object[] data = new object[10];
public void Push (object obj) { data[position++] = obj; }
public object Pop() { return data[--position]; }
}
static void Main()
{
Stack stack = new Stack();
stack.Push("Sample");
string s = (string)stack.Pop(); // 다운 캐스팅이므로 명시적 캐스팅 필요
}
object(.NET Framework : System.Object)의 모든 멤버
namespace System
{
public class Object
{
public Object();
~Object();
public static bool Equals(Object? objA, Object? objB);
public static bool ReferenceEquals(Object? objA, Object? objB);
public virtual bool Equals(Object? obj);
public virtual int GetHashCode();
public Type GetType();
public virtual string? ToString();
protected Object MemberwiseClone();
}
}
C#의 형식 시스템
https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/
2. 박싱&언박싱
값 형식과 참조 형식인 object 클래스 사이의 캐스팅을 가능하게 해주는 형식 통합의 수단으로, 참조 형식은 반드시 인터페이스나 Object 클래스여야 함
(참조 형식이 System.ValueType이거나 System.Enum인 경우도 가능)
박싱 : 값 형식 인스턴스를 새 객체로 복사
언박싱 : 객체의 내용을 다시 값 형식 인스턴스로 복사 // 명시적으로 캐스팅 해야 함
( 복사본은 원본이 변해도 같이 변하지 않음 )
int x = 9;
object obj = x; // int 박싱
int y = (int)obj; // int 언박싱
언박싱이 이루어질 때에는 실제 객체 형식과 주어진 값이 일치하는지 점검하여 만일 부합하지 않으면 예외를 던짐
// 잘못된 예시
object obj = 9; // 9는 int 형식으로 추론
long x = (long)obj; // 예외 : InvalidCastException
// 적법한 예시
object obj = 9; // int 형식으로 추론
long x = (int)obj; // 자동 형 변환 int -> long
object obj2 = 3.5; // double 형식으로 추론
int y = (int)(double)obj2; // y = 3
// 언박싱 (double) -> 수치 형식 변환 (int)
배열은 참조 변환만 지원하고 박싱 변환은 지원하지 않음
object[] a1 = new string[3]; // 적법
object[] a2 = new int[3]; // 오류
박싱&언박싱의 성능
- 데이터를 복사해 힙에 할당시키고 다시 스택에 가져오는 박싱&언박싱 작업은 가비지를 남겨 성능에 좋지 않은 영향을 줌
- MSDN에 나오는 내용에 따르면 박싱은 단순 메모리 할당에 비해 20배, 언박싱은 할당의 4배에 달하는 시간이 소요될 수 있음
https://learn.microsoft.com/ko-kr/dotnet/framework/performance/performance-tips
박싱&언박싱은 편리할 순 있지만 성능이 떨어지기 때문에 최대한 사용하지 않아야 하는 기술로, 형식 안전성 향상과 박싱&캐스팅을 줄이기 위해 제네릭을 사용하는 것이 바람직함
참고도서) C# 6.0 완벽가이드
'Programming > Definition, Etc' 카테고리의 다른 글
[C#] 열거형 (enum type) (1) | 2023.10.15 |
---|---|
[C#] 인터페이스 ( interface ) (0) | 2023.10.12 |
[C#] 스택 메모리 & 힙 메모리 (0) | 2023.10.04 |
[C#] 값 형식과 참조 형식 ( + 제네릭 형식, 포인터 형식 ) (0) | 2023.09.29 |
[C#] StringBuilder VS String 연산 성능 비교 (0) | 2023.08.18 |