개발/JAVA

[JAVA] 자바 업캐스팅, 다운캐스팅

윤_ve 2021. 2. 22. 22:29

자바에서 캐스팅(casting)은 형변환, 타입을 변경시키는 것을 뜻한다. 

 

부모와 자식의 관계 즉 상속 관계에서 상위클래스에 속하는 슈퍼클래스하위 클래스에 속하는 서브 클래스의 형변환을 캐스팅이라고 하고  서브 클래스가 슈퍼클래스로 변환되는 것을 업캐스팅, 그 반대를 다운캐스팅이라고 한다.


업캐스팅

 

자바의 상속관계는 상위클래스의 모든 특성을 하위 클래스가 받아서 사용할 수 있다. 그 말은 서브 클래스는 수퍼클래스 취급을 받을수 있다는 말인데 여기서 업캐스팅을 통해 객체가 슈퍼클래스 타입으로 형변환을 시킨다.

 

 

위의 코드에서 25행 부분만 이런식으로 바꿨는데 자동으로 JVM이 컴파일하면서 인식하지만 굳이 붙여준 이유는 관행상 부모 유형을 명시하는건 권장한다고 한다!!

 

그렇다면 업캐스팅은 왜 사용하는 것일까??

 

업캐스팅의 사용은 객체지향의 특징 중에 하나인 다형성(Polymorphism)과 관련있다. 

package javaEx;

class Parents {
	public void familyName() {
		System.out.print("김");
	}
	
	public void name() {
		familyName();
		System.out.println("철수");
	}
}

class Son extends Parents {
	public void name() {
		familyName();
		System.out.println("인직");
	}
}

class Daughter extends Parents {
	public void name() {
		familyName();
		System.out.println("희선");
	}
}

public class UpCastingEx2 {
	public static void main(String[] args) {
		Son s = new Son();
		Daughter d = new Daughter();
		
		Parents p = (Parents)s; // 업캐스팅 (Parents)생략가능
		Parents p2 = (Parents)d;
		
		p.name();  // 인직 앞에 김이 붙음
		p2.name(); // 희선 앞에 김이 붙음
	}
}

 

위 와 같이 재사용 해야하는 반복된 메서드를 업캐스팅을 통해 부모클래스에서 가져와서 서브클래스를 호출할때 사용할 수 있기 때문이다.

 


다운캐스팅

 

다운캐스팅은 업캐스팅과 반대의 의미로 생각하면 된다.  슈퍼클래스 객체가 서브 클래스 객체로 다운 형변화를 일으키는 것을 말하는데 이는 자신의 특성을 잃어버린 서브 클래스의 객체를 다시 복구시켜주는 것이다. 이것도 예제를 통해 쉽게 이해할 수 있다.

class Person2 {
    String name;

    public Person2(String name) {
        this.name = name;
    }
}

class Engineer2 extends Person {
    String dept;

    public Engineer2(String name) {
        super(name);
    }
}

public class DownCastingEx {
    public static void main(String[] args) {
        Person person = new Engineer2("Kim"); // 업캐스팅을 실행
        Engineer2 e = (Engineer2) person; // 다운캐스팅을 실행 (업캐스팅과 다르게 클래스를 명시해주어야함)
        e.dept = "안녕";
        e.name = "김김김";
    }
}

이렇게 혼동되어 사용하는 객체를 구분해주는 연산자 instanceof 가 있는데 이는 다음글에 적도록 하겠다.