다형성, 동적 바인딩

Dec 28, 2023
다형성, 동적 바인딩
 

1. 다형성(Polymorphism)

 
💡
하나의 식별자로여러개의 작업을 하는 것
 
notion image
 
다형성을 쉽게 설명하면 다음과 같다.
도형이라는 큰 카테고리 내에 삼각형, 사격형, 원 과 같은 다양한 모양들이 포함되어 있는 것과 같다.
바꿔 말하면 다양한 타입의 자료형을 동일한 타입으로 처리하는 것이다.
 
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(); 로 같은 클래스로 선언해야 되지만, 상속 상태에서는 부모의 클래스명도 이용할 수 있다.
notion image
 
💡
자식 클래스에서 부모 클래스는 변환 가능하지만, 부모 클래스에서 자식 클래스로 변환은 불가하다.
notion image
 
 

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 클래스를 생성 후 메인해서 호출한다.
notion image
 
 
만약 이 코드에서 왕이 아니라 왕비가 심문을 한다면? 모자장수가 아니라 토끼가 대답을 해야한다면? 이렇게 해야한다.
 
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 클래스를 만들어 상속 시키고 오버라이드하면 새로운 캐릭터가 생길 때마다 새로운 자료형을 만들 필요 없이 통일할 수 있다.
 
notion image
 
💡
오버라이드 할 때 부모 메서드와 자식 메서드가 동일해야 한다. 이를 강제하기 위해 부모 클래스에 abstract 를 사용한다.
 
abstract class Judge { public abstract void hearing(); } abstract class Witness { public abstract void answer(); }
 
오버라이브할 때 메서드 명을 일치시키지 않으면 오버로딩 처리된다.
부모 클래스는 오버라이딩으로 자식 클래스를 호출하는 통로로만 이용된다.
따라서 abstract ( 추상화 ) 를 통해 자식 메서드명을 강제할 수 있다.
 
notion image
 
메서드명을 잘못 입력하면 오류가 난다.
Share article
RSSPowered by inblog