자바 inheritance - 상속, 메서드 오버라이딩, 다형성

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