🍏 개발일기

오버로딩과 오버라이딩 | 동적바인딩

보배 진 2025. 10. 20. 12:04

[ 오버로딩 ]

함수명 중복정의 허용

상속 X

메서드 시그니쳐 X

 

[ 오버라이딩 ] 

메서드 재정의

상속 O

메서드 시그니쳐 O

 

package class06;

class Poketmon {
	String type;
	String name;
	Poketmon(String type, String name) {
		this.type = type;
		this.name = name;
	}
	void hello() {
		System.out.println("본인이름을 외칩니다");
	}
	void attack() {
		System.out.println("타입에 맞는 공격을 합니다");
	}
}

class Water extends Poketmon {
	Water(String name){
		super("물", name);
	}
	@Override
	void attack() {
		System.out.println("물대포~~!!");
	}
}

class Squirtle extends Water {
	Squirtle() {
		super("꼬북이");
	}
	@Override
	void hello() {
		System.out.println("꼬북꼬북");
	}
}
class Gorapaduck extends Water {
	Gorapaduck(){
		super("고라파덕");
	}

	@Override
	void hello() {
		System.out.println("파덕파덕");
	}
}


class Fire extends Poketmon {
	Fire(String name){
		super("불", name);
	}

	@Override
	void attack() {
		System.out.println("불꽃~~!!");
	}
	
}

// 파이리 
class Charmander extends Fire {
	Charmander() {
		super("파이리");
	}

	@Override
	void hello() {
		System.out.println("리리");
	}	
}

// 리자몽
class Charizard extends Fire {
	Charizard(){
		super("리자몽");
	}

	@Override
	void hello() {
		System.out.println("몽몽~");
	}	
}

public class Test01 {
	public static void main(String[] args) {
		Poketmon[] datas = new Poketmon[3];
		int index = 0;
		datas[index++] = new Squirtle();
		datas[index++] = new Charmander();
		
		datas[0].attack(); // 포켓몬아, 공격해!
		datas[0].hello(); // 포켓몬아, 인사해!
		// 디형성  
		//  : 실제로 존재하는 객체가 무엇인지에 따라
		//    같은 메서드를 호출하더라도 다른 기능이 수행되는 현상
		// 동적바인딩
		//	: 부모의 변수 안에 구현되어 있는 객체가 자식인 상황
		//	  이때 오버라이딩 된 메서드 호출시, 실제 객체의 메서드가 수행되는 현상
		// 동적바인딩 덕분에 다형성이 실현됩니다.
		
		datas[1].attack();
		datas[1].hello();	
	}
}

[ 다형성]

실제로 존재하는 객체가 무엇인지에 따라

같은 메서드를 호출하더라도 다른 기능이 수행되는 현상

 

[ 동적바인딩 ]

부모의 변수 안에 구현되어 있는 객체가 자식인 상황

이때 오버라이딩 된 메서드 호출시, 실제 객체의 메서드가 수행되는 현상

동적바인딩 덕분에 다형성이 실현됩니다

 

 

 

자바 가상 머신(JVM)은 시행단계에서 객체의 타입을 보고 적절한 메소드를 호출하게 된다
이것을 동적 바인딩이라고 한다