JAVA/code

명품 자바 프로그래밍 5장 실습문제 12번

마이구미2 2021. 4. 13. 20:47
import java.util.*;

abstract class Shape {
	private Shape next;
	public Shape() {
		next = null;
	}
	public void setNext(Shape obj) { // 링크 연결
		next = obj;
	}
	public Shape getNext() {
		return next;
	}
	public abstract void draw(); // 추상 메소드
}

class Line extends Shape {
	@Override
	public void draw() {
		System.out.println("Line");
	}
}
class Rect extends Shape {
	@Override
	public void draw() {
		System.out.println("Rect");
	}
}
class Circle extends Shape {
	@Override
	public void draw() {
		System.out.println("Circle");
	}
}

public class exam12 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.println("그래픽 에디터 beauty을 실행합니다.");
		
		Shape start = null, last = null; // 시작, 끝 노드 null로 초기화
		int count = 0; // 연결된 노드 개수
		
		while(true) {
			System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
			
			try {
				int menu = scan.nextInt();
				
				// 삽입(1)
				if(menu == 1) {
					System.out.print("Line(1), Rect(2), Circle(3)>>");
					int drawMenu = scan.nextInt();
					
					Shape obj; // 삽입할 노드
					
					if(drawMenu == 1 || drawMenu ==2 || drawMenu == 3) {
						// 노드 객체 생성
						if(drawMenu == 1) // Line(1)
							obj = new Line();
						else if(drawMenu == 2) // Rect(2)
							obj = new Rect();
						else // Circle(3)
							obj = new Circle();
						// 노드 삽입
						if(start == null) // 연결된 노드 없음
							start = last = obj;
						else { // 마지막 노드와 연결 후 마지막 노드로 변경
							last.setNext(obj);
							last = obj;
						}
						count++; // 연결된 노드 개수 증가
					}
					else 
						System.out.println("없는 메뉴입니다.");
				}
				// 삭제(2)
				else if(menu == 2) {
					System.out.print("삭제할 도형의 위치>>");
					int dlt = scan.nextInt();
					
					Shape s = start; // 삭제할 노드(시작 노드에서 출발)
					
					if(dlt < 1 || dlt > count)
						System.out.println("삭제할 수 없습니다.");
					else {
						// 시작 노드 삭제
						if(dlt == 1) {
							if(count == 1) // 연결된 노드가 한 개
								start = last = null; // null로 초기화
							else // 연결된 노드가 여러 개
								start = s.getNext(); // 시작 노드를 다음 노드로 변경
						}
						else {
							// 삭제할 노드의 전 노드로 이동
							for(int i=0; i<dlt-2; i++)
								s = s.getNext();
							// 끝 노드 삭제
							if(dlt == count) {
								last = s; // 끝 노드를 전 노드로 변경
								last.setNext(null); // 원래 끝 노드 null로 초기화
							}
							// 중간 노드 삭제
							else
								s.setNext(s.getNext().getNext()); // 삭제할 노드의 전 노드를 다음 노드와 연결
						}
						count--; // 연결된 노드 개수 감소
					}
				}
				// 모두 보기(3)
				else if(menu == 3) {
					Shape s = start; // draw()할 노드(시작 노드에서 출발)
					// null이 아닐 때까지 반복
					while(s != null) {
						s.draw(); // draw() 오버라이딩
						s = s.getNext(); // 다음 노드로 이동
					}
				}
				// 종료(4)
				else if(menu == 4) 
					break;
				else
					System.out.println("없는 메뉴입니다.");
			}
			catch(InputMismatchException e) {
				System.out.println("없는 메뉴입니다.");
				scan.nextLine();
				continue;
			}
		}
		System.out.println("beauty을 종료합니다.");
	}
}