mojo's Blog

명품 JAVA Programming 제 5장 실습문제 12번 본문

Java

명품 JAVA Programming 제 5장 실습문제 12번

_mojo_ 2021. 7. 19. 01:48

텍스트로 입출력하는 간단한 그래픽 편집기를 만드는 문제이다.

 

추상 글래스 Shape과 Line, Rect, Circle 클래스 코드를 잘 완성하고 이를 활용하여 4가지 그래픽 편집 기능을 가진 클래스 GraphicEditor을 작성한다.

 

연결리스트 구현과 비슷한 느낌이여서 직접 코드를 작성해보았다.

 

+ 삭제 구현을 할 때, 삭제된 노드의 동적 할당을 해제시키기 위해 System.gc(); 를 호출하였다.

 

code

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() {
		// TODO Auto-generated method stub
		System.out.println("Line");
	}
	
}

class Rect extends Shape{

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("Rect");
	}
	
}

class Circle extends Shape{

	@Override
	public void draw() {
		// TODO Auto-generated method stub
		System.out.println("Circle");
	}
	
}

class GraphicEditor{
	Scanner scanner=new Scanner(System.in);
	Shape s;
	int cnt_Shape;
	GraphicEditor(){
		s=null;
		cnt_Shape=0;
		play();
	}
	void play() {
		while(true) {
			System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
			int op=scanner.nextInt();
			if(op==1) {
				insert();
			}
			else if(op==2) {
				delete();
			}
			else if(op==3) {
				show();
			}
			else if(op==4) {
				exit();
				break;
			}
		}
	}
	void insert() {
		System.out.print("Line(1), Rect(2), Circle(3)>>");
		int op=scanner.nextInt();
		if(op==1) {
			if(s==null) {
				s=new Line();
				s.setNext(new Line());
			}
			else {
				Shape tmp=s;
				while(true) {
					tmp=tmp.getNext();
					if(tmp.getNext()==null) {
						tmp.setNext(new Line());
						break;
					}
				}
			}
			cnt_Shape++;
		}
		else if(op==2) {
			if(s==null) {
				s=new Rect();
				s.setNext(new Rect());
			}
			else {
				Shape tmp=s;
				while(true) {
					tmp=tmp.getNext();
					if(tmp.getNext()==null) {
						tmp.setNext(new Rect());
						break;
					}
				}
			}
			cnt_Shape++;
		}
		else if(op==3) {
			if(s==null) {
				s=new Circle();
				s.setNext(new Circle());
			}
			else {
				Shape tmp=s;
				while(true) {
					tmp=tmp.getNext();
					if(tmp.getNext()==null) {
						tmp.setNext(new Circle());
						break;
					}
				}
			}
			cnt_Shape++;
		}
	}
	void delete() {
		System.out.print("삭제할 도형의 위치 >>");
		int loc=scanner.nextInt();
		if(loc<=cnt_Shape && loc>0) {
			Shape before=s, current=s.getNext();
			for(int i=0;i<loc-1;i++) {
				before=current;
				current=current.getNext();
			}
			before.setNext(current.getNext());
			current.setNext(null);
			cnt_Shape--;
			System.gc();
		}
		else {
			System.out.println("삭제할 수 없습니다.");
		}
	}
	void show() {
		Shape current=s;
		for(int i=0;i<cnt_Shape;i++) {
			current=current.getNext();
			current.draw();
		}
	}
	void exit() {
		System.out.println("beauty을 종료합니다.");
	}
}

public class Main {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		
		System.out.println("그래픽 에디터 beauty을 실행합니다.");
		GraphicEditor g=new GraphicEditor();
		
		scanner.close();
	}

}
Comments