본문 바로가기
Programming Study/명품자바프로그래밍

[명품자바프로그래밍] 5장 실습문제(1)

by 푸고배 2017. 8. 11.

1. 다음 그림과 같은 상속 구조를 갖는 클래스를 설계하라. 모든 프린터는 모델명, 제조사, 인터페이스 종류(USB 또는 병렬 인터페이스), 인쇄 매수, 인쇄 종이 잔량을 나타내는 정보를 가지며 print()라는 메소드를 갖는다. 잉크젯 프린터는 잉크 잔량이라는 추가 정보를 가지며 레이저 프린터는 토너 잔량이라는 추가 정보를 가진다. print() 메소드는 각 프린터 타입에 맞게 구현한다. 편의상 print() 메소드를 한 번 호출할 때마다 인쇄용지 1매를 사용하는 것으로 한다. 이러한 클래스를 설계하고 적절한 필드, 생성자, 메소드를 작성하고, 실행 프로그램을 작성하여 동작을 확인하라.

 

<소스코드> Chapter5_1.java

class Printer{
	private String model_name;
	private String manufacturer;
	private boolean interface_type; // true이면 USB false이면 병렬 인터페이스
	private int quantity_paper = 0;
	private int residual_paper = 10;
	Printer(){
		model_name = "ML-1641K";
		manufacturer = "samsung";
		interface_type = true; 
		quantity_paper = 0;
		residual_paper = 10;
	}
	Printer(String model, String manu, boolean type){
		model_name = model;
		manufacturer = manu;
		interface_type = type;
		quantity_paper = 0;
		residual_paper = 10;
	}
	void print(){
		System.out.println("모델명 : "+ model_name);
		System.out.println("제조사 : "+ manufacturer);
		if(interface_type == true){
			System.out.println("인터페이스 종류 : USB");
		} else {
			System.out.println("인터페이스 종류 : 병렬 인터페이스");
		}
		System.out.println("인쇄 매수 : "+ ++quantity_paper);
		System.out.println("인쇄 종이 잔량 : "+ --residual_paper);
	}
}
class InkjetPrinter extends Printer{
	int residual_ink;
	InkjetPrinter(){
		residual_ink = 10;
	}
	InkjetPrinter(String model, String manu, boolean type, int rink){
		super(model,manu,type);
		residual_ink = rink;
	}
	void print(){ // 오버라이딩(매서드 재정의)
		super.print();
		System.out.println("잉크 잔량 : "+ --residual_ink);
	}
}
class LaserPrinter extends Printer{
	int residual_toner;
	LaserPrinter(){
		residual_toner = 10;
	}
	LaserPrinter(String model, String manu, boolean type, int rtoner){
		super(model,manu,type);
		residual_toner = rtoner;
	}
	void print(){ // 오버라이딩(매서드 재정의)
		super.print();
		System.out.println("토너 잔량 : "+ --residual_toner);
	}
}
public class Chapter5_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Printer p1 = new Printer();
		p1.print();
		System.out.println();
		Printer p2 = new Printer("프린터","프린터 제조 회사",true);
		p2.print();
		System.out.println();
		InkjetPrinter i = new InkjetPrinter();
		i.print();
		i.print();
		System.out.println();
		LaserPrinter r1 = new LaserPrinter("레이저 프린터","레이저 프린터 제조 회사",false,20);
		r1.print();
		System.out.println();
		LaserPrinter r2 = new LaserPrinter();
		r2.print();
		r2.print();
	}

}


 

2. 4장 연습문제 중 하나를 수정하여 완성해보자. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수해애하는 각 클래스 Add, Sub, Mul, Div를 만들어라. 이들은 모두 다음 필드와 메소드를 가진다.

 - int 타입의 a, b, 필드 : 연산하고자 하는 피연산자

 - void setValue(int a, int b) : 피연산자를 객체 내에 설정한다.

 - int calculate() : 해당 클래스의 목적에 맞는 연산을 실행하고 그 결과를 리턴한다.

Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 정의하고 이들이 Calc를 상속받게 하라. main() 메소드에서는 다음 실행 사례의 그림과 같이 키보드로부터 계산하고자 하는 연산자와 두 정수를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 시행할 수 있는 객체를 생성하고 setValue()와 calculate()를 호출하여 그 결과 값을 화면에 출력하라.

 

 

<소스코드> Chapter5_2.java

import java.util.Scanner;

// interface를 사용하지 못하는 이유 : 멤버 변수가 상수여야해서 변경 불가
abstract class calc { 
	int a;
	int b;
	abstract void setValue(int x, int y);
	abstract int calculate();
	
}
class Add extends calc{

	@Override
	void setValue(int x, int y) {
		// TODO Auto-generated method stub
		a=x;
		b=y;
	}

	@Override
	int calculate() {
		// TODO Auto-generated method stub
		return a+b;
	}

}
class Sub extends calc{

	@Override
	void setValue(int x, int y) {
		// TODO Auto-generated method stub
		a=x;
		b=y;
	}

	@Override
	int calculate() {
		// TODO Auto-generated method stub
		return a-b;
	}
	
}
class Mul extends calc{

	@Override
	void setValue(int x, int y) {
		// TODO Auto-generated method stub
		a=x;
		b=y;
	}

	@Override
	int calculate() {
		// TODO Auto-generated method stub
		return a*b;
	}
	
}
class Div extends calc{

	@Override
	void setValue(int x, int y) {
		// TODO Auto-generated method stub
		a=x;
		b=y;
	}

	@Override
	int calculate() {
		// TODO Auto-generated method stub
		return a/b;
	}
	
}
public class Chapter5_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.print("두 정수와 연사자를 입력하시오>>");
		Scanner sd = new Scanner(System.in);
		int x = sd.nextInt();
		int y = sd.nextInt();
		char ch = sd.next().charAt(0);
		int result = 0;
		switch (ch){
			case '+':
				Add a = new Add();
				a.setValue(x, y);
				result = a.calculate();
				break;
			case '-':
				Sub s = new Sub();
				s.setValue(x, y);
				result = s.calculate();
				break;
			case '*':
				Mul m = new Mul();
				m.setValue(x, y);
				result = m.calculate();
				break;
			case '/':
				Div d = new Div();
				d.setValue(x, y);
				result = d.calculate();
				break;
		}
		System.out.println(result);
	}

}



 

3. 다음 Stack 인터페이스를 구현하며 스택의 원소로는 문자열(String)을 갖는 StringStack 클래스를 작성하라. 그리고 StringStack에 문자열을 삽입하고 다시 pop하여 문자열을 출력하는 main() 메소드를 구현하여 프로그램을 완성하라.

interface Stack {

int length();

Object pop();

boolean push(Object ob);

}

 

<소스코드> Chapter5_3.java

import java.lang.reflect.Array;

interface Stack{
	int length();
	Object pop();
	boolean push(Object ob);
}
class StringStack implements Stack{
	Object stack;
	StringStack(){
		stack="";
	}
	@Override
	public int length() {
		// TODO Auto-generated method stub
		return stack.toString().length(); // Stack의 길이 출력
	}

	@Override
	public Object pop() {
		// TODO Auto-generated method stub
		return stack;
	}

	@Override
	public boolean push(Object ob) {
		// TODO Auto-generated method stub
		if(ob.equals("")){
			return false;
		} else{
			stack=ob;
			return true;		
		}
	}
	
}
public class Chapter5_3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StringStack st = new StringStack();
		st.push("안녕하세요!");
		System.out.println(st.length());
		System.out.println(st.pop());
	}

}

 

참고자료 : 생능출판 명품 JAVA Programming

github 주소 : 

https://github.com/ch1517/First_Step/tree/master/Chapter5/Chapter5

 

반응형

댓글