본문 바로가기
JAVA

JAVA 업캐스팅과 다운캐스팅 (+동적바인딩, 정적바인딩)

by 자바비터 2022. 3. 16.

먼저, 이전에 배웠던 상속에 대한 개념 간단하게 설명하자면

서브클래스는 슈퍼클래스를 상속받아 서브 클래스의 객체는 슈퍼클래스의 멤버를 모두 가지고, 사용할 수 있다.

  

▶ 업캐스팅이란?

업캐스팅이란 서브클래스의 객체를 슈퍼 클래스 타입으로 타입 변환함을 말한다.

자식 객체가 부모멤버를 활용할 때 사용하며 자식과 부모의 공통된 것만 사용할 수 있고 자식클래스에서 새로 만들어진 건 사용 할 수 없다.

대신 자식클래스의 재정의된 메소드(오버라이딩)는 자식클래스 것을 사용한다.

  

▶ 다운캐스팅이란?

다운캐스팅이랑 업캐스팅과 반대로 슈퍼클래스 객체를 서브클래스 타입으로 타입 변환함을 말한다.

   

   

업캐스팅 예제 (+동적바인딩과 정적바인딩)
public class Shape { //슈퍼클래스
	protected String name;
	public void paint() {
		//**(3)이 부분에서 동적 바인딩이 발생해 @Override 하고 있는 draw 메소드로 이동 
		draw();
	}
	//**(6)이동해서 이전에 전달받은 name을 호출하고 (6)
	public void draw() {
		System.out.println(name);
	}
}
public class Ex11 extends Shape { //서브클래스 -> shape을 상속받음
	protected String name;
	@Override
	//**(4)해당 메소드가 호출되어 데이터를 입력함
	public void draw() {
		name = "Circle";
		super.name = "Shape";
		//super.name을 활용해 부모 클래스에 이름 입력
		//**(5)super 키워드를 통해 다시 부모 클래스의 draw로 이동
		super.draw();
		//**(7)다시 자식 클래스로 이동해 Circle을 출력하고 종료 
		System.out.println(name);
	}
	public static void main(String[] args) {
		Shape b = new Ex11();
		//**(1)업캐스팅 객체 생성
		b.paint();
		//**(2)부모 클래스 Shape의 paint 메소드 호출
	}
}

 

주석으로 코드 진행 순서를 달아 놓았다.

(1) 먼저 서브클래스 객체를 슈퍼클래스 타입으로 업캐스팅으로 해주었다.

(2) 다음 슈퍼클래스 shape의 메소드를 호출하였다.

(3) 호출된 shape의 paint의 메소드는 draw()를 실행하는 내용을 가지고 있어 draw() 메소드를 실행한다.

여기 중요한 것은 슈퍼클래스의 draw() 메소드와 서브클래스가 오버라이딩한 draw() 메소드 중 어떤 메소드가 실행되는가?

→ 이때 실행되는 메소드는 바로 서브클래스의 메소드이다.

*동적 바인딩이란 실행할 메소드를 실행 시(run time)에 결정하는 것을 말한다.

이 때 동적바인딩이 발생하여 @override하고 있는 서브클래스의 메소드가 호출된다

 

(4) 그렇게 호출된 서브클래스의 draw() 메소드가 실행된다.

(5) 서브클래스에서 super 키워드를 사용하여 다시 부모클래스의 draw() 메소드를 호출한다.

super 키워드는 슈퍼클래스의 멤버를 접근할 때 사용되는 레퍼런스로 서브클래스에서만 사용 가능하며

컴파일러(compiler)는 super의 접근을 정적 바인딩으로 처리한다.

 

(6) 호출된 슈퍼클래스의 메소드를 실행하고

(7) 다시 본 서브클래스의 메소드로 돌아와 남아있는 코드를 진행한다.

 

 

메소드를 왔다갔다거리는게 처음에는 복잡하고 어렵게 느껴질 수 있지만 업캐스팅, 상속등을 잘 활용하면

더 간편하고 간략한 코드진행을 할 수 있다.

 

 

댓글