[자바 객체 지향] 다형성
2021. 8. 5. 17:55ㆍCSE/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가지가 가능함
=> 매우 불편하다
- 오버로딩은 함수명 하나를 가지고 인자 목록만 다르게 하면 된다.
=> 또한 제네릭을 이용하면 하나의 함수만 구현해도 다수의 함수를 구현한 효과를 낼 수 있다.
- 오버 라이딩의 경우에도 하위 클래스가 재정의한 메서드를 알아서 호출해 줌으로써 하위 클래스가 무엇인지 신경쓰지 않아도 된다.
=> 다형성이 사용 편리성인 이유다.
'CSE > JAVA' 카테고리의 다른 글
[자바 객체 지향] static 블록 (0) | 2021.08.07 |
---|---|
[자바 객체 지향] 캡슐화 (0) | 2021.08.05 |
[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 2 (0) | 2021.07.30 |
[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 1 (0) | 2021.07.26 |
06. Exception (0) | 2020.01.20 |