2014년 12월 21일 일요일

명품 자바(java) 5장 실습문제6 (그래픽 편집기 콘솔) - 상속, 추상클래스

------------------------------------------------------------
abstract class DObject {//추상클래스 DObject
 abstract public void draw();
}
------------------------------------------------------------
public class Line extends DObject {//추상클래스 DObject의 서브클래스 Line
 public void draw(){
  System.out.println("Line");//서브클래스 Line에서 오버라이딩 된 메소드 draw
 }
}
------------------------------------------------------------
public class Rect extends DObject {//추상클래스 DObject의 서브클래스 Rect
 public void draw(){
  System.out.println("Rect");//서브클래스 Rect에서 오버라이딩 된 메소드 draw
 }
}
------------------------------------------------------------
public class Circle extends DObject {//추상클래스 DObject의 서브클래스 Circle
 public void draw(){
  System.out.println("Circle");//서브클래스 Circle에서 오버라이딩 된 메소드 draw
 }
}
------------------------------------------------------------
import java.util.Scanner;
public class Editor {
 public void editor()
 {
  final int MAX = 100;//도형을 담을 수 있는 최대 크기
  DObject store[] = new DObject[MAX];//추상클래스의 객체배열 레퍼런스 변수 선언, 도형을 저장하는 곳
 
  int last=0;//마지막에 선언한 도형이 있는 위치이자, 도형의 갯수
  int loop=1;//삽입, 삭제, 모두 보기, 종료를 실행하는 메뉴를 순환시키는 변수
  int number, number2;//입력받은 값을 저장하는 변수
 
  while(loop != 4){
   System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
   Scanner input1 = new Scanner(System.in);
   loop = input1.nextInt();
  
   switch(loop){
   case 1://삽입
    System.out.print("도형 종류 Line(1), Rect(2), Circle(3)>>");
    Scanner first = new Scanner(System.in);
    number = first.nextInt();
   
    if(number == 1){
        store[last] = new Line();//Line 도형을 넣는다.
        last++;
    }
    else if(number == 2){
     store[last] = new Rect();//Rect 도형을 넣는다.
     last++;
    }
    else if(number == 3){
     store[last] = new Circle();//Circle 도형을 넣는다.
     last++;
    }
    else{
     System.out.print("1 ~ 3 중에서 선택하시오.");
    } 
    break;
   
   case 2://삭제
    if(last != 0){//도형의 수가 0이 아니면
     System.out.print("삭제할 도형의 위치(ex - 첫 번째 도형은 1 두 번째 도형은 2)>>");
     Scanner second = new Scanner(System.in);
     number2 = second.nextInt();
     if(number2 <= last){//입력받은 삭제할 도형의 위치가 도형의 수보다 낮으면
      for(int i=number2-1; i<last; i++){
       store[i] = store[i+1];
      }
      last--;
     }
     else{//입력받은 삭제할 도형의 위치가 도형의 수보다 높으면
      System.out.println("삭제할 도형의 위치를 잘못 선택하셨습니다.");
     }
    }
    else{//도형의 수가 0이면
     System.out.println("삭제할 도형이 없습니다.");
    }
    break;
   
   case 3://모두 보기
    if(last != 0){//도형의 수가 0이 아니면
     for(int i=0; i<last; i++){//저장한 각 도형의 draw함수를 실행시켜 모두 출력
      store[i].draw();
     }
    }
    else{//도형의 수가 0이면
     System.out.println("출력할 도형이 없습니다.");
    }
    break;
   
   case 4://끝내기(while문의 반복 조건이 변수 loop가 4가 아닐 때이므로 종료)
    System.out.println("프로그램을 종료합니다.");
    break;
   
      default://오류처리
       System.out.println("1 ~ 4 중에서 선택하시오.");
       continue;//다시 while문 처음으로
   }
  }
 }
}
------------------------------------------------------------
public class Main {
 public static void main(String [] args){
  Editor edit = new Editor();//Editor클래스의 객체 edit를 생성
  edit.editor();//edit의 메소드 editor를 호출
 }
}
------------------------------------------------------------
아래는 이클립스에서의 실행결과입니다.

댓글 없음:

댓글 쓰기