boxing / unboxing과 type casting의 차이점은 무엇입니까?
boxing / unboxing과 type casting의 차이점은 무엇입니까?
종종 용어는 같은 의미로 사용되는 것 같습니다.
Boxing은 nullable이 아닌 값 형식을 참조 형식으로 변환하거나 값 형식을 구현하는 일부 인터페이스 (예 :) int로 변환하는 것을 말합니다 IComparable<int>. 또한 기본 값 형식을 nullable 형식으로 변환하는 것도 boxing 변환입니다. (주의 :이 주제에 대한 대부분의 논의는 후자의 두 가지 유형의 변환을 무시합니다.)
예를 들면
int i = 5;
object o = i;
i유형의 인스턴스 로 변환 합니다 object.
Unboxing은 object또는 의 인스턴스에서 ValueTypenullable이 아닌 값 형식 으로의 명시 적 변환 , 즉 인터페이스 형식을 nullable이 아닌 값 형식 (예 : IComparable<int>to int) 으로 변환하는 것을 말합니다 . 또한 nullable 형식을 기본 형식으로 변환하는 것도 unboxing 변환입니다. (주의 :이 주제에 대한 대부분의 논의는 후자의 두 가지 유형의 변환을 무시합니다.)
예를 들면
object o = (int)5;
int i = (int)o;
boxed in 정수 o를 유형의 인스턴스 로 변환합니다 int.
유형 캐스트는 표현식을 주어진 유형으로 명시 적으로 변환하는 것입니다. 그러므로
(type) expression
명시 적으로 expression유형의 객체 로 변환 합니다 type.
Boxing 및 Unboxing은 유형 캐스트의 하위 집합입니다. Boxing은 값 유형을 참조 유형으로 처리하는 행위입니다 (실제로는 스택에서 해당 값 유형의 내용을 힙으로 복사하고 해당 객체에 대한 참조를 반환하는 작업이 포함됨). 이를 통해 호환 가능한 참조 유형이 예상되는 모든 곳에서 값 유형을 전달할 수 있습니다. 또한 가상 메서드 호출 및 참조 유형의 기타 기능을 값 유형에서 수행 할 수 있습니다. Unboxing은이 작업의 반대입니다 (박스형 개체에서 값 유형을 가져옴).
유형 캐스트는 특정 유형의 변수에서 다른 유형으로의 모든 유형의 변환에 사용되는 용어 입니다. 더 넓은 개념입니다.
몇 분 전에 나는이 차이를 다루는 관련 질문에 답했다 . 요약하면 C # 캐스트 연산자에서 생성 된 다양한 유형의 IL 명령어를 분류했습니다.
- Boxing (
boxIL 명령) 및 unboxing (unboxIL 명령) - 상속 계층 구조를 통한 캐스팅 (
dynamic_cast<Type>C ++에서 와 같이castclassIL 명령어를 사용하여 확인) - 기본 유형 간 캐스트 (
static_cast<Type>C ++에서 와 같이 기본 유형간에 다양한 유형의 캐스트에 대한 많은 IL 명령어가 있음) - 사용자 정의 변환 연산자 호출 (IL 수준에서는 적절한
op_XXX메서드 에 대한 메서드 호출 일뿐입니다 ).
Boxing은 값 유형 (int, double, float, Guid 등)을 참조 유형 (System.Object, System.String 등)으로 바꾸는 용어입니다. 이 boxing 작업을 수행하면 힙에 메모리가 할당됩니다 (가비지 수집기가 결국 회수해야 함). Unboxing은이 프로세스의 역으로 참조 유형을 가져와 값 유형으로 변환합니다.
캐스팅은 형식 (예 : System.Object)을 가져 와서 다른 형식 (예 : System.String)으로 처리합니다.
C #으로 상자를 만들면 다른 유형으로 캐스팅하는 것입니다. 차이점은 새로운 참조 유형이 생성 될 때 추가 메모리를 할당한다는 것입니다 .
결론 : boxing은 값 유형을 참조 유형으로 변환하는 특수한 유형의 캐스트이며 새 참조 유형을 할당해야합니다.
boxing / unboxing 및 형식 캐스팅은 두 가지 다른 작업이지만 동일한 구문을 사용합니다.
그들은 그것에 대해 이야기하는 사람이 실제로 무슨 일이 일어나고 있는지 모를 때만 같은 의미로 사용됩니다.
Boxing은 값 유형을 힙에 객체로 저장하고 unboxing은 객체에서 값을 읽습니다. 정확한 유형이므로 값의 상자를 풀 수 있습니다.
주조는 (AN에서 같은 다른 기본 타입으로 기본 형식을 변환 할 때입니다 intA를 long), 또는 (에서 같은 참조의 유형을 변경하는 경우 List<int>에 IEnumerable<int>).
Boxing은 값 유형 변수 (즉, 정수)를 참조 유형으로 변환하는 것을 의미합니다. Unboxing은 유형 캐스팅을 사용하는 그 반대입니다. .NET 세계에서 모든 것은 간단히 말해서 "개체"유형에서 파생됩니다.
예 (C # 예) :
int myInt = 0; // original variable (unboxed to begin with)
object boxed = myInt; // box it up
int myIntUnBoxed = (int)boxed; // and unbox it again using type casting
여기서 빼놓을 수없는 것은 유형 시스템의 통합으로 값 유형을 참조 유형으로 처리 할 수 있다는 것입니다. 이 기사 는 boxing / unboxing에 대해 더 심도있게 살펴 봅니다.
'IT TIP' 카테고리의 다른 글
| npm을 사용하여 여러 버전의 패키지를 설치하는 방법 (0) | 2020.11.24 |
|---|---|
| Java ReentrantReadWriteLocks-안전하게 쓰기 잠금을 획득하는 방법은 무엇입니까? (0) | 2020.11.24 |
| CallTarget에 매개 변수를 전달하는 MSBuild (0) | 2020.11.24 |
| 현재 브라우저 창이 닫힐 때 Chrome 개발자 도구가 닫히지 않도록하려면 어떻게하나요? (0) | 2020.11.24 |
| GCC의 std :: put_time 구현 상태? (0) | 2020.11.24 |