728x90
반응형
메서드 오버라이딩
다형성을 통해 조상의 자료형으로 자식의 클래스를 호출하면 일반적으로 조상의 멤버변수와 메서드만 호출할 수 있다.
하지만 상속의 조건하에서 오버라이딩된 자식의 메서드는 동일한 이름으로 되어있기 때문에 호출 가능하다.
public class Overriding {
public static void main(String[] args) {
Speaker speaker = new Speaker();
Speaker speaker2 = new BaseEnSpeaker();
speaker2.setVolumeRate(7);
System.out.println(speaker2.getVolumRate());
speaker2.showCurrentState();
//출력문:
//7
//베이스 크기: 0
// 자료형이 Speak임에도 불구하고 오버라이딩시킨 자식의 메서드가 출력됨
// 이 속성때문에 다형성을 사용. 즉 상속의 조건하에서 오버라이딩 시킨 자식의 메서드를 호출할 수 있다.
}
}
만약 조상의 메서드를 호출하고 싶으면 자식의 클래스에 가서 조상의 메서드를 호출해주면 된다.
주의할점:
- 이 때 super.로 조상의 메서드를 지정해주지 않으면 가장 가까이있는 같은 이름을 호출하기 때문에 StackOverFlow 오류가 난다.
public class BaseEnSpeaker extends Speaker {
private int baseRate;
public void showCurrentState() {
super.showCurrentState();
System.out.println("베이스 크기: " + baseRate);
}
다형성
다형성을 이해할 때 'has a' or 'is a'를 참조하여 이해하면 편하다.
예를 들어 아래에 보면 3개의 클래스를 내포하고 있는데 '컴퓨터는 노트북 or 태블릿PC는 어문상 어색하지 않다.
하지만 '태블릿PC는 컴퓨터이다'라는 말 자체는 어문상 어색하므로 다형성에서도 말이 되지 않는다.
말인 즉슨 역순으로 다형성을 지정하는 것은 문법상 오류가 발생한다.
불가:
- NoteBook -> Computer
- TabletPC -> Computer
- TabletPC -> NoteBook
public class RefVarUse {
public static void main(String[] args) {
Computer c = new NoteBook();
Computer c2 = new TabletPC();
NoteBook n = new TabletPC();
// TabletPC t = new NoteBook(); // 불가능
}
}
class Computer{
public Computer() {
}
}
class NoteBook extends Computer{
public NoteBook() {
}
}
class TabletPC extends NoteBook{
public TabletPC() {
}
}
728x90
반응형
'국비과정 > Java' 카테고리의 다른 글
자바 추상클래스 abstract (0) | 2022.02.18 |
---|---|
프로젝트를 설계할 때 생각해야할 순서 (0) | 2022.02.17 |
자바 StringTokenizer (0) | 2022.02.14 |
자바 static 메서드 (0) | 2022.02.10 |
자바 접근제어자 (0) | 2022.02.08 |