다형성 (Polymorphism)

다형성이란 부모-자식 상속관계에 있는 클래스에서

 

상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체지향 원리이다

 

쉽게 얘기하면 객체를 생성할때 타입을 부모클래스로 하고 생성자를 자식클래스로 할 수 있다

 

Parent a = new Child(); 라고 했을때 원래 a. 으로 접근 할 수 있었던 것은

 

부모 클래스만 가능하지만 다형성을 활용하여 부모 클래스가 자식 클래스가 어떻게 구현되어 있는지

 

모른다 하더라도 오버라이딩을 통해 자식 클래스에 접근할 수 있게 된다

 

그것이 동적바인딩 때문이라고 보면 된다

 

이때 바인딩이라는 것은 프로그램에서 사용될 변수나 메서드를 결정짓는 행위를 말한다

 

아래와 같이 Animal인 부모 클래스를 선언하고 자식클래스인 Dog와 Cat을 생성하고

 

부모의 메서드를 오버라이딩해서 객체를 생성하는 종류에 따라 값이 어떻게 나오나 확인하겠다

 

// 부모클래스인 Animal 클래스 
//추상메소드인 start(), stop()메소드를 선언
public abstract class Animal {
    public abstract void start();
    public abstract void stop();
}

// 자식클래스인 Dog 클래스
public class Dog extends Animal{

    @Override
    public void start() {
        System.out.println("Dog Start");
    }

    @Override
    public void stop() {
        System.out.println("Dog Stop");        
    }
}

// 자식 클래스인 Cat 클래스
public class Cat extends Animal{

    @Override
    public void start() {
        System.out.println("Cat Start");
    }

    @Override
    public void stop() {
        System.out.println("Cat Stop");        
    }
}

 

동적 바인딩

실행 시간중에 일어나거나 실행과정에서 변경될 수 있는 바인딩

 

동적 바인딩은 오버라이딩에 해당 되는데 런타임 시에 어떤 메서드를 실행할지 결정된다

 

import java.util.Scanner;

public class DynamicBind {
    public static void main(String[] args) {
System.out.println("Input No : [1. 강아지, 2. 고양이]");
        
        Scanner sc = new Scanner(System.in);
        int no = sc.nextInt();
        
        Animal animal = null;
        
        switch(no){      
        case 1:
            animal = new Dog();            
            break;
        case 2:
            animal = new Cat();            
            break;            
        }
        
        animal.start();
        animal.stop();
    }
}

 

이때 자식클래스에 오버라이딩 되어있기에

1번을 누를시 Dog Start, Dog Stop 이 나오고

2번을 누를시 Cat Start, Cat Stop 이 나온다

 

정적 바인딩

실행 시간전에 일어나 변화하지 않는 바인딩

 

정적 바인딩은 오버로딩에 해당 되는데 컴파일 시에 어떤 메서드를 실행할지 결정된다

 

import java.util.Scanner;

public class DynamicBind {
    public static void main(String[] args) {
System.out.println("Input No : [1. 강아지, 2. 고양이]");
        
        Scanner sc = new Scanner(System.in);
        int no = sc.nextInt();

        switch(no){      
        case 1:
            Dog dog = new Dog();
            dog.start();
            dog.stop();
            break;
        case 2:
            Cat cat = new Cat();
            cat.start();
            cat.stop();
            break;            
        }
    }
}

 

이때는 당연히 dog에 따라 cat에 따라 값이 나오겠지만

동적은 부모타입을 가지고 정적은 동일한 자식타입을 가진다는 점을 보면 된다