객체지향 언어를 이해하기 위한 책을 보면서 위와 같은 질문이 보여 중요하다고 생각되어 정리해보려고 한다. 특히 다형성이란 단어가 생소해서 유튜브도 찾아보고 책도 읽어보고 했는데, 역시나 어려운 개념인 것 같다.
정의:
다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다. 즉, 하나의 타입에 여러 객체를 대입할 수 있는 성질로 이해하면 좋을 것이다.
다형성의 목적:
다형성을 활용하면 기능을 확장하거나, 객체를 변경해야 할 때 타입 변경 없이 객체 주입만으로 수정이 일어나게 할 수 있다. 또 상속을 사용하면 중복되는 코드까지 제거할 수 있다는 이점이 있다.
다형성의 종류:
오버라이딩, 오버로딩, 인터페이스
다형성을 표현한 예로 부모클래스를 자식클래스가 상속받는 다는 오버라이딩이 있다. 오버라이딩이란 상위클래스에 선언되어 있는 메소드를 하위 클래스에서 선언하여 사용하는 것을 말한다.
메소드의 이름, 시그니처(메서드 이름과 매개변수 리스트)가 동일하지만 하위 클래스에서 구현내용을 재정의 하여 사용할 수 있다. 아래의 예제를 보자.
publi class Parent{
public void work(){
system.out.println("일하는중");
}
}
public class Child extends Parent{
public void work(){
system.out.println("다른일하는중");
}
public static void main(String[] args){
Parent p1=new Parent();
Parent p2=new Child();
}
}
이처럼 Child클래스가 Parent클래스를 상속받아 Parent클래스의 work메소드를 재정의하고 있는 것을 알 수 있다.
오버라이딩에서의 다형성의 특징
main메서드의 실행부를 보면 Parent p1=new Parent();은 이해가 가나, Parent p2=new Child(); 가 어떻게 가능한지 궁금할 것이다. 이부분이 바로, 다형성이 사용된 예이다. Child클래스의 인스턴스가 생성될때는 Child클래스가 상위객체로 형변환이 가능하다는 것이다. 좀 더 확장해서 생각해보면, java에서 다른 클래스를 상속받는 하위 클래스들은 상위객체로 형변환하여 사용이 가능한 것이다. 이 것이 다형성의 예이다.
다형성을 표현한 예로 오버로딩이 있는데, 우리가 가장 많이 쓰는 println메서드를 통해 이해해보자.
println()
메서드는 문자열이든, 숫자든, 논리값이든 한 메서드를 가지고 모든 것을 읽어 들일 수 있다. 이것이 가능한것은 println이라는 메서드명하나만으로 여러가지 객체를 수용할 수 있도록 아래와 같이 설계해 두 었기 때문이다.
public void println(char x) {
synchronized(this) {
this.print(x);
this.newLine();
}
}
public void println(int x) {
synchronized(this) {
this.print(x);
this.newLine();
}
}
위 예제와 같이 똑같은 메서드명으로, 여러타입의 매개변수를 받을 수 있도록 해둔 것이 오버로딩의 정의이다.