[자바 객체 지향] 다형성

2021. 8. 5. 17:55CSE/JAVA

1. 오버라이딩과 오버로딩

- 다형성의 가장 기본은 오버라이딩과 오버로딩이다.

- 오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의

- 오버 로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의

 

2. 다형성과 T 메모리

public class Animal{
	public String name;
    
    public void showName(){
    	Systen.out.println("안녕 나는 %s야. 반가위\n", name);
    }
}
public class Penguin extends Animal{
	public String habitat;
    
    public void showHabitat(){
    	System.out.printf("%s는 %s에 살아\n", name, habitat);
    }
    
    public void showName(){
    	System.out.println("어머 내 이름은 알아서 뭐하게요?");
    }
    
    public void showName(String yourName){
    	System.out.printf("%s 안녕, 나는 %s라고 해\n", yourName, name);
    }
}
public class Driver{
	public static void main(String[] args){
    	Penguin pororo = new Penguin();
        
        pororo.name = "뽀로로";
        pororo.habitat = "남극";
        
        pororo.showName(); //어머 내 이름은 알아서 뭐하게요? => Penguin 클래스의 showName()
        pororo.showName("초보람보"); //초보람보 안녕, 나는 뽀로로라고 해
        pororo.showHabitat(); //뽀로로는 남극에 살아
        
        Animal pingu = new Penguin();
        
        pingu.name = "핑구";
        pingu.showName(); //어머 내 이름은 알아서 뭐하게요? => Penguin 클래스의 showName()
    }
}

- 위의 Driver 클래스의 5번째 줄을 실행한 후의 T 메모리 스냅샷이다.

- 이번에는 14번째 줄을 실행한 후의 T 메모리 스냅샷이다.

=> pingu 객체 참조 변수는 타입이 Animal이지만, Animal 객체의 showName()은 Penguin 객체의 showName()에 의해 가려져 있다.

=> 따라서 pingu.showName()은 Penguin의 showName()을 실행하게 된다.

 

3. 다형성의 편리함

- 다형성이 지원되지 않는다면, 두 정수를 더하는 함수는 add(int,int)로, 두 실수를 더하는 함수는 addFloat(float,float)로 만들어야한다.

=> 이러한 조합이 49가지가 가능함

=> 매우 불편하다

 

- 오버로딩은 함수명 하나를 가지고 인자 목록만 다르게 하면 된다.

=> 또한 제네릭을 이용하면 하나의 함수만 구현해도 다수의 함수를 구현한 효과를 낼 수 있다.

 

- 오버 라이딩의 경우에도 하위 클래스가 재정의한 메서드를 알아서 호출해 줌으로써 하위 클래스가 무엇인지 신경쓰지 않아도 된다.

 

=> 다형성이 사용 편리성인 이유다.