C#) 캐스팅, 박싱, 언박싱

2024. 11. 14. 14:51·Programming/C C# C++
반응형

캐스팅

캐스팅이란 변수의 자료형을 다른 자료형으로 변환하는 연산을 말한다.

이 캐스팅에는 암시적 캐스팅과 명시적 캐스팅의 두 종류로 나뉘는데, 전자의 경우 단위가 작은 자료형에서 단위가 큰 자료형으로 캐스팅 하는경우 (float에서 double형으로 캐스팅 등등)가 있다.

short a = 20;
int b = a;

이런 형식으로 말이다.

 

명시적 캐스팅의 경우 자료형의 형태가 다르거나 더 큰 자료형에서 작은 단위의 자료형으로 형 변환하는 경우 주로 사용한다.

double a = 3.14;
float b = (float) a;

float c = 2.17;
int d = (int) c;

두 경우 모두 명시적 캐스팅이지만, 조금의 차이가 존재한다.

전자의 경우 큰 단위(8바이트)에서 작은 단위(4바이트)로 자료형이 작아지기 때문에 범위를 넘은 수의 경우 사라질수 있는 위험성 때문에 명시적 캐스팅을 해준 경우이다.

후자의 경우 실수 자료형에서 정수 자료형으로 명시적 캐스팅을 해주는 경우로, 이 경우 소수점 단위가 사라지고 정수 부분만 남게 된다.

부득이하게 C++로 실행한 것을 이해바랍니다...

 

자료를 보면 2.17이 형변환 과정에서 소수점 부분인 0.17이 사라지고 2로 나오게 된 것을 알 수 있다.


박싱 & 언박싱

박싱의 경우에는 조금 다른 이야기인데, 값 형식의 데이터를 참조 형식으로 변환하는 것을 의미한다.

반대로 박싱했던 값들을 다시 원상복귀시키는 것을 언박싱이라고 한다.

 

값형식과 참조형식을 간단하게나마 설명하자면 변수를 복사했을 때, 값 형식의 경우 데이터를 수정한다고 그것이 연동되는 것은 아니지만, 참조형식의 경우 데이터가 연동된다는 느낌으로 이해하면 좋을 것 같다.

 

어떻게 박싱과 언박싱을 할수 있을까?

위에서 설명했든 캐스팅과 연관성이 짙은데, object라고 하는 자료형을 이용해보자.

이 object라고 하는 자료형은 참조형식의 모든 자료형의 부모이다.

따라서 모든 자료형을 이 object로 캐스팅이 가능하다.

int a = 314;
object b = a;

이런식으로 말이다.

 

반대로 언박싱을 하는 경우 다음과 같이 할수 있다.

int a = 314;
object b = (object) a;
int c = (int) b;

c라는 변수에 언박싱이 된 모습이다.

 

왜 사용하는가?

예를 들어 배열을 만든다고 해보자. int형 배열을 만들었다고 가정할 때, 여기에 string타입을 넣을수는 없다.

그런데 이때! object타입으로 배열을 박싱해준다면 이 배열에 숫자 뿐만 아니라 string타입의 변수도 넣을수 있게 된다.

object[] arr = new object[2]; //C#의 경우 배열을 자료형 옆에 선언한다.

arr[0] = 1;
arr[1] = "C#"

 

다만 메모리 이슈 때문에 요즘은 제네릭을 더 많이 사용한다.

반응형

'Programming > C C# C++' 카테고리의 다른 글

C#) 메서드와 매개변수  (0) 2024.11.22
C#) C#에서의 배열 사용 방법  (2) 2024.11.18
C#) 값 형식과 참조 형식  (0) 2024.11.13
C#) Null과 Void의 차이  (0) 2024.11.13
1.1 + 0.1 == 1.2가 false인 이유  (1) 2024.11.11
'Programming/C C# C++' 카테고리의 다른 글
  • C#) 메서드와 매개변수
  • C#) C#에서의 배열 사용 방법
  • C#) 값 형식과 참조 형식
  • C#) Null과 Void의 차이
skajalf
skajalf
skajalf 님의 블로그 입니다.
  • skajalf
    skajalf 님의 블로그
    skajalf
  • 전체
    오늘
    어제
    • 분류 전체보기 (154) N
      • UNITY (6)
        • FanGame (6)
        • Portfolio (0)
      • UnReal (0)
      • DirectX (0)
      • 코딩테스트 (114) N
      • Programming (34)
        • C C# C++ (9)
        • 디자인 패턴 (0)
        • 자료구조 & 알고리즘 (3)
        • 기타 (22)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    다들 아는거 굳이 적을 이유가 있을까..?
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
skajalf
C#) 캐스팅, 박싱, 언박싱
상단으로

티스토리툴바