티스토리 뷰

수업문제

[문제] 10월 28일 (오류, 예외)

WhaleTREE 2021. 10. 28. 20:03

학습정리-10-28.txt
0.00MB

1. 에러(Error)와 예외(Exception)의 차이는?

에러와 예외의 차이는 코드로(내부적으로)  해결(처리)할 수 있느냐이다.

 

⊙ 오류{Error)는 시스템이 종료되어야 할 정도의 심각한 문제로 개발자가 미리 예측하여 방지할 수 없다.

ex)

VirtualMachineError : 가상머신에 심각한 오류

IOError : 메모리 부족, 하드웨어 문제

 

 예외(Exception)는 내부적으로 발생한(코드 상의) 문제로 오류와 달리 개발자가 미리 예측하여 방지할 수 있다. 이 때

상황에 맞게 예외처리(Exception Handle)를 해야한다.

 

 

 

 


2. unchecked 와 checked 예외의 차이는?

Runtime Exception(unchecked) : 실행중 실시간으로 발생하는 오류

 ex) ArithmeticException - 수학 연산에서의 오류 상황을 의미하는 예외 ( 0으로 나누는 것 등)

        InputMismatchException - Scanner를 통한 값의 입력에서이 잘못됐을 때 발생하는 예외

       ClassCastException - 클래스 형 변환을 잘못 했을 때 발생한 예외

       IndexOutOfBoundsException - 가지고 있는 사이즈보다 추가할 인덱스가 클경우 발생하는 예외

       NegativeArraySizeException  -  배열 생성시 길이를 음수로 지정하는 예외의 발생

       NullPointerException - 사용할 객체를 생성 후 인스턴스를 생성하지 않고 null 을 사용하려고 할 때 발생하는 예외

       ArrayStoreException  - 배열에 적절치 않은 인스턴스를 저장하는 예외의 발생

 

Other Exception(checked) : unhandled exception type. 반드시 개발자가 코드상으로 에러 처리를 해야되는 오류로

unchecked가 아닌 예외는 check에 해당된다. → 오류 해결을 위해서는 try~catch로 묶어주어야 한다.

 

 

unchecked 와 checked 예외의 차이는 checked는 try catch를 하면 발생한 오류가 잡힌다.

 

 

 

 



3. 예외처리(Exception Handling) UML(상속도)참고하여  그리시오.

 

 

 


4. throws 에 대하여 설명하시오.

Checked Exception을 처리하기 위한 방법 중 하나이다. 

메소드에 throws를 붙여 예외 처리를 하게 되면 throws를 호출한 함수에 예외 처리를 넘기게 된다.

(JVM에게 개발자가 해결해야 될 예외 처리를 떠넘기는 것이다.)

try~catch를 사용할 때와 다르게 예외가 발생해도 오류 문구가 출력되지 않고 실행만 중지 된다.

그래서 어떤 부분에서 오류가 발생했는지 알아보기 어렵다는 단점이 있다.

 

 

 

 


5. 아래가 컴파일 에러가 나는 이유에 대하여 설명하시오.
try {
int num = 6 / 0;
} catch (Exception e) {
e.printStackTrace();
} catch (InputMismatchException e) {
e.printStackTrace();
}

Exception은 InputMismatchException 의 부모클래스이다.  그래서 Exception catch 문에서 이미 InputMismatchException의 예외처리가 완료되어  InputMismatchException e catch문은 실행될 일이 발생하지 않는다. 어떤 경우든 실행되지 않아 컴파일 오류가 발생한다.

 

 

 

 


6. 사칙연산 계산기를 아래의 조건으로 짜시오.
interface ICalculator {
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
}

public class CalculatorMain {

public static void main(String[] args) {
ICalculator cal = new Calculator();

//출력결과 참고 하여 try catch 를 적절히 넣을것  
System.out.println(cal.add(6, 5));
System.out.println(cal.sub(6, 5));
System.out.println(cal.mul(6, 5));
System.out.println(cal.div(6, 0));

}
}

/*
================================================
11
1
30
java.lang.ArithmeticException: / by zero
at Calculator.div(CalculatorMain.java:32)
at CalculatorMain.main(CalculatorMain.java:45)
계산기 종료
*/

package edu.kosmo.test.prac;

interface ICalculator {
	int add(int x, int y);

	int sub(int x, int y);

	int mul(int x, int y);

	int div(int x, int y);
}

class Calculator implements ICalculator {

	public Calculator() {

	}

	@Override
	public int add(int x, int y) {
		return x + y;
	}

	@Override
	public int sub(int x, int y) {
		return x - y;
	}

	@Override
	public int mul(int x, int y) {
		return x * y;
	}

	@Override
	public int div(int x, int y) {
		int result = 0;
		try {
			result = x / y;

		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("계산기 종료");
			
		}
		return result;
	}

}

class CalculatorMain {

	public static void main(String[] args) {
		ICalculator cal = new Calculator();

		// 출력결과 참고 하여 try catch 를 적절히 넣을것
		System.out.println(cal.add(6, 5));
		System.out.println(cal.sub(6, 5));
		System.out.println(cal.mul(6, 5));
		System.out.println(cal.div(6, 0));

	}

}

아무리 해봐도....마지막 출력 결과에 0이 나오지 않도록 하는게 안된다...ㅠㅠ

아.....try catch를 다른 곳에 쓰면 출력 결과 0이 나오지 않는다...

 

package edu.kosmo.test.prac;

interface ICalculator {
	int add(int x, int y);

	int sub(int x, int y);

	int mul(int x, int y);

	int div(int x, int y);
}

class Calculator implements ICalculator {

	public Calculator() {

	}

	@Override
	public int add(int x, int y) {
		return x + y;
	}

	@Override
	public int sub(int x, int y) {
		return x - y;
	}

	@Override
	public int mul(int x, int y) {
		return x * y;
	}

	@Override
	public int div(int x, int y) {
		return x / y;
	}

}

class CalculatorMain {

	public static void main(String[] args) {
		ICalculator cal = new Calculator();

		// 출력결과 참고 하여 try catch 를 적절히 넣을것
		try {
			System.out.println(cal.add(6, 5));
			System.out.println(cal.sub(6, 5));
			System.out.println(cal.mul(6, 5));
			System.out.println(cal.div(6, 0));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("종료입니다.");
		} // finally 안에 넣지 않아도 괜찮다.

	}

}

 

 

 

 

 


7.과일, 사과, 배, 포도를 표현한 클래스를 만들고 이들 간의 관계를 고려하여 하나의 클래스를 추상 클래스로 만들어 

메소드 print()를 구현하고 다음과 같은 소스와 결과가 나오도록 클래스를 작성하시오.
- 소스
Fruit fAry[] = {new Grape(), new Apple(), new Pear());
for(Fruit f : fAry)
f.print();
- 결과
나는 포도이다.
나는 사과이다.
나는 배이다.

package edu.kosmo.test.prac;

abstract class Fruit{
	abstract void print();
}

class Grape extends Fruit{
	@Override
	public void print() {
		System.out.println("나는 포도이다.");
	}
}

class Apple extends Fruit{
	@Override
	public void print() {
		System.out.println("나는 사과이다.");
	}
}

class Pear extends Fruit{
	@Override
	public void print() {
		System.out.println("나는 배이다.");
	}
}

class FruitTest {

	public static void main(String[] args) {

		Fruit fAry[] = {new Grape(), new Apple(), new Pear()};
		for(Fruit f : fAry) {
		f.print();
		}
		
	}
}

 

interface로도 가능하다.

package edu.kosmo.test.prac;

interface Fruit{
	public abstract void print();
    //public abstrct는 생략해도 된다. 컴파일러가 자동으로 생성해준다.
}

class Grape implements Fruit{
	@Override
	public void print() {
		System.out.println("나는 포도이다.");
	}
}

class Apple implements Fruit{
	@Override
	public void print() {
		System.out.println("나는 사과이다.");
	}
}

class Pear implements Fruit{
	@Override
	public void print() {
		System.out.println("나는 배이다.");
	}
}

class FruitTest {

	public static void main(String[] args) {

		Fruit[] fAry = {new Grape(), new Apple(), new Pear()};
		for(Fruit f : fAry) {
		f.print();
		}
		
	}
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함