반응형
9. 다음 Stack 인터페이스를 상속받아 실수를 저장하는 StringStack 클래스를 구현하라. |
package chapter5;
import java.util.Scanner;
interface Stack {
int length(); // 현재 스택에 저장된 개수 리턴
int capacity(); //스택의 전체 저장 가능한 개수 리턴
String pop(); //스택의 톱(top)에 실수 저장
boolean push(String val); //스택의 톱(top)에 저장된 실수 리턴
}
class StringStack implements Stack {
private String[] word;
private int top;
public StringStack(int size) {
word = new String[size];
top = -1; //-1로 초기화
}
@Override
public int length() {
return top + 1;
}
@Override
public int capacity() {
return word.length;
}
@Override
public String pop() {
if (top == -1)
return null;
String s = word[top];
top--;
return s;
}
@Override
public boolean push(String val) {
if(top == word.length-1)
return false;
else {
top++;
word[top] = val;
return true;
}
}
}
public class StackApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("총 스택 저장 공간의 크기 입력 >> ");
int n = scanner.nextInt();
StringStack ss = new StringStack(n);
while (true) {
System.out.print("문자열 입력 >> ");
String str = scanner.next();
if(str.equals("그만"))
break;
boolean res = ss.push(str);
if(res == false) {
System.out.println("스택이 꽉 차서 푸시 불가!");
}
}
System.out.print("스택에 저장된 모든 문자열 팝: ");
int len = ss.length();
for(int i = 0; i < len; i++) {
System.out.print(ss.pop() + " ");
}
scanner.close();
}
}
10. PairMap을 상속받는 Dictionary 클래스를 구현하고, 이를 다음과 같이 활용하는 main() 메소드를 가진 클래스 DictionaryApp도 작성하라. |
package chapter5;
abstract class PairMap{
protected String keyArray[]; //key들을 저장하는 배열
protected String valueArray[]; //value들을 저장하는 배열
abstract String get(String key); //key 값을 가진 value 리턴, 없으면 null 리턴
abstract void put(String key, String value); //key와 value를 쌍으로 저장,
//기존에 key가 있으면 값을 value로 수정
abstract String delete(String key); //key 값을 가진 아이템(value와 함께) 삭제. 삭제된 value 리턴
abstract int length(); //현재 저장된 아이탬 개수 리턴
}
class Dictionary extends PairMap{
private int top;
public Dictionary(int size) {
keyArray = new String[size];
valueArray = new String[size];
top = 0;
}
@Override
String get(String key) {
for(int i = 0; i < keyArray.length; i++) {
if (key.equals(keyArray[i])) {
return valueArray[i];
}
}
return null;
}
@Override
void put(String key, String value) {
for(int i = 0; i < keyArray.length; i++) {
if(key.equals(keyArray[i])) {
valueArray[i] = value;
break;
}
}
keyArray[top] = key;
valueArray[top] = value;
top++;
}
@Override
String delete(String key) {
String s = null;
for(int i = 0; i < keyArray.length; i++) {
if(key.equals(keyArray[i])) {
s = valueArray[i];
keyArray[i] = null;
valueArray[i] = null;
}
}
return s;
}
@Override
int length() {
return top;
}
}
public class DictionaryApp {
public static void main(String[] args) {
Dictionary dic = new Dictionary(10);
dic.put("황기태", "자바");
dic.put("이재문", "파이썬");
dic.put("이재문", "C++"); //이재문의 값을 C++로 수정
System.out.println("이재문의 값은 " + dic.get("이재문"));
System.out.println("황기태의 값은 " + dic.get("황기태"));
dic.delete("황기태");
System.out.println("황기태의 값은 " + dic.get("황기태")); //삭제된 아이템 접근
}
}
11. 철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다. 곰곰 생각해보니, 네 개의 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고 Calc를 상속받아 만들면 되겠다고 생각했다. 그리고 main()메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue()와 calculate()를 호출하여 그 결과 값을 화면에 출력하면 된다고 생각하였다. 철수처럼 프로그램을 작성하라. |
package chapter5;
import java.util.Scanner;
abstract class Calc {
protected int a, b;
public void setValue(int a, int b) {
this.a = a; this.b = b;
}
abstract int calculate();
}
class Add extends Calc {
@Override
public int calculate() {return a+b;}
}
class Sub extends Calc {
@Override
public int calculate() {return a-b;}
}
class Mul extends Calc {
@Override
public int calculate() {return a*b;}
}
class Div extends Calc {
@Override
public int calculate() {return a/b;}
}
public class Calculation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("두 정수와 연산자를 입력하시오>> ");
int a = scanner.nextInt();
int b = scanner.nextInt();
char op = scanner.next().charAt(0);
Calc cal;
switch (op) {
case '+': cal = new Add(); break;
case '-': cal = new Sub(); break;
case '*': cal = new Mul(); break;
case '/': cal = new Div(); break;
default:
System.out.println("잘못된 연산자입니다.");
scanner.close();
return;
}
cal.setValue(a, b);
System.out.println(cal.calculate());
scanner.close();
}
}
12번은 어떻게 해야할지 도저히 감이 안와서
security-nanglam.tistory.com/218
를 참고했다. 감사합니다...
12.텍스트로 입출력하는 간단한 그래픽 편집기를 만들어보자. 본문 5.6절과 5.7절에서 사례로 든 추상 클래스 Shape과 Line, Rect, Circle 클래스 코드를 잘 완성하고 이를 활용하여 아래 시행 예시처럼 "삽입","삭제", "모두 보기", "종료"의 4가지 그래픽 편집 기능을 가진 클래스 GraphicEditor을 작성하라. |
package chapter5;
import java.util.Scanner;
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 {
String name ="line";
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
String name ="Rect";
public void draw() {
System.out.println("Rect");
}
}
class Circle extends Shape {
String name ="circle";
public void draw() {
System.out.println("Circle");
}
}
public class GraphicEditor {
Scanner scanner = new Scanner(System.in);
Shape start = null, last = null;
public void run() {
System.out.println("그래픽 에디터 beauty를 실행합니다.");
while(true) {
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4)>>");
int n = scanner.nextInt();
switch(n) {
case 1:
System.out.print("Line(1), Rect(2), circle(3)>>");
int shape = scanner.nextInt();
insert(shape); break;
case 2:
System.out.print("삭제할 도형의 위치>>");
int target = scanner.nextInt();
delete(target); break;
case 3:
print(); break;
case 4:
System.out.println("beauty을 종료합니다.");
scanner.close();
return;
}
}
}
public void insert(int shape) {
Shape s;
switch(shape) {
case 1:
s = new Line(); break;
case 2:
s = new Rect(); break;
case 3:
s = new Circle(); break;
default:
System.out.println("잘못된 입력입니다."); return;
}
if (start == null) { //시작할 때는
start = s; //start가 새 노드를 가리킴
last = start;
}
else {
last.setNext(s); //노드 연걸
last = s; //새 노드 가리킴
}
}
public void delete(int target) {
Shape current = start;
Shape temp = start;
int i;
if(target == 1) { // 첫번째 노드를 삭제하는 경우
if(start == last) { // 노드가 한개 일경우
start = null;
last = null;
return;
}
else { // 노드가 두개 이상
start = start.getNext();
return;
}
}
for(i = 1; i < target; i++) {
temp = current; // 현재 노드를 저장 후 (즉, 이전 노드)
current = current.getNext(); // 다음 노드로 이동
if(current == null) { // 노드 수가 입력 값보다 적을때
System.out.println("삭제할 수 없습니다.");
return;
}
}
if(i == target) { // 끝 노드를 가리킬때
temp.setNext(current.getNext());
last = temp;
}
else // 끝노드가 아니라면 이전노드가 다음 노드를 가리킴 (즉, 현재 노드 삭제)
temp.setNext(current.getNext());
}
public void print() {
Shape p = start;
while(p != null) {
p.draw();
p = p.getNext();
}
}
public static void main(String[] args) {
GraphicEditor e = new GraphicEditor();
e.run();
}
}
13. 다음은 도형의 구성을 묘사하는 인터페이스이다. 다음 main() 메소드와 실행 결과를 참고하여, 인터페이스 Shape을 구현한 클래스 Circle를 작성하고 전체 프로그램을 완성하라. |
package chapter5;
interface Shape2{
final double PI = 3.14;
void draw();
double getArea();
default public void redraw() {
System.out.print("--- 다시 그립니다. ");
draw();
}
}
class Circle2 implements Shape2{
private int r;
public Circle2(int r) {
this.r = r;
}
@Override
public void draw() {
System.out.println("반지름이 " + this.r + "인 원입니다.");
}
@Override
public double getArea() {
return PI * r * r;
}
}
public class DrawCircle {
public static void main(String[] args) {
Shape2 donut = new Circle2(10);
donut.redraw();
System.out.println("면적은 " + donut.getArea());
}
}
14. 다음 main() 메소드와 실행 결과를 참고하여, 문제 13의 Shape 인터페이스를 ㄱ현한 클래스 Oval, Rect를 추가 작성하고 전체 프로그램을 완성하라. |
package chapter5;
interface Shape3{
final double PI = 3.14;
void draw();
double getArea();
default public void redraw() {
System.out.print("--- 다시 그립니다. ");
draw();
}
}
class Circle3 implements Shape3{
private int r;
public Circle3(int r) {
this.r = r;
}
@Override
public void draw() {
System.out.println("반지름이 " + this.r + "인 원입니다.");
}
@Override
public double getArea() {
return PI * r * r;
}
}
class Oval implements Shape3{
private int a, b;
public Oval(int a, int b) {
this.a = a; this.b = b;
}
public void draw() {
System.out.println(this.a + "x" + this.b + "에 내접하는 타원입니다.");
}
public double getArea() {
return PI * a * b;
}
}
class Rect2 implements Shape3{
private int a, b;
public Rect2(int a, int b) {
this.a = a; this.b = b;
}
public void draw() {
System.out.println(this.a + "x" + this.b + "크기의 사각형 입니다.");
}
public double getArea() {
return a * b;
}
}
public class DrawCircle2 {
public static void main(String[] args) {
Shape3[] list = new Shape3[3]; //shape을 상속받은 클래스 객체의 레퍼런스 배열
list[0] = new Circle3(10);
list[1] = new Oval(20, 30);
list[2] = new Rect2(10, 40);
for(int i = 0; i < list.length; i++) list[i].redraw();
for(int i = 0; i < list.length; i++) System.out.println("면적은 " + list[i].getArea());
}
}
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
<명품 JAVA Programming> - Chapter7 실습문제 (0) | 2020.11.20 |
---|---|
<명품 JAVA Programming> - Chapter6 실습문제 (0) | 2020.11.17 |
<명품 JAVA Programming> - Chapter5 연습문제(1, 2, 3, 4, 5, 6, 7, 8) (0) | 2020.10.27 |
<명품 JAVA Programming> - Chapter4 연습문제(1, 2, 3, 4, 5, 6) (0) | 2020.10.26 |
<명품 JAVA Programming> - Chapter3 연습문제(13, 14, 15, 16) (0) | 2020.10.25 |