Record/TIL

[Unity] 형변환: 업캐스팅, 다운캐스팅 알아보기

석영 2024. 8. 20. 09:27
반응형

형변환 (Casting)

  • 숫자를 다른 형태의 숫자로 변환
  • 다른 자료형을 문자열로 변환
  • 문자열을 다른 자료형으로 변환

아직은 개발할때 간단한 형변환만 사용하고 업캐스팅, 다운캐스팅은 안하는데 물론 이게 좋은 방법은 아니라고 알고있다.

어쩔 수 없이 사용해야할때는 사용할 수 있어야하지만 바로 딱 떠오르지 않기때문에 공부가 필요한 것 같아서 가져왔다.

 

Upcasting

자식 객체에서 부모 객체로 형변환하는 것.
자식 타입의 객체를 부모 타입의 변수로 참조하는 것


자식 타입의 객체의 전부에 접근할 순 없고 부모로부터 상속받은 멤버들만 접근이 가능하다.

자식만의 멤버에 접근하려 하면 컴파일 오류가 발생한다.

 

Downcasting

부모 객체에서 자식 객체로 형변환하는 것


자식 타입의 객체를 참조하던 부모 타입 변수를 자식 타입으로 형변환해주는 것은 가능하지만 컴파일러는 자동으로 해주지는 않는다.

 

그 이유는? 

 

컴파일러 타임에는 부모 타입 변수가 어떤 타입의 객체를 가리키고 있는지 알 수가 없기 때문이다.

객체가 메모리를 할당받는 일은 런타임이기 때문에 컴파일 타임에선 부모 타입의 변수가 어떤 타입의 객체를 가리키고 있는지 알 수 없어 자동적으로 형병환을 해주지 않는다. 따라서, 명시적 형변환을 해주어야 한다.

 

명시적 형변환에서도 문제가 없진 않다. 컴파일에선 문제가 없지만 런타임 시에 오류가 발생할 수 있다.

부모 타입의 변수가 자식 타입으로 명시적 형변환을 할 땐 문제가 없지만 같은 부모를 가진 다른 자식 타입으로 명시적 형변환을 할 때에는 런타임 오류가 발생한다. 자식 타입끼리는 서로가 공유하지 않는 멤버들이 존재할 수도 있기 때문

 

해결 방법은 is, as

 

is

A is B : A 변수가 B 타입의 객체를 참조하고 있다면 True, 아니면 False를 반환.

Weapon weapon = new Knife();

bool isKnife = (weapon is Gun);

if (isKnife)
{
	Knife knife = (Knife)weapon;
}

 

as

A as B : A 변수를 B 타입으로 형변환하는 것이 가능하다면 형변환을 진행하고 그 결과를 반환, 불가능하다면 null을 반환

Weapon weapon = new Gun();

Gun gun = (weapon as Gun);

if (gun != null)
{
	Gun gun = (Gun)weapon;
}

 

weapon은 Gun 타입의 객체를 참조하고 있기 때문에 Gun 타입으로 형변환이 가능

따라서, gun에는 weapon이 참조하고 있던 객체라 반환되고 gun과 weapon은 힙에 있는 동일한 객체를 가리키게 된다.

gun은 weapon이 Gun 타입으로 형변환된 결과이다.

 

 

인용

>> Upcasting & Downcasting

 

[C#] Upcasting & Downcasting

C#의 업캐스팅과 다운캐스팅

velog.io

정리가 잘되어있는 글이 있어서 그대로 공부를 했습니다.

제꺼보다 인용한 원본 글에 들어가서 봐주세요.. 저는 저장용입니다..

반응형