JAVA 15일차

MOZZI KIM·2022년 11월 14일
0

JAVA

목록 보기
15/21
post-thumbnail

1. 기본적인 예외처리 매커니즘은?


📌예외 처리 메커니즘

자바에서 예외 처리는 다음과 같은 순서로 진행됩니다.

  1. try 블록에 도달한 프로그램의 제어는 try 블록 내의 코드를 실행합니다.

    이때 만약 예외가 발생(throw)하지 않고, finally 블록이 존재하면 프로그램의 제어는 바로 finally 블록으로 이동합니다.

  2. try 블록에서 예외가 발생하면 catch 핸들러는 다음과 같은 순서로 적절한 catch 블록을 찾게 됩니다.

    2-1. 스택에서 try 블록과 가장 가까운 catch 블록부터 차례대로 검사합니다.

    2-2. 만약 적절한 catch 블록을 찾지 못하면, 바로 다음 바깥쪽 try 블록 다음에 위치한 catch 블록을 차례대로 검사합니다.

    2-3. 이러한 과정을 가장 바깥쪽 try 블록까지 계속 검사하게 됩니다.

    2-4. 그래도 적절한 catch 블록을 찾지 못하면, 예외는 처리되지 못합니다.

  3. 만약 적절한 catch 블록을 찾게 되면, throw 문의 피연산자는 예외 객체의 형식 매개변수로 전달됩니다.

  4. 모든 예외 처리가 끝나면 프로그램의 제어는 finally 블록으로 이동합니다.

  5. finally 블록이 모두 처리되면, 프로그램의 제어는 예외 처리문 바로 다음으로 이동합니다.


2. 아래와 같이 업다운 게임을 만드시오.

게임시작 1
게임종료 2

1
숫자를 입력해주세요 : 50
Up ====> 9번 남아 있습니다.
숫자를 입력해주세요 : 75
Down ===> 8번 남아 있습니다.
숫자를 입력해주세요 : 60
Up ====> 7번 남아 있습니다.
숫자를 입력해주세요 : 65
Down ===> 6번 남아 있습니다.
숫자를 입력해주세요 : 64
일치
게임시작 1
게임종료 2
>>
2
게임을 종료합니다.
package TeachPrac;

import java.util.Scanner;

public class UpDownGame {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("1. 게임시작  || 2. 게임종료");
		int start = sc.nextInt();
		int random = (int) (Math.random() * 100) + 1;
		int count = 10;

		if (start == 1) {
			System.out.println("게임을 시작합니다.");

			for (int i = 0; i < 10; i++) {
				System.out.print("\n숫자를 입력해주세요.");
				int ans = sc.nextInt();
				if (ans < random) {
					--count;
					System.out.print("UP! ====> " + count + "번 남았습니다.");
				} else if (ans > random) {
					--count;
					System.out.print("DOWN! ====> " + count + "번 남았습니다.");
				} else if (ans == random) {
					System.out.println("정답입니다!!!");
					System.out.println("다시 하시겠습니까? 1. 재시작  || 2. 게임종료");
					start = sc.nextInt();
					if (start == 1) {
						i = 0 //이게 맞나ㅎㅎ ;; 멍청;
						count = 10;
						random = (int) (Math.random() * 100) + 1;
					} else {
						break;
					}
				} else if (count == 0) {
					System.out.println("이런 못 맞추셨네요?!");
					System.out.println("다시 하시겠습니까? 1. 재시작  || 2. 게임종료");
					start = sc.nextInt();
					if (start == 1) {
						continue;
					} else {
						break;
					}
				}
			}
		} else {
			System.out.println("게임을 종료합니다.");
			sc.close();
		}
	}
}

3. 아래를 프로그래밍 하시오.

철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다

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

4. 아래를 프로그래밍 하시오.

다음은 물건을 구입하는 사람을 정의한 클래스이다 이 클래스는 멤버변수 Buyer .
로 돈 과 장바구니 를 가지고 있다 제품을 구입하는 기능의 메서드와 장 (money) (cart) . buy
바구니에 구입한 물건을 추가하는 메서드 구입한 물건의 목록과 사용금액 그리고 남 add , ,
은 금액을 출력하는 메서드를 완성하시오 summary .
1. : buy 메서드명
기 능 지정된 물건을 구입한다 가진 돈 에서 물건의 가격을 빼고 : . (money) ,
장바구니 에 담는다 (cart) .
만일 가진 돈이 물건의 가격보다 적다면 바로 종료한다.
반환타입 없음 :
매개변수 구입할 물건 : Product p -
2. : add 메서드명
기 능 지정된 물건을 장바구니에 담는다 : .
만일 장바구니에 담을 공간이 없으면 장바구니의 크기를 배로 늘린 다음에 담는다 , 2 .
반환타입 없음 :
매개변수 구입할 물건 : Product p -
3. : summary 메서드명
기 능 구입한 물건의 목록과 사용금액 남은 금액을 출력한다 : , .
반환타입 없음 :
매개변수 없음 :
[ ] 연습문제 /ch7/Exercise7_19.java
class Exercise7_19 {
public static void main(String args[]) {
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
b.buy(new Tv());
b.buy(new Audio());
b.buy(new Computer());
b.buy(new Computer());
b.buy(new Computer());
b.summary();
}
}
class Buyer {
int money = 1000;
Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
int i = 0; // Product cart index 배열 에 사용될
void buy(Product p) {
/*
(1) . 아래의 로직에 맞게 코드를 작성하시오
1.1 . 가진 돈과 물건의 가격을 비교해서 가진 돈이 적으면 메서드를 종료한다
1.2 , 가진 돈이 충분하면 제품의 가격을 가진 돈에서 빼고
1.3 .(add ) 장바구니에 구입한 물건을 담는다 메서드 호출
Java 3 - 의 정석 판 연습문제 풀이 定石 57
*/
}
void add(Product p) {
/*
(2) . 아래의 로직에 맞게 코드를 작성하시오
1.1 i의 값이 장바구니의 크기보다 같거나 크면
1.1.1 2 . 기존의 장바구니보다 배 큰 새로운 배열을 생성한다
1.1.2 . 기존의 장바구니의 내용을 새로운 배열에 복사한다
1.1.3 . 새로운 장바구니와 기존의 장바구니를 바꾼다
1.2 (cart) . i 1 . 물건을 장바구니 에 저장한다 그리고 의 값을 증가시킨다
*/
} // add(Product p)
void summary() {
/*
(3) . 아래의 로직에 맞게 코드를 작성하시오
1.1 . 장바구니에 담긴 물건들의 목록을 만들어 출력한다
1.2 . 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다
1.3 (money) . 물건을 사고 남은 금액 를 출력한다
*/
} // summary()
}
class Product {
int price; // 제품의 가격
Product(int price) {
this.price = price;
}
}
class Tv extends Product {
Tv() { super(100); }
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() { super(200); }
public String toString() { return "Computer";}
}
class Audio extends Product {
Audio() { super(50); }
public String toString() { return "Audio"; }
}
[ ] 실행결과
잔액이 부족하여 을 를 살수 없습니다 Computer / .
구입한 물건:Tv,Computer,Tv,Audio,Computer,Computer,
사용한 금액:850
남은 금액:150
package TeachPrac;

public class BuyerPrac {

	public static void main(String args[]) {
		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());
		b.summary();
	}
}
class Buyer {
	int money = 1000;
	Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
	int i = 0; // Product cart index 배열 에 사용될
	void buy(Product p) {
		// 1.1 . 가진 돈과 물건의 가격을 비교해서 가진 돈이 적으면 메서드를 종료한다
		if(money < p.price) {
			System.out.println("잔액이 부족하여"+ p +"을/를 살수 없습니다."); //잔액이 부족하여 을 를 살수 없습니다
			return;
		}
		// 1.2 , 가진 돈이 충분하면 제품의 가격을 가진 돈에서 빼고
		money -= p.price;
		// 1.3 .(add ) 장바구니에 구입한 물건을 담는다 메서드 호출
		add(p);
	}
	void add(Product p) {
		// 1.1 i의 값이 장바구니의 크기보다 같거나 크면
		if(i >= cart.length) {
			// 1.1.1 2 . 기존의 장바구니보다 배 큰 새로운 배열을 생성한다
			Product[] tmp = new Product[cart.length*2];
			// 1.1.2 . 기존의 장바구니의 내용을 새로운 배열에 복사한다
			System.arraycopy(cart,0,tmp,0,cart.length);
			// 1.1.3 . 새로운 장바구니와 기존의 장바구니를 바꾼다
			cart = tmp;
		}
		// 1.2 (cart) . i 1 . 물건을 장바구니 에 저장한다 그리고 의 값을 증가시킨다
		cart[i++]=p;
	} // add(Product p)
	void summary() {
		String itemList = "";
		int sum = 0;
		for(int i=0; i < cart.length;i++) {
			if(cart[i]==null)
				break;
			// 1.1 . 장바구니에 담긴 물건들의 목록을 만들어 출력한다
			itemList += cart[i] + ",";
			// 1.2 . 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다
			sum += cart[i].price;
		}
		// 1.3 (money) . 물건을 사고 남은 금액 를 출력한다
		System.out.println("구입한 물건 :"+itemList); 
		System.out.println("사용한 금액 :"+sum); 
		System.out.println(" 남은 금액 :"+money);
	} // summary()
}
class Product {
	int price; // 제품의 가격
	Product(int price) {
		this.price = price;
	}
}
class Tv extends Product {
	Tv() { super(100); }
	public String toString() { return "Tv"; }
}
class Computer extends Product {
	Computer() { 
		super(200); 
	}
	public String toString() { 
		return "Computer";
	}
}
class Audio extends Product {
	Audio() { 
		super(50); 
	}
	public String toString() { 
		return "Audio"; 
	}
}
profile
코린이

0개의 댓글