상속의 예제를 보면서 상속을 좀 더 이해해보려고 합니다
public class BasicUI {
private Scanner scanner;
//Scanner 생성자
public BasicUI(Scanner scanner) {
this.scanner = scanner;
}
//String 타입 입력받기
public String input(String msg){
System.out.println(msg);
return scanner.nextLine();
}
//int 타입 입력받기
public int inputInt(String msg){
String inputStr = input(msg);
return Integer.parseInt(input(msg));
}
}
BasicUI Class에서는 Scanner로 String 값과 int 값을 받을 수 있는 로직을 만들었습니다
그리고 SampleUI를 만들어서 BasicUI를 상속해보려 했는데 띠용??? 에러가.... 하지만 겁먹을 거 없습니다 바로 해결해 보겠습니다
public class SampleUI extends BasicUI{
public SampleUI(Scanner scanner) {
//부모의 생성자
super(scanner);
}
}
이렇게 하니 오류가 사라졌습니다 하지만 오류가 왜 생길 걸까요??
super
- 그 이유는 new SampleUI(); 만들면 굉장히 재미있는 일이 일어납니다 new는 메모리 공간을 새로 만든다는 뜻입니다 그럼 new SampleUI를 하면 SampleUI 구조를 만들게 됩니다 하지만 지금 SampleUI는 BasicUI를 상속하고 있습니다 그래서 new SampleUI 하면 내부적에서는 SampleUI와 BasicUI의 인스턴스가 같이 생성됩니다 그리고 그 둘을 이어주는 것이 바로 super입니다 자 그럼 본론으로 돌아와서 왜 에러가 났을까요?? SampleUI는 부모의 인스턴스가 안 만들어져 있었기 때문입니다 지금 BasicUI 에는 생성자로 Scanner이 걸려있었기 때문에 자식 Class에서도 반듯이 부모의 인스턴스를 만들어 주어야 정상적으로 기능하게 됩니다 그래서 우리는 상속을 이용하면 가장 먼저 부모의 인스턴스를 먼저 만들어 주어야 합니다
- 오버라이드하면 자식 클래스는 부모 클래스의 원래의 메소드를 잃어버리는 단점을 가지게 됩니다. 즉 재정 의하면서 기존 부모 클래스의 메소드의 호출할 수 있는 고리를 잃어버리는 겁니다. 하지만, super라는 키 워드를 활용하면 부모에서 물려받은 원래의 메소드를 사용할 수 있도록 합니다.
extends 란?
상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적습니다.
자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 합니다.
JAVA에서 중요한 코드 등장
public class Main {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
BasicUI ui = new SampleUI(scanner);
}
}
BasicUI ui = new SampleUI(scanner); 이 코드는 굉~~~ 장히 중요한 코드입니다 그 이유는 지금까지 사용했던 코드들은
보통 BasicUI ui = new BasicUI(scanner); 이런 식으로 앞뒤의 타입들이 똑같았습니다 하지만 상속을 배우면서는 달라지기 시작했다는 겁니다 위 코드처럼 말이죠
그림으로 보는 상속
현재 로직은 이런 식으로 되어있고 BasicUI 에는 input 가 있습니다
여기서 우리가 ui.input(...); 하게 되면 ui는 sampleUI로가서 input를 찾고 없으면 범위를 넓혀서 BasicUI 로가서 찾게 된다
'JAVA' 카테고리의 다른 글
추상 클래스(Abstract Class) (0) | 2022.03.19 |
---|---|
눈 속임 Override (0) | 2022.03.14 |
상속이란? (0) | 2022.03.14 |
ArrayList (0) | 2022.03.13 |
메모장 파일 불러오기 File = new File (0) | 2022.03.09 |