1. 다형성(Polymorphism)
하나의 식별자로여러개의 작업을 하는 것

다형성을 쉽게 설명하면 다음과 같다.
도형이라는 큰 카테고리 내에 삼각형, 사격형, 원 과 같은 다양한 모양들이 포함되어 있는 것과 같다.
바꿔 말하면 다양한 타입의 자료형을 동일한 타입으로 처리하는 것이다.
class Animal {
void speak() {
System.out.println("animal 클래스의 사운드");
}
}
class Dog extends Animal {
void speak() {
System.out.println("멍멍");
}
}
class Cat extends Animal {
void speak() {
System.out.println("야옹");
}
}
public class DynamicCallTest {
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.speak();
a2.speak();
원래는 Dog a1 = new Dog(); 로 같은 클래스로 선언해야 되지만, 상속 상태에서는 부모의 클래스명도 이용할 수 있다.

자식 클래스에서 부모 클래스는 변환 가능하지만, 부모 클래스에서 자식 클래스로 변환은 불가하다.

2. 동적바인딩(Dynamic binding)
JVM 이 실행단계에서 변수가 참조되는 객체의 실제 타입을 보고 적절한 메소드를 호출하는 것
class King {
public void hearing() {
System.out.println("왕은 심문한다.");
}
}
class Hatter {
public void answer() {
System.out.println("모자장수는 대답한다");
}
}
public class AliceApp {
public static void main(String[] args) {
King king = new King();
Hatter hatter = new Hatter();
king.hearing();
hatter.answer();
}
}
위와 같은 코드가 있다.
King 클래스와 Hatter 클래스를 생성 후 메인해서 호출한다.

만약 이 코드에서 왕이 아니라 왕비가 심문을 한다면? 모자장수가 아니라 토끼가 대답을 해야한다면? 이렇게 해야한다.
class King {
public void hearing() {
System.out.println("왕은 심문한다.");
}
}
class Queen {
public void hearing() {
System.out.println("왕비는 심문한다.");
}
}
class Hatter {
public void answer() {
System.out.println("모자장수는 대답한다");
}
}
class Rabbit {
public void answer() {
System.out.println("토끼는 대답한다");
}
}
public class AliceApp {
public static void main(String[] args) {
King king = new King();
Hatter hatter = new Hatter();
Queen queen = new Queen();
Rabbit rabbit = new Rabbit();
queen.hearing();
rabbit.answer();
}
}
새로운 캐릭터가 생길 때 마다 더욱 많은 자료형이 필요하다.
이럴 때 부모 클래스 판사, 증인 을 만들어서 상속하자
class Judge {
public void hearing() {
}
}
class Witness {
public void answer() {
}
}
class King extends Judge {
public void hearing() {
System.out.println("왕은 심문한다.");
}
}
class Queen extends Judge {
public void hearing() {
System.out.println("왕비는 심문한다.");
}
}
class Hatter extends Witness {
public void answer() {
System.out.println("모자장수는 대답한다");
}
}
class Rabbit extends Witness {
public void answer() {
System.out.println("토끼는 대답한다");
}
}
public class AliceApp {
public static void main(String[] args) {
Judge king = new King();
Judge queen = new Queen();
Witness hatter = new Hatter();
Witness rabbit = new Rabbit();
queen.hearing();
rabbit.answer();
}
}
Judge 클래스와 Witness 클래스를 만들어 상속 시키고 오버라이드하면 새로운 캐릭터가 생길 때마다 새로운 자료형을 만들 필요 없이 통일할 수 있다.

오버라이드 할 때 부모 메서드와 자식 메서드가 동일해야 한다. 이를 강제하기 위해 부모 클래스에 abstract 를 사용한다.
abstract class Judge {
public abstract void hearing();
}
abstract class Witness {
public abstract void answer();
}
오버라이브할 때 메서드 명을 일치시키지 않으면 오버로딩 처리된다.
부모 클래스는 오버라이딩으로 자식 클래스를 호출하는 통로로만 이용된다.
따라서 abstract ( 추상화 ) 를 통해 자식 메서드명을 강제할 수 있다.

메서드명을 잘못 입력하면 오류가 난다.
Share article