JAVA/연습문제

쉽게 배우는 자바 프로그래밍 2판 4장 도전문제

세언이 2022. 10. 6. 18:23
반응형

# 개발 공부하는 초보자가 작성한 답안이니 정답이 아닐 수 있습니다!!!

 

1. 그림을 참고해 프린터의 상태와 동작을 클래스로 작성하고 테스트 해보자.

 

📢주어진 값📢

class Printer {
	int numOfPapers = 0;

	public void print(int amount) {
		// 코드 추가
	}
}


public class PrinterTest {
	public static void main(String[] args) {
		// Printer 클래스를 테스트 하는 코드
	}
}

출력
30
🧤정답🧤

class Printer {
	int numOfPapers = 0;               // numOfPapers이라는 필드(멤버 변수, 인스턴스 변수)

	public void print(int amount) {    // print라는 메서드 (멤버 메서듣)
        System.out.println("출력할 장 수 : " + amount);
		numOfPapers -= amount;         // numOfPapers 필드에 입력값(매개변수)을 빼주고 대입한다.
	}
}


public class PrinterTest {
	public static void main(String[] args) {
		// Printer 클래스를 테스트 하는 코드
		Printer demoPrinter = new Printer();   // 객체 생성

		System.out.println("현재 용지 수 : " + demoPrinter.numOfPapers);
		demoPrinter.numOfPapers = 100;         // 용지 100장 추가
		System.out.println("용지 추가 수 : " + demoPrinter.numOfPapers);
		demoPrinter.print(70);                 // 70장 출력

		System.out.println("남아 있는 용지 : " + demoPrinter.numOfPapers);
	}
}

 

 

 

2. 프린터의 용지가 부족할 수도 있다. 따라서 Printer 2클래스를 다음과 같이 수정하되 이번에는 생성자도 추가해보자

📢주어진 값📢
public class PrinterTest2 {
	public static void main(String[] args) {
		// Printer 클래스를 테스트 하는 코드
		Printer2 demoPrinter = new Printer2(10); // 객체 생성
		demoPrinter.print2(2);
		demoPrinter.print2(20);
		demoPrinter.print2(10);
	}

}


class Printer2 {
	private int numOfPapers = 0;
    
    // 초기화하는 생성자 추가
    
    // print()메서드가 다음을 수행하도록 작성
    // 1. 츨력할 때 남아 있는 용지가 없다고 알려준다.
    // 2. 남아있는 용지보다 많은 출력을 요구하면 남아 있는 용지만큼 출력한다.
    // 3. 부족한 용지 매수를 미리 알려 준다.
    }
}
🧤정답🧤

class Printer2 {
	private int numOfPapers = 0;

	public void print2(int amount) {
		if (numOfPapers > amount) {       // 남아있는 용지의 수가 출력해야할 수 보다 많을 경우
			numOfPapers -= amount;        // 남아있는 용지의 수 - 출력해야할 수
			System.out.println(amount + "장 출력했습니다. 현재 " + numOfPapers + "장 남아 있습니다.");
		} else if (0 < numOfPapers && numOfPapers < amount) {  // 남아있는 용지의 수가 0보다 크고 출력해야할 수 보다 적을 경우
            		numOfPapers -= amount;   // 출력해야할 수가 더크기 때문에 음수값으로 나온다.
            		amount += numOfPapers;   // 출력된 수를 구하기 위해 출력해야할 수 에 남아있는 용지수가 음수값이니 더해준다.
            
            // 음수값으로 나왔기 때문에 부족한 용지수를 구하는 곳에 -1를 곱해줘서 양수값으로 출력이 될 수 있도록 한다.
			System.out.printf("모두 출력하려면 용지가 %d매 부족합니다. %d장만 출력합니다.\n", (numOfPapers * -1), amount);
		} else {
			System.out.println("용지가 없습니다.");
		}
	}

	public Printer2(int numOfPapers) {
		this.numOfPapers += numOfPapers;
	}
}


public class PrinterTest2 {
	public static void main(String[] args) {
		// Printer 클래스를 테스트 하는 코드
		Printer2 demoPrinter = new Printer2(10); // 객체 생성
		demoPrinter.print2(2);
		demoPrinter.print2(20);
		demoPrinter.print2(10);
	}

}

 

 

 

 

3. 양면 출력이 가능한 Printer3 클래스로 수정하되 이번에는 접근자와 설정자도 추가해보자.

📢주어진 값📢

class Printer3 {
	private int numOfPapers;
	private boolean duplex;

	public Printer3(int numOfPapers, boolean duplex) {
	}

	public void print(int amount) {
	}

	public boolean getDuplex() {
	}

	public void setDuplex(boolean duplex) {
	}
}


public class PrinterTest3 {

	public static void main(String[] args) {
		Printer3 demoPrinter = new Printer3(20, true);
		demoPrinter.print(25); 
		demoPrinter.setDuplex(false); 
		demoPrinter.print(10);
	}
}


결과값
양면으로 13장 출력했습니다. 현재 7장 남아 있습니다.
단면으로 모두 출력하려면 용지가 3매 부족합니다. 7장만 출력합니다.
🧤정답🧤

class Printer3 {
	private int numOfPapers;
	private boolean duplex;

	public Printer3(int numOfPapers, boolean duplex) {
		this.numOfPapers = numOfPapers;
		this.duplex = duplex;
	}

	public void print(int amount) {
		if (duplex == true) {
			if ((amount / 2) == 0) {            // amount값이 짝수일 때
				numOfPapers -= amount / 2;
				System.out.printf("양면으로 %d장 출력했습니다. 현재 %d장 남아 있습니다.\n", (amount / 2), numOfPapers);
			} else {                            // amount값이 홀수일 때 1장에 2면(앞,뒤)이 있으니 다르게 계산해줘야한다.
				numOfPapers -= (amount / 2) + 1;
				System.out.printf("양면으로 %d장 출력했습니다. 현재 %d장 남아 있습니다.\n", (amount / 2) + 1, numOfPapers);
			}
		} else {
			if (numOfPapers > amount) {    // 남아있는 용지의 수가 출력해야할 수 보다 많을 경우
				numOfPapers -= amount;     // 남아있는 용지의 수 - 출력해야할 수
				System.out.printf("단면으로 모두 출력하여 용지 %d장을 출력하고 남아있는 용지는 %d장 입니다.\n", amount, numOfPapers);
			} else {                       // 출력해야 할 수가 더 많을 경우
				numOfPapers -= amount;     // 음수값으로 부족한 용지의 수를 알 수 있다.
				amount += numOfPapers;     // 출력해야할 수에 음수값인 부족한 용지의 수를 더해서 출력된 용지의 수를 알 수 있다.
				System.out.printf("단면으로 모두 출력하려면 용지가 %d매 부족합니다. %d장만 출력합니다.\n", (numOfPapers * -1), amount);
			}
		}
	}

	public boolean getDuplex() {           // 접근자 duplex의 값을 가져오기 위해
		return duplex;
	}

	public void setDuplex(boolean duplex) { // 설정자 duplex의 값을 변경하기 위해
		this.duplex = duplex;
	}

}


public class PrinterTest3 {

	public static void main(String[] args) {
		Printer3 demoPrinter = new Printer3(20, true);   // demoPrinter는 객체 인스턴스다.
		demoPrinter.print(25); 
		demoPrinter.setDuplex(false); 
		demoPrinter.print(10);
	}
}
반응형