본문 바로가기
Programming Study/절대JAVA

[절대JAVA]8장 프로그래밍 연습문제(1)

by 푸고배 2018. 9. 27.

1. 다음 조건을 만족하는 클래스를 구현하여 테스트하는 프로그램을 작성하시오.

- 표준입력으로 두 개의 정수를 입력 받아 곱셈 연산 결과를 출력

- 표준입력에서 정수가 아닌 값이 입력되면 예외가 발새하여 실행이 중단되는데, 이를 예외 처리하여 실행되도록 구현

- 다음 소스를 참고

int x = 0, y = 0, z = 0;

Scanner input = new Scanner(System.in);
System.out.print("정수 두 개 입력 : ");
x = input.nextInt();
y = input.nextInt();
z =x*y;System.out.printf("%d * %d = %d %n", x, y, z);

<소스코드> Chapter8_1.java

package Chapter8_1;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Chapter8_1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int x=0,y=0,z=0;
		Scanner input = new Scanner(System.in);
		System.out.print("정수 두 개 입력 : ");
		try {
			x = input.nextInt();
			y = input.nextInt();
			z =x*y;
			System.out.printf("%d * %d = %d %n",x,y,z);
		}catch(InputMismatchException e) {
			System.out.println(e);
		}
	}

}

 

2. 다음 조건을 만족하도록 클래스 BankAccount와 이를 테스트하는 클래스 Ex03 프로그램을 작성하시오.

- 새로운 예외 InvalidWithdraw를 다음과 같이 구현

class InvalidWithdraw extends Exception {
    private static final long serialVersionUID = 1L;
    public InvalidWithdraw(String msg) {
    super(msg);
    }
}

- 클래스 BankAccount는 최저 잔금을 저장할 수 있는 필드를 지정하는 생성자를 제공하며, 메소드 deposit(money)은 입금 메소드이며, 메소드 withdraw(money)는 출금 메소드로 인출 요청 금액이 음수이거나 최저 잔금 이하로 인출을 요청하면 적당한 메시지의 예외 InvalidWithdraw를 발생시킨다.

- 즉 다음은 최저 잔고가 -100,000원인 은행계좌를 만들어 500,000원을 인출하려는 소스로서, 클래스 Ex03의 main()에서 다음 소스의 예외처리를 작성하시오.

BankAccount ba = new BankAccount(-100000);
ba.withdraw(500000);

<소스코드>

BankAccount.java

package Chapter8_2;

import javax.activity.InvalidActivityException;

class InvalidWithdraw extends Exception {
	private static final long serialVersionUID = 1L;
	public InvalidWithdraw(String msg) {
		super(msg);
	}
}
public class BankAccount {
	int minmoney;
	int money;
	public BankAccount(int minmoney) {
		this.minmoney = minmoney;
		money=0;
	}
	void deposit(int money) throws InvalidActivityException {
		if(money<0) 
			throw new InvalidActivityException("양수를 입력하세요");
		else {
			this.money += money;
		}
	}
	void withdraw(int money) throws InvalidActivityException {
		this.money -= money;
		if(money<0) 
			throw new InvalidActivityException("양수를 입력하세요");
		else {
			if(this.money<this.minmoney)
				throw new InvalidActivityException("최대 인출 금액을 초과했습니다.");
		}
	}
}

Ex03.java

package Chapter8_2;

import javax.activity.InvalidActivityException;

public class Ex03 {

	public static void main(String[] args) throws InvalidActivityException {
		// TODO Auto-generated method stub
		BankAccount ba = new BankAccount(-100000);
		ba.withdraw(500000);
	}

}

 

3. 위에서 구현한 클래스 InvalidWithdraw와 BankAccount를 다음 조건을 만족하도록 다시 구현하여 클래스 ex03에서 테스트하시오.

- 클래스 Ex03에서 다음 소스에 문법오류가 없도록 예외 InvalidWithdraw를 비체크 예외로 작성하시오.

BankAccount ba = new BankAccount(-100000);
ba.deposit(100000);

ba.withdraw(100000);
ba.withdraw(200000); 

- 위 클래스 Ex03을 실행하면 다음과 같이 마지막 문장에서 예외가 발생하도록 BankAccount를 적절히 구현시오(단 패키지와 예외 발생 줄 번호는 달라도 상관없음).

정상 입금처리 : 입금금액=100000, 잔금 =100000
정상 출금처리 : 출금금액=100000, 잔금 =     0
javax.activity.InvalidActivityException: 초과출금 요구 예외
at Chapter8_3.BankAccount.withdraw(BankAccount.java:43)
at Chapter8_3.Ex03.main(Ex03.java:12)

 

- 위 클래스 Ex03에서 다시 예외처리를 구현하시오.

<소스코드>

BankAccount.java

package Chapter8_3;

import javax.activity.InvalidActivityException;

class InvalidWithdraw extends RuntimeException {
	private static final long serialVersionUID = 1L;
	public InvalidWithdraw(String msg) {
		super(msg);
	}
}
public class BankAccount {
	int minmoney;
	int money;
	public BankAccount(int minmoney) {
		this.minmoney = minmoney;
		money=0;
	}
	void deposit(int money) {
		if(money<0)
			try {
				throw new InvalidActivityException("양수를 입력하세요");
			} catch (InvalidActivityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else {
			this.money += money;
			System.out.printf("정상 입금처리 : 입금금액=%6d, 잔금 =%6d\n",money,this.money);
		}
	}
	void withdraw(int money)  {
		this.money -= money;
		if(money<0)
			try {
				throw new InvalidActivityException("양수를 입력하세요");
			} catch (InvalidActivityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else {
			if(this.money<this.minmoney)
				try {
					throw new InvalidActivityException("초과출금 요구 예외");
				} catch (InvalidActivityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			else
				System.out.printf("정상 출금처리 : 출금금액=%6d, 잔금 =%6d\n",money,this.money);
		}
	}
}

Ex03.java

package Chapter8_3;

import javax.activity.InvalidActivityException;

public class Ex03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BankAccount ba = new BankAccount(-100000);
		ba.deposit(100000);
		ba.withdraw(100000);
		ba.withdraw(200000);
	}
	

}

 

4. 다음 조건을 만족하도록 스레드 PrimeNumber01 프로그램을 작성하여 클래스 Ex04의 main() 메소드에서 테스트하시오.- 클래스 PrimeNumber01은 1에서 지정된 생성자의 인자까지 소수를 구하여 출력하는 프로그램- 클래스 Ex04의 main() 메소드에서 다음을 실행하면 1에서 20사이의 소수인 다음이 출력

primeNumber01 pn = new PrimeNumber01(20);

pn.start(); 

      2    3     5     7    11    13    17    19

 

<소스코드>

Ex04.java

package Chapter8_4;

public class Ex04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PrimeNumber01 pn = new PrimeNumber01(20);
		pn.start();
	}

}

PrimeNumber.java

package Chapter8_4;

public class PrimeNumber01 extends Thread {
	int num; // 인자를 저장할 변수
	PrimeNumber01(int num){
		this.num=num;
	}
	public void run() {
		boolean s = true;
		for(int i=2;i<=num;i++) { // 2부터 num까지
			for(int j=2;j<i;j++) { // 2부터 i까지의 숫자로
				if(i%j==0) { // 나누었을때 나누어 떨어지면
					s = false; // 소수가 아니다.
					break; // 다음 숫자로 넘어가기 위해 바로 정지
				}
			}
			if(s) { // true이면 (=소수이면)
				System.out.print(i+"\t");
			}
			s = true;
		}
	}
}

참고자료 : 인피니티북스 절대 JAVA

github 주소 : 

https://github.com/ch1517/Network-programming/tree/master/Chapter8

반응형

댓글