[명품 Java] 5장 실습문제 (상속)
2021. 12. 1. 15:38ㆍSolution`/Java
[1~2] 다음 TV 클래스가 있다.
class TV{
private int size;
public TV(int size) { this.size = size; }
protected int getSize() { return size; }
}
[5장 1번]
다음 main() 메소드와 실행 결과를 참고하여 TV를 상속받은 ColorTV 클래스를 작성하라.
public static void main(String[] args) {
ColorTV myTV = new ColorTV(32, 1024);
myTV.printProperty();
}
32인치 1024컬러
≫ 풀이
class ColorTV extends TV {
private int color;
public ColorTV(int size, int color){
super(size);
this.color = color;
}
protected int getColor(){return color;}
public void printProperty(){
System.out.println(getSize() + "인치 " + color + "컬러");
}
}
[5장 2번]
다음 main() 메소드와 실행 결과를 참고하여 ColorTV를 상속받는 IPTV 클래스를 작성하라.
public static void main(String[] args) {
IPTV iptv = new IPTV("192.1.1.2", 32, 2048); //"192.1.1.2" 주소에 32인치, 2048컬러
iptv.printProperty();
}
나의 IPTV는 192.1.1.2 주소의 32인치 2048컬러
≫ 풀이
class IPTV extends ColorTV{
private String ip;
public IPTV(String ip, int size, int color){
super(size, color);
this.ip = ip;
}
protected String getIP(){return ip;};
@Override
public void printProperty(){
System.out.println("나의 IPTV는 " + ip + " 주소의 " + getSize() + "인치 " + getColor() + "컬러");
}
}
[3~4] 다음은 단위를 변환하는 추상 클래스 Converter이다.
import java.util.Scanner;
abstract class Converter {
abstract protected double convert(double src); // 추상 메소드
abstract protected String getSrcString(); // 추상 메소드
abstract protected String getDestString(); // 추상 메소드
protected double ratio; // 비율
public void run() {
Scanner scanner = new Scanner(System.in);
System.out.println(getSrcString()+"을 "+getDestString()+"로 바꿉니다.");
System.out.print(getSrcString()+"을 입력하세요>> ");
double val = scanner.nextDouble();
double res = convert(val);
System.out.println("변환 결과: "+res+getDestString()+"입니다");
scanner.close();
}
}
[5장 3번]
Converter 클래스를 상속받아 원화를 달러로 변환하는 Won2Dollar 클래스를 작성하라. main() 메소드와 실행 결과는 다음과 같다.
public static void main(String args[]) {
Won2Dollar toDollar = new Won2Dollar(1200); // 1달러는 1200원
toDollar.run();
}
원을 달러로 바꿉니다.
원을 입력하세요>> 24000
변환 결과: 20.0달러입니다
≫ 풀이
class Won2Dollar extends Converter{
private double val;
public Won2Dollar(double val){
this.val = val;
}
@Override
protected double convert(double src) {
return src/1200;
}
@Override
protected String getSrcString() {
return "원";
}
@Override
protected String getDestString() {
return "달러";
}
}
[5장 4번]
Converter 클래스를 상속받아 Km를 mile(마일)로 변환하는 Km2Mile 클래스를 작성하라, main() 메소드와 실행 결과는 다음과 같다.
public static void main(String args[]) {
Km2Mile toMile = new Km2Mile(1.6); // 1마일은 1.6km
toMile.run();
}
Km을 mile로 바꿉니다.
Km을 입력하세요>> 30
변환 결과: 18.75mile입니다
≫ 풀이
class Km2Mile extends Converter{
private double val;
public Km2Mile(double val){
this.val = val;
}
@Override
protected double convert(double src) {
return src/1.6;
}
@Override
protected String getSrcString() {
return "Km";
}
@Override
protected String getDestString() {
return "mile";
}
}
[5~8] 다음은 2차원 상의 한 점을 표현하는 Point 클래스이다.
class Point {
private int x, y;
public Point(int x, int y) { this.x = x; this.y = y; }
public int getX() { return x; }
public int getY() { return y; }
protected void move(int x, int y) { this.x =x; this.y = y; }
}
[5장 5번]
Point를 상속받아 색을 가진 점을 나타내는 ColorPoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.
public static void main(String[] args) {
ColorPoint cp = new ColorPoint(5, 5, "YELLOW");
cp.setXY(10, 20);
cp.setColor("RED");
String str = cp.toString();
System.out.println(str+"입니다. ");
}
RED색의 (10,20)의 점입니다.
≫ 풀이
class ColorPoint extends Point{
private String color;
public ColorPoint(int x, int y, String color){
super(x, y);
this.color = color;
}
public void setXY(int x, int y){
move(x, y);
}
public void setColor(String color){
this.color = color;
}
public String toString(){
String str = color+"색의"+" ("+getX()+","+getY()+")의 점";
return str;
}
}
[5장 6번]
Point를 상속받아 색을 가진 점을 나타내는 ColorPoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.
public static void main(String[] args) {
ColorPoint zeroPoint = new ColorPoint(); // (0,0) 위치의 BLACK 색 점
System.out.println(zeroPoint.toString() + "입니다.");
ColorPoint cp = new ColorPoint(10, 10); // (10,10) 위치의 BLACK 색 점
cp.setXY(5,5);
cp.setColor("RED");
System.out.println(cp.toString()+"입니다.");
}
BLACK색의 (0,0) 점입니다.
RED색의 (5,5) 점입니다.
≫ 풀이
class ColorPoint extends Point{
private String color;
public ColorPoint(){
super(0,0);
this.color = "BLACK";
}
public ColorPoint(int x, int y){
super(x, y);
this.color = "BLACK";
}
public void setXY(int x, int y){
move(x, y);
}
public void setColor(String color){
this.color = color;
}
public String toString(){
String str = color+"색의 ("+getX()+","+getY()+") 점";
return str;
}
}
[5장 7번]
Point를 상속받아 3차원의 점을 나타내는 Point3D 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.
public static void main(String[] args) {
Point3D p = new Point3D(1,2,3); // 1,2,3은 각각 x, y, z축의 값.
System.out.println(p.toString()+"입니다.");
p.moveUp(); // z 축으로 위쪽 이동
System.out.println(p.toString()+"입니다.");
p.moveDown(); // z 축으로 아래쪽 이동
p.move(10, 10); // x, y 축으로 이동
System.out.println(p.toString()+"입니다.");
p.move(100, 200, 300); // x, y, z축으로 이동
System.out.println(p.toString()+"입니다.");
}
(1,2,3) 의 점입니다.
(1,2,4) 의 점입니다.
(10,10,3) 의 점입니다.
(100,200,300) 의 점입니다.
≫ 풀이
class Point3D extends Point{
private int z;
public Point3D(int x, int y, int z){
super(x, y);
this.z = z;
}
public void moveUp(){
z++;
}
public void moveDown(){
z--;
}
public void move(int x, int y, int z){
move(x, y);
this.z = z;
}
public String toString(){
String str = "("+getX()+","+getY()+","+z+") 의 점";
return str;
}
}
[5장 8번]
Point를 상속받아 양수의 공간에서만 점을 나타내는 PositivePoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.
public static void main(String[] args) {
PositivePoint p = new PositivePoint();
p.move(10, 10);
System.out.println(p.toString()+"입니다.");
p.move(-5,5); // 객체 p는 음수 공간으로 이동되지 않음
System.out.println(p.toString()+"입니다.");
PositivePoint p2 = new PositivePoint(-10, -10);
System.out.println(p2.toString()+"입니다.");
}
(10,10)의 점입니다.
(10,10)의 점입니다.
(0,0)의 점입니다.
≫ 풀이
class PositivePoint extends Point{
public PositivePoint(){
super(0,0);
}
public PositivePoint(int x, int y){
super(x, y);
if(x<0 || y<0)
super.move(0,0);
}
public void move(int x, int y){
if(x>0 && y>0)
super.move(x, y);
}
public String toString(){
String str = "("+getX()+","+getY()+")의 점";
return str;
}
}
[5장 9번]
다음 Stack 인터페이스를 상속받아 실수를 저장하는 StringStack 클래스를 구현하라.
interface Stack {
int length(); // 현재 스택에 저장된 개수 리턴
int capacity(); // 스택의 전체 저장 가능한 개수 리턴
String pop(); // 스택의 톱(top)에 저장된 실수 리턴
void push(String val); // 스택의 톱(top)에 실수 저장
}
그리고 다음 실행 사례와 같이 작동하도록 StackApp 클래스에 main() 메소드를 작성하라.
총 스택 저장 공간의 크기 입력 >> 3
문자열 입력 >> hello
문자열 입력 >> sunny
문자열 입력 >> smile
문자열 입력 >> happy
스택이 꽉 차서 푸시 불가!
문자열 입력 >> 그만
스택에 저장된 모든 문자열 팝 : smile sunny hello
≫ 풀이
package Java5_9;
import java.util.Scanner;
interface Stack {
int length(); // 현재 스택에 저장된 개수 리턴
int capacity(); // 스택의 전체 저장 가능한 개수 리턴
String pop(); // 스택의 톱(top)에 저장된 실수 리턴
void push(String val); // 스택의 톱(top)에 실수 저장
}
class StringStack implements Stack{
private int top;
private int stackSize;
private String[] stack;
public StringStack(int num){
top = -1; // 스택 초기화
this.stackSize = num;
stack = new String[this.stackSize];
}
public boolean is_full(){
return top == this.stackSize-1;
}
public boolean is_empty(){
return top == -1;
}
@Override
public int length() {
return top+1;
}
@Override
public int capacity() {
return stack.length;
}
@Override
public String pop() {
String s = null;
if(is_empty()){
System.out.println("스택에 아무것도 없습니다!!");
}
else{
s = stack[top--];
}
return s;
}
@Override
public void push(String val) {
if(is_full()){
System.out.println("스택이 꽉 차서 푸시 불가!!");
}
else
stack[++top] = val;
}
}
public class StackApp {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("총 스택 저장 공간의 크기 입력 >> ");
int num = sc.nextInt();
StringStack stack = new StringStack(num);
while(true){
System.out.print("문자열 입력 >> ");
String str = sc.next();
if(str.equals("그만"))
break;
stack.push(str);
}
System.out.print("스택에 저장된 모든 문자열 팝 : ");
int len = stack.length();
for(int i=0; i<len; i++){
String s = stack.pop();
System.out.print(s + " ");
}
}
}
----------------------------------
총 스택 저장 공간의 크기 입력 >> 3
문자열 입력 >> hello
문자열 입력 >> sunny
문자열 입력 >> smile
문자열 입력 >> happy
스택이 꽉 차서 푸시 불가!!
문자열 입력 >> 그만
스택에 저장된 모든 문자열 팝 : smile sunny hello
[5장 10번]
다음은 키와 값을 하나의 아이템으로 저장하고 검색 수정이 가능한 추상 클래스가 있다.
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(); // 현재 저장된 아이템의 개수 리턴
}
PairMap을 상속받는 Dictionary 클래스를 구현하고, 이를 다음과 같이 활용하는 main() 메소드를 가진 클래스 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("황기태")); //삭제된 아이템 접근
}
이재문의 값은 C++
황기태의 값은 자바
황기태의 값은 null
≫ 풀이
package Java5_10;
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 item; // 저장된 아이템의 개수
public Dictionary(int num){
KeyArray = new String[num];
valueArray = new String[num];
this.item = 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])){
KeyArray[i] = key;
valueArray[i] = value;
}
}
KeyArray[item] = key;
valueArray[item] = value;
item++;
}
@Override
String delete(String key) {
for(int i=0; i< KeyArray.length; i++){
if(key.equals(KeyArray[i])){
String s = valueArray[i];
KeyArray[i] = null;
valueArray[i] = null;
return s;
}
}
return null;
}
@Override
int length() {
return item;
}
}
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("황기태")); //삭제된 아이템 접근
}
}
----------------------------------
이재문의 값은 C++
황기태의 값은 자바
황기태의 값은 null
[5장 11번]
철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다(4장 실습문제 11 참고).
- int 타입의 a, b 필드: 2개의 피연산자
- void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
- int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
곰곰 생각해보니, Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고 Calc를 상속받아 만들면 되겠다고 생각했다. 그리고 main() 메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue() 와 calculate()를 호출하여 그 결과 값을 화면에 출력하면 된다고 생각하였다. 철수처럼 프로그램을 작성하라.
두 정수와 연산자를 입력하시오 >> 5 7 +
12
≫ 풀이
package Java5_11;
import java.util.Scanner;
abstract class Calc{
protected int a, b;
void setValue(int a, int b){
this.a = a;
this.b = b;
}
abstract double calculate();
}
class Add extends Calc{
@Override
double calculate() {
return (int)a+b;
}
}
class Sub extends Calc{
@Override
double calculate() {
return (int)a-b;
}
}
class Mul extends Calc{
@Override
double calculate() {
return (int)a*b;
}
}
class Div extends Calc{
@Override
double calculate() {
return (double)a/b;
}
}
public class Java5_11 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double result;
while(true){
System.out.print("두 정수와 연산자를 입력하세요 >> ");
int a = sc.nextInt();
int b = sc.nextInt();
String c = sc.next();
Calc cal;
if(a==0 && b==0 && c.equals("exit")){
System.out.println("프로그램을 종료합니다...");
System.exit(0);
}
switch (c){
case "+":
cal = new Add();
cal.setValue(a, b);
result = cal.calculate();
System.out.println("결과 : " + (int)result);
break;
case "-":
cal = new Sub();
cal.setValue(a, b);
result = cal.calculate();
System.out.println("결과 : " + (int)result);
break;
case "*":
cal = new Mul();
cal.setValue(a, b);
result = cal.calculate();
System.out.println("결과 : " + (int)result);
break;
case "/":
cal = new Div();
cal.setValue(a, b);
if(b==0){
System.out.println("0으로 나눌 수 없습니다!!");
break;
}
else{
result = cal.calculate();
System.out.println("결과 : " + result);
break;
}
}
}
}
}
----------------------------------------
두 정수와 연산자를 입력하세요 >> 10 8 +
결과 : 18
두 정수와 연산자를 입력하세요 >> 10 8 -
결과 : 2
두 정수와 연산자를 입력하세요 >> 10 8 *
결과 : 80
두 정수와 연산자를 입력하세요 >> 10 0 /
0으로 나눌 수 없습니다!!
두 정수와 연산자를 입력하세요 >> 10 3 /
결과 : 3.3333333333333335
두 정수와 연산자를 입력하세요 >> 0 0 exit
프로그램을 종료합니다...
Process finished with exit code 0
[5장 12번]
텍스트로 입출력하는 간단한 그래픽 편집기를 만들어보자. 본문 5.6절과 5.7절에서 사례로 든 추상 클래스 Shape과 Line, Rect, Circle 클래스 코드를 잘 완성하고 이를 활용하여 아래 시행 예시처럼 "삽입", "삭제", "모두 보기", "종료" 의 4가지 그래픽 편집 기능을 가진 클래스 GraphicEditor을 작성하라.
그래픽 에디터 beauty를 실행합니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 2
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 3
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 3
Rect
Circle
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 2
삭제할 도형의 위치 >> 3
삭제할 수 없습니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 4
beauty을 종료합니다.
[Hint] Shape을 추상 클래스로 작성한 사례는 다음과 같다.
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();
}
≫ 풀이
package Java5_12;
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{
private Shape head, tail;
private Scanner sc;
public GraphicEditor() {
head = null; // 시작 노드
tail = null; // 끝 노드
sc = new Scanner(System.in);
}
public void run() {
System.out.println("그래픽 에디터 beauty를 실행합니다.");
while(true) {
System.out.print("삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> ");
int num = sc.nextInt();
switch(num) {
case 1:
System.out.print("Line(1), Rect(2), Circle(3) >> ");
num = sc. nextInt();
insert(num);
break;
case 2:
System.out.print("삭제할 도형의 위치 >> ");
num = sc.nextInt();
delete(num);
break;
case 3:
print();
break;
case 4:
System.out.println("beauty을 종료합니다.");
sc.close();
return;
}
}
}
public void insert(int draw) {
Shape graphic;
switch(draw) {
case 1:
graphic = new Line();
break;
case 2:
graphic = new Rect();
break;
case 3:
graphic = new Circle();
break;
default:
System.out.println("다시 입력해 주세요.");
return;
}
if(head == null) {
head = graphic;
tail = graphic;
}
else {
tail.setNext(graphic);
tail = graphic;
}
}
public void print() {
Shape s = head;
while(s != null) {
s.draw();
s = s.getNext();
}
}
public void delete(int num) {
Shape cur = head;
Shape tmp = head;
int i;
if( num == 1) {
if(head == tail) {
head = null;
tail = null;
return;
}
else {
head = head.getNext();
return;
}
}
for(i=1; i<num; i++) {
tmp = cur;
cur = cur.getNext();
if(cur == null) {
System.out.println("삭제할 수 없습니다.");
return;
}
}
if(i==num) {
tmp.setNext(cur.getNext());
tail = tmp;
}
else
tmp.setNext(cur.getNext());
}
public static void main(String[] args) {
GraphicEditor editor = new GraphicEditor();
editor.run();
}
}
--------------------------------------------
그래픽 에디터 beauty를 실행합니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 1
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 2
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 1
Line(1), Rect(2), Circle(3) >> 3
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 3
Line
Rect
Circle
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 2
삭제할 도형의 위치 >> 3
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 2
삭제할 도형의 위치 >> 3
삭제할 수 없습니다.
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 3
Line
Rect
삽입(1), 삭제(2), 모두 보기(3), 종료(4) >> 4
beauty을 종료합니다.
[5장 13번]
다음은 도형의 구성을 묘사하는 인터페이스이다.
interface Shape {
final double PI = 3.14; // 상수
void draw(); // 도형을 그리는 추상 메소드
double getArea(); // 도형의 면적을 리턴하는 추상 메소드
default public void redraw() { // 디폴트 메소드
System.out.print("--- 다시 그립니다.");
draw();
}
}
다음 main() 메소드와 실행 결과를 참고하여, 인터페이스 Shape을 구현한 클래스 Circle를 작성하고 전체 프로그램을 완성하라.
public static void main(String[] args) {
Shape donut = new Circle(10); // 반지름이 10인 원 객체
donut.redraw();
System.out.println("면적은 "+ donut.getArea());
}
≫ 풀이
package Java5_13;
interface Shape {
final double PI = 3.14; // 상수
void draw(); // 도형을 그리는 추상 메소드
double getArea(); // 도형의 면적을 리턴하는 추상 메소드
default public void redraw() { // 디폴트 메소드
System.out.print("--- 다시 그립니다.");
draw();
}
}
class Circle implements Shape {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
public void draw() {
System.out.println("반지름이 "+radius+"인 원입니다.");
}
public double getArea() {
return PI*radius*radius;
}
}
public class Java5_13 {
public static void main(String[] args) {
Shape donut = new Circle(10); // 반지름이 10인 원 객체
donut.redraw();
System.out.println("면적은 "+ donut.getArea());
}
}
----------------------------------
--- 다시 그립니다.반지름이 10인 원입니다.
면적은 314.0
[5장 14번]
다음 main() 메소드와 실행 결과를 참고하여, 문제 13의 Shape 인터페이스를 구현한 클래스 Oval, Rect를 추가 작성하고 전체 프로그램을 완성하라.
public static void main(String[] args) {
Shape[] list = new Shape[3]; // Shape을 상속받은 클래스 객체의 레퍼런스 배열
list[0] = new Circle(10); // 반지름이 10인 원 객체
list[1] = new Oval(20, 30); // 20x30 사각형에 내접하는 타원
list[2] = new Rect(10, 40); // 10x40 크기의 사각형
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());
}
--- 다시 그립니다.반지름이 10인 원입니다.
--- 다시 그립니다.20x30에 내접하는 타원입니다.
--- 다시 그립니다.10x40크기의 사각형 입니다.
면적은 314.0
면적은 1884.0000000000002
면적은 400.0
≫ 풀이
package Java5_14;
interface Shape {
final double PI = 3.14; // 상수
void draw(); // 도형을 그리는 추상 메소드
double getArea(); // 도형의 면적을 리턴하는 추상 메소드
default public void redraw() { // 디폴트 메소드
System.out.print("--- 다시 그립니다.");
draw();
}
}
class Circle implements Shape {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
public void draw() {
System.out.println("반지름이 "+radius+"인 원입니다.");
}
public double getArea() {
return PI*radius*radius;
}
}
class Oval implements Shape {
private int a, b;
public Oval(int a, int b) {
this.a = a;
this.b = b;
}
public void draw() {
System.out.println(a+"x"+b+"에 내접하는 타원입니다.");
}
public double getArea() {
return PI*a*b;
}
}
class Rect implements Shape {
private int a, b;
public Rect(int a, int b) {
this.a = a;
this.b = b;
}
public void draw() {
System.out.println(a+"x"+b+"크기의 사각형 입니다.");
}
public double getArea() {
return a*b;
}
}
public class Java5_14 {
public static void main(String[] args) {
Shape[] list = new Shape[3]; // Shape을 상속받은 클래스 객체의 레퍼런스 배열
list[0] = new Circle(10); // 반지름이 10인 원 객체
list[1] = new Oval(20, 30); // 20x30 사각형에 내접하는 타원
list[2] = new Rect(10, 40); // 10x40 크기의 사각형
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());
}
}
--------------------------------------
--- 다시 그립니다.반지름이 10인 원입니다.
--- 다시 그립니다.20x30에 내접하는 타원입니다.
--- 다시 그립니다.10x40크기의 사각형 입니다.
면적은 314.0
면적은 1884.0000000000002
면적은 400.0