다형성에는 오버라이드와 오버로드가 있다

다형성에는 오버라이드와 오버로드가 있다

 

다형성: 사용편의성

 

객체 지향에서 다형성이라고 하면 오버라이딩과 오버로딩이라고 할 수 있다.

 

물론 상위 클래스와 하위 클래스 사이에서도 다형성을 이야기 할 수 있고, 인터페이스와 그것의 구현 클래스 사이에서도 다형성을 이야기 할 수 있지만 가장 기본은 오버라이딩과 오버로딩이라고 할 수 있다.

 

오버라이딩과 오버로딩

 

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

 

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

 

ride - 올라타다

load - 적재하다.

 

결과

 

다형성과 메모리

 

위 그림은 5번째 줄을 실행한 후 메모리 상태이다.

 

그림에서 주목할 것은 Penguin 클래스가 상위 클래스인 Animal 클래스의 showName() 메서드를 오버라이딩(재정의)했다는 것과 showName(yourName:String) 메서드를 오버로딩(중복정의) 했다는 것이다.

 

10번째 줄의 pororo.showName(); 부분을 실행하면 Animal 객체에 있는 showName() 메서드는 Penguin 객체에 있는 showName() 메서드에 의해 재정의, 즉 가려졌기에 Penguin 객체에서 재정의한 showName() 메서드가 호출되어 다음과 같은 결과를 출력한다.

 

“어머 내 이름은 알아서 뭐하게요?”

 

11번째 줄의 pororo.showName(“호호”); 부분을 실행하면 문자열 하나를 인자로 받는 중복정의된 showName(yourName) 메서드를 호출한다.

 

 

주목할 점은 pingu 객체 참조 변수는 타임이 Animal 타입이다. 

 

그럼에도 Animal 객체의 showName()은 Penguin 객체의 showName()에 의해 가려져 있다.

 

따라서 17번째 줄의 pingu.showName() 메서드를 실행하면 Animal 객체에 정의된 showName() 메서드가 아닌 Penguin 객체에 의해 재정의된 showName() 메서드가 실행된다.

 

즉, 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩(재정의)한 메서드가 호출된다는 사실을 기억하자!

 

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

 

상위 클래스 타입의 객체 참조 변수에서 하위 클래서가 오버라이딩한 메서드를 자동으로 호출해 줌으로써 깔끔한 코드를 유지할 수 있게 된다.

실행 결과는 각 동물들이 하위 클래스 타입에 맞게 울게 된다는 것이다.

 

오버라이딩을 통한 메서드 재정의, 오버로딩을 통한 메서드 중복 정의를 통해 다형성을 제공하고 이 다형성이 개발자가 프로그램을 작성할 때 사용편의성을 준다는 것을 학습했다.

 

 

 

참고 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해