업캐스팅, 다운캐스팅

우종현·2024년 3월 13일
0

CS

목록 보기
7/8

형변환은 클래스 사이에서 일어나는데 상속 관계에 있는 부모와 자식 클래스간에 형변환이 가능하다.
상속관계의 부모와 자식클래스의 형변환은 업캐스팅과 다운캐스팅 두가지가 있다.

업 캐스팅(Up Casting)

자식에서 부모로 형변환 하는 것을 업캐스팅 이라고 한다. 자식타입의 객체를 부모 타입의 변수로 참조 하는 것으로 자식타입의 객체의 전부 접근할 순 없고 부모로부터 상속받은 멤버들만 접근이 가능하다. 자식만의 멤버에 접근하려하면 컴파일에러가 발생한다.

다운 캐스팅(Down Casting)

부모에서 자식으로 형변환 하는 것을 다운 캐스팅이라고 한다. 다운 캐스팅은 묵시적 형변환을 제공해주지 않고 컴파일 에러가 발생한다. 객체가 메모리를 할당받는 일은 런타임중에 일어나서 컴파일 타임에서는 부모타입의 변수가 어떤 타입의 객체를 가리키고 있는지 알 수 없기 때문이다. 자식 타입의 객체를 참조하던 부모 타입 변수를 자식 타입으로 형변환 해주는 것은 가능하지만 컴파일러가 자동으로 해주지는 않기 때문에, 명시적 형변환을 해주어야 한다.
명시적 형변환에서도 문제가 없진 않다. 컴파일에선 문제가 없지만 런타임 시에 오류가 발생할 수 있다. 부모 타입의 변수가 자식 타입으로 명시적 형변환을 할 때는 문제가 없지만 같은 부모를 가진 다른 자식 타입으로 명시적 형변환을 할 때 런타임 오류가 발생한다. 자식 타입끼리는 서로 공유하지 않는 멤버변수들이 존재할 수도 있기 때문이다.

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

// Knife는 Weapon으로부터 상속받았다.

Weapon weapon = new Knife();

bool isKnife = (weapon is Gun);

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

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

// Gun은 Weapon으로부터 상속받았다.

Weapon weapon = new Gun();

Gun gun = (weapon as Gun);

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

0개의 댓글