728x90
<6. 간단한 그래픽 편집기>
중간에서 값을 삭제하고 뒤에 있는 값들을 땡겨주고 싶어서 배열로 해도 될껄 굳이굳이 연결리스트로 만들어봤습니다.
하나하나 구현했더니 엄청 복잡해 보이네요. 괜히 어렵게 만든 것 같다는 생각도 듭니다.
자바에서 연결리스트를 구현해보는 건 처음인 것 같네요.
import java.util.InputMismatchException;
import java.util.Scanner;
abstract class Shape {
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");
}
}
일단 기본적인 부분입니다. 5.6절 메소드 오버라이딩 코드를 그대로 가져왔습니다.
추상메소드로도 만들어줬고요.
다음은 연결리스트 구현을 위해 필요한 Node클래스와 GraphicEdit클래스입니다.
GraphicEdit클래스의 메소드는 다음과 같습니다.
public GraphicEdit() | 생성자에서는 head와 tail을 null로, 배열의 길이를 0을 초기화해준다. |
public void insert() | 도형종류를 입력받아 해당 도형을 그래픽 리스트 마지막에 추가해준다. |
public void delete() | 삭제할 도형의 위치를 입력받아(1,2,3, …) 그곳의 데이터를 삭제해준다. |
public void show() | 리스트에 있는 모든 도형을 출력해준다. 도형의 draw메소드를 이용한다. |
코드
class Node {
public Shape data;
public Node link;
}
class GraphicEdit {
private Node head;
private Node tail;
private int length;
public GraphicEdit() {
head = tail = null;
length = 0;
}
public void insert() {
Scanner scanner = new Scanner(System.in);
Shape sh;
int choice;
while (true) {
try {
System.out.print("도형 종료 Line(1), Rect(2), Circle(3) >> ");
choice = scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("숫자가 아닙니다.");
scanner.next();
continue;
}
switch (choice) {
case 1:
sh = new Line();
break;
case 2:
sh = new Rect();
break;
case 3:
sh = new Circle();
break;
default:
System.out.println("다시 입력하세요");
continue;
}
break;
}
Node newnode = new Node();
newnode.data = sh;
newnode.link = null;
if (head == null) {
head = newnode;
tail = newnode;
} else {
tail.link = newnode;
tail = newnode;
}
length++;
}
public void delete() {
Scanner scanner = new Scanner(System.in);
int idx;
while (true) {
try {
System.out.print("삭제할 도형의 위치 >>");
idx = scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("숫자가 아닙니다. 다시 입력하세요.");
scanner.next();
continue;
}
}
if (idx > length) {
System.out.println("삭제할 수 없습니다.");
return;
}
Node prev = head;
Node current = head;
for (int i = 1; i < idx; i++) {
prev = current;
current = current.link;
}
if (current == head)
head = head.link;
else
prev.link = current.link;
length--;
}
public void show() {
Node temp = head;
while (temp != null) {
temp.data.draw();
temp = temp.link;
}
}
}
public클래스의 메소드는 inputchoice()와 main이 있습니다.
inputchoice는 삽입, 삭제, 모두보기, 종료에 해당하는 int값을 입력받아 그 값을 반환합니다.
main에 만들어줘도 됐지만 try catch가 포함되면 지저분해보일 것 같아서 따로 static함수로 빼줬습니다.
public class App {
static int inputchoice() {
Scanner scanner = new Scanner(System.in);
int choice;
while (true) {
try {
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
choice = scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다.");
scanner.next();
continue;
}
}
return choice;
}
public static void main(String args[]) {
GraphicEdit ge = new GraphicEdit();
boolean go = true;
while (go) {
int choice = inputchoice();
switch (choice) {
case 1:
ge.insert();
break;
case 2:
ge.delete();
break;
case 3:
ge.show();
break;
case 4:
go = false;
break;
default:
System.out.println("잘못된 입력입니다.");
}
}
System.out.println("프로그램을 종료합니다...");
}
}
main에서는 go변수로 프로그램 반복을 결정합니다.
만약 choice에 4가 입력된다면 go는 false가 되어 프로그램이 종료됩니다.
case를 나눠 각각에 해당하는 동작을 수행해줍니다.
<Bonus 1 Circle클래스>
interface Shape {
final double PI = 3.14;
void draw();
double getArea();
default public void redraw() {
System.out.println("--- 다시 그립니다. ---");
draw();
}
}
class Circle implements Shape {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.print("반지름 " + radius + " ");
}
@Override
public double getArea() {
return radius*radius*PI;
}
}
public class ShapeApp {
public static void main(String args[]) {
Shape coin = new Circle(10);
coin.redraw();
System.out.println("코인의 면적은 " + coin.getArea());
}
}
그냥 오버라이딩만 잘해주면 되네요.
728x90
'프로그래밍 언어 > javastudy' 카테고리의 다른 글
명품 Java Essential 6단원 실습문제 1~6 (0) | 2021.07.15 |
---|---|
명품 자바 에센셜 6단원/ 영문자 알파벳 히스토그램 (0) | 2021.07.14 |
명품 Java Essential 5단원 실습문제 #1 (0) | 2021.07.14 |
명품 자바 에센셜 5단원/ Bear와 Fish 먹기 게임 (0) | 2021.07.13 |
명품 Java Essential 4단원 실습문제 #2 (0) | 2021.07.12 |