객체지향 특성 중에 다형성에 대해 알아볼게요!
객체지향 4대 특성 중에 다형성에 대해 알아볼게요!
스프링 입문을 위한 자바 객체 지향의 원리와 이해- 김종민 지음 을 참고했습니다!
객체 지향의 4대 특성은 캡슐화, 상속, 추상화, 다형성 이 있어요. 캡! 상추다! 라고 외우면 잘 외워지니까 반드시 외우도록 해요.
다형성 : 사용편의성
객체지향에서 다형성은?? 오버라이딩과 오버로딩이 대표적인 예 라고 할 수 있어요.
오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
다형성은 코드를 보면서 이해하시는게 빠를거에요.
{% codeblock %}
class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n",name);
}
}
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 Exam2 {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName(); // 1
pororo.showName("초보람보"); // 2
pororo.showHabitat(); // 3
Animal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName(); // 4
}
}
{% endcodeblock %}
실행결과는 아래와 같아요. 숫자는 해당 메소드를 가리키는 거예요.
1: 어머 내 이름은 알아서 뭐하게요?
2: 초보람보 야. 안녕. 나는 뽀로로라고 해!
3: 뽀로로는 남극에 살아
4: 어머 내 이름은 알아서 뭐하게요?
1변 결과는 Animal 에 있는 showName() 이 아니라 Penguin 에서 Animal의 showName() 메서드를 오버라이드해서 사용한거에요.
2번은 showName() 을 오버로딩해서 사용한거에요. 메서드 이름은 같지만 인자 목록이 다르죠!
3번은 Penguin 클래스에 있는 showHabitat() 메서드를 사용한거에요. 상위클래스엔 없고 하위클래스에만 존재하는 메서드에요.
4번의 pingu 객체 참조 변수는 타입이 Animal 타입이지만 Penguin 객체에 의해 오버라이딩된 showName() 이 실행돼요. 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출된다는걸 기억합시다!
다형성을 설명할 때 제네릭을 빼놓을 순 없어요. 하지만 이번 포스팅에선 다루지 않겠습니다.
정리
오버로딩은 함수명 하나를 가지고 인자 목록만 다르게 하면 됩니다. 편리하쥬? 특히 제네릭 을 이용하면 하나의 함수만 구현해도 다수의 함수를 구현한 효과를 낼 수 있어요. 다형성에 대해 사용편의성이라고 정의한 이유는 바로 이 때문이죠.
오버라이딩의 경우에도 하위 클래스가 재정의한 메서드를 알아서 호출해 줌으로써 형변환이나 instanceof 연사자를 써서 하위 클래스가 무엇인지 신경 쓰지 않아도 돼요! 상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동으로 호출해 줌으로써 편의성이 증가하죠!
오버라이딩, 오버로딩을 통해 다형성을 제공하고 이 다형성이 편의성을 준다는 것이 느껴지나요? 오버라이딩은 재정의! 오버로딩은 중복 정의! 꼭 기억해놉시다!