mojo's Blog
명품 JAVA Programming 제 5장 실습문제 12번 본문
텍스트로 입출력하는 간단한 그래픽 편집기를 만드는 문제이다.
추상 글래스 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();
}
}
'Java' 카테고리의 다른 글
boxing and unboxing (0) | 2021.07.20 |
---|---|
문자열을 기본 타입으로, 기본 타입 값을 문자열로 변환 (0) | 2021.07.20 |
명품 JAVA Programming 제 5장 Open Challenge (0) | 2021.07.19 |
클래스, 멤버 접근 지정 및 static과 non-static, final 메소드 (0) | 2021.07.17 |
this reference (0) | 2021.07.17 |
Comments