본문 바로가기

개발자노트

클래스) 상속.. 동적바인딩

  • 다형성을 사용하여 메소드를 호출할 때, 발생하는 현상이다.
  • 프로그램이 진행(즉, Runtime) 되면서 객체의 동작이 정해지는 것 <=> 정적바인딩( 컴파일 될 때 )
  • 실제 참조하는 객체는 서브 클래스이니 서브 클래스의 메소드를 호출한다.

 

 

package class01;
// [동적바인딩] = 맨 아래 라인 참조
class Point{
	int x;
	int y;
	void move(int x,int y) {
		this.x=x;
		this.y=y;
		System.out.println("변경 완료!");
	}
	
	
	Point(){
		this(0,0);
	}
	Point(int x, int y){
		this.x=x;
		this.y=y;
	}


	@Override
	public String toString() {
		
		return "("+this.x+","+this.y+")";
	}
	
}
class ColorPoint extends Point{
	String color;
	
	void move(String color,int x, int y) { // 오버로딩
		this.color=color;
		super.move(x,y);
	}
	
	
	
	ColorPoint(){
		this("검정",0,0);
	}
	ColorPoint(String color){
		this(color,0,0);
	}
	ColorPoint(int x,int y){
		this("검정",x,y);
	}
	ColorPoint(String color,int x, int y){
		super(x,y);
		this.color=color;
	}



	@Override
	public String toString() {
		return this.color+"("+this.x+","+this.y+")";
	}
	
	
}

public class Test01 {

	public static void main(String[] args) {
		
		
		Point[] data=new Point[5];
		data[0]=new Point(10,20);
		data[1]=new ColorPoint();
		data[2]=new ColorPoint(10,20);
		data[3]=new ColorPoint("빨강");
		data[4]=new ColorPoint("파랑",-1,-2);
		
		for (int i = 0; i < data.length; i++) {
			 System.out.println(data[i].toString());
		}
		

	}

}

1. 실제로 저장된 객체는 ColorPoint임에도 불구하고
   Point[]로 선언해두었기 때문에
   .toString()이 Point 것이라고 안내하고 있다.
    data[i]. << 찍어보면 뜸
2. 그런데! Point것이라고 안내해놓고
    ColorPoint 것을 호출하여 사용하고있다?!
3. 메서드를 호출하여 사용할 때 -> ★자기자신 영역을 먼저 확인하고★
    이후에 부모 영역을 확인하기 때문이다.!
    만약에 자식영역에 toString이 없으면 부모껄 쓰기 때문에 문자열은 출력이 안되고
    숫자만 출력될 것
 4. 이러한 현상을 "동적 바인딩" == 다형성이 구현,실현되었다.