오늘 배운 로직 위주의 상속을 이용해서 UI를 만들었습니다
설계
가장 먼저 부모인 BasicUI를 만들어주었습니다
BasicUI
public class BasicUI {
private Scanner scanner;
//Scanner 생성자
public BasicUI(Scanner scanner) {
this.scanner = scanner;
}
//메시지 출력하는 기능
public void print(String msg){
System.out.println(msg);
}
//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(inputStr);
}
//자식에서 Override 할수있는 대상
//각 자식에서 다른 작업을하기에 이곳에서는 아무 기능이 없음
public void execute(){
}
BasicUI Class는 String , int 타입의 입력을 받는 기능과 여러 자식들이 Override 할 공간을 가지고 있습니다
첫째 자식 등록
public class RegisterUI extends BasicUI{
//부모 상속자의 생성자 생성
public RegisterUI(Scanner scanner) {
super(scanner);
}
//Override 할 대상
@Override
public void execute() {
print("이 화면은 등록 시 사용하는 화면입니다.");
}
}
등록을 담당할 RegisterUI는 부모의 생성자를 먼저 생성해주고 화면 등록을 프린트하고 있습니다
둘째 자식 조회
public class ReadUI extends BasicUI{
//부모 상속자의 생성자 생성
public ReadUI(Scanner scanner) {
super(scanner);
}
@Override
public void execute() {
print("조회하는 화면입니다");
}
}
조회를 담당하는 ReadUI 도 마찬가지로 부모의 생성자를 먼저 생성해주고 조회를 프린트하고 있습니다
셋째 자식 삭제
public class RemoveUI extends BasicUI{
public RemoveUI(Scanner scanner) {
super(scanner);
}
@Override
public void execute() {
print("삭제하는 화면입니다.");
}
}
다른 자식들과 똑같이 만들어 줍니다
이제는 Main으로 보내기 전에 만들어줄 TotalUI을 만들어보겠습니다
TotalUI
public class TotalUI {
//BasicUI의 배열
private BasicUI[] uis;
private Scanner scanner;
//생성자
public TotalUI(BasicUI[] uis, Scanner scanner) {
this.uis = uis;
this.scanner = scanner;
}
public void display() {
System.out.println("0:Register(등록), 1:Read(조회), 2:Remove(삭제), -1:Exit(종료)");
//사용자에게 idx 받기
int idx = Integer.parseInt(scanner.next());
//종료해줄 ui 추가 <이것도 상속으로 만들수있음>
if (idx == -1) {
System.out.println("Exit..................");
return;
}
//execute() = 실행
uis[idx].execute();
//재귀호출
display();
}
}
Total Class에서는 이제 BasicUI의 배열을 만들어주고
display를 만들어주어서 사용자의 값을 받고 그 값에 따라 등록 조회 삭제 종료로 이동할 수 있게 만들어 주었습니다
그리고 마지막에 uis [idx]. execute();를 호출해주면서 배열에 사용자에게 받은 idx를 받아 Override를 위해 만들어두었던 execute를 불러 주면서 각 상황에 맞게 이동할 수 있게 만들었습니다
Main
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
BasicUI[] uis = new BasicUI[3];
uis[0] = new RegisterUI(scanner);
uis[1] = new ReadUI(scanner);
uis[2] = new RemoveUI(scanner);
//TotalUI에서 만든 TotalUI로 연결
TotalUI totalUI = new TotalUI(uis,scanner);
totalUI.display();
}
}
Main에서는 각 배열에 등록 , 조회 , 삭제 등을 할당해주고 그것을 TotalUI에서 만든 totalUI로 연결해주고 TotalUI에서 만든 display 호출해주었습니다
결과
완성된 로직을 실행한 모습입니다
상속을 사용하니 하나의 타입 (BasicUI)에 여러 종류의 객체를 의미할 수 있게 되었습니다 그러다 보니 if ~else 가 없어졌습니다
만약에
여기서 새로운 ui를 만들려면 BasicUI를 상속하면서 execute를 반듯이 overrid 해 주어야 합니다
추상 메소드
public class ListUI extends BasicUI {
public ListUI(Scanner scanner) {
super(scanner);
}
}
새롭게 ListUI를 만들었습니다 근데 보면 좀 이상합니다 바로 execute를 overrid하지 안았습니다
문제는 일어나지 안지만 이렇게 한다면 ListUI를 실행한다면 아무 일도 일어나지 않을 겁니다
그래서 지금 제가 하고 싶은 것은 "자신이 가진 기능을 물려주면서 강제적으로 overrid 하게끔 만들어주고 싶다"입니다
우선 BasicUI 에 execute로 이동해서
execute 앞에 abstract 를 붙여주었습니다 그러니 에러가 삐빅....
에러를 수정해주기 위해 execute를 이렇게 수정해주었고요
BasicUI 앞에도 abstract를 붙여주었습니다 이렇게 해주고 새로 만들었던 ListUI에도 execute를 overrid 해주니 에러가 사라졌습니다
이후
public class ListUI extends BasicUI {
public ListUI(Scanner scanner) {
super(scanner);
}
@Override
public void execute() {
print("목록 화면 UI입니다 ");
}
}
print 메시지를 만들어주고
main과 TotalUI에 ListUI의 내용을 추가해주었습니다
짠✨이렇게 결과가 수정되었습니다
그럼 이제 방금 사용한 abstract 이 무엇인지 이야기해봐야 할 것 같습니다 이 키워드를 사용한
public abstract void execute();
이 코드는 추상 메서드라고 합니다 이 추상 메서드는 하위에서 반듯이 이 메서드를 overrid 해야 합니다 그러기 위해서는 외부에서 이 메서드가 보여야 하기 때문에 반듯이 public 여야 합니다 private를 하게 된다면 overrid 해야 하는데 못 찾아서 못하겠죠???
그렇다면 추상 메서드인 execute를 가진 BasicUI도 abstract를 사용해서 추상 클래스로 만들어준 이유는??
그 이유는 추상 메서드를 가진 Class를 new 하면 안 되기에 추상 Class로 선언해주어야 합니다 이렇게 추상 Class로 선언해주면 직접 new를 할 수가 없습니다 하지만 상속 기능은 해줄 수가 있습니다!!!
마치며
강의 7일 차만에 이 정도까지 진행했다는 게... 정말 믿기지 않습니다... 많은 정보들이 머리에서 뒤죽박죽으로 난리를 치고 있지만... 하루하루 새로운 걸 배우면 성장해가는 재미가 나름 쏠쏠한 것 같네요
'개발자 성장 일지' 카테고리의 다른 글
2022.03.15 Interpace (0) | 2022.03.15 |
---|---|
2022.03.15 데이터 위주의 상속 (0) | 2022.03.15 |
2022.03.13 UI & Main (0) | 2022.03.13 |
2022.03.13 투표 패키지 (0) | 2022.03.13 |
2022.03.12 투표 유권자 패키지 (0) | 2022.03.12 |