1. 에러와 예외의 차이는?
※에러란?
· 시스템에 비정상적인 상황을 말하며, 원인이 로직에서 존재하지 않는다(코딩상의 문제X)
· 코딩상의 문제가 아니며 메모리가 꽉 찼을 떄 등의 문제를 말한다.
※예외란?
· Exception은 개발자가 구현한 로직에서, 실행 도중 발생하는 정상적이지 않은 상황을 말한다.
· 자바의 예외처리 메커니즘은 문제가 발생하는 지점에 대한 정보 출력과 동시에 프로그램을 종료시킨다.
2. try-catch 하는 이유?
· 예외가 발생할 수 있는 구문에 예외처리가 되어 있지 않다면 해당되는 시점부터 실행이 끝나버리지만,
try~catch를 통해 예외처리가 되어있다면, jvm이 프로그램을 살리기 위해 해당객체로 넘겨서 해결한다.
♣예외 발생 이후의 실행 흐름♣
· 아래와 같이 실행순서 1, 2, 3번이 존재하는 상황에서, 2번에서 예외 발생 시 3번은 실행되지 않고 멈춰 예외 처리가 되고
4번 위치부터 다시 실행된다. 이 때 4번이 실행되긴 하지만 출력은 되지 않으며 오류 메세지를 전달한다.
· try의 영역을 설정할 때 나눠서 할 것인가 한 번에 할 것인가? 한 번에 묶어 처리할 것!
3. 예외처리 UML를 그리시오. 외울 것!!
· 예외처리 메커니즘(Try Catch finally)을 제공한다.
· Exception은 코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외적 상황을 표현하기 위한 클래스들이며,
RuntimeException을 상속하는 Unchecked Exception와 Checked Exception로 구성된다.
· RuntimeException은 실행중간에 오류가 발생하고, 코드 오류로 발생하는 경우가 대부분이다.
대표적인 예)
ArithmeticException: 수학 연산에서의 오류를 의미, InputMismatchException: Scanner를 통한 값입력의 오류를 의미
4. unchecked와 cheked 예외의 차이는?
· unchecked Exception은 RuntimeException을 상속하고, 명시적인 처리를 강제하지 않는다.
· cheked Exception은 RuntimeException을 상속하지 않고, 반드시 예외 처리가 필요하다.(try~catch)
5. throws에 대하여 설명하시오.
· 코드의 문법적 오류가 아닌, 프로그램 실행 과정에서 발생하는 예외처리는 반드시 명시해 주어야 하는데
throws절 선언 혹은 try~catch를 사용하여 예외처리를 한다.
· throws 키워드의 선언을 통해 예외 처리를 넘길 수 있으며, 이 때 throws는 함수 단위로 사용된다.
(메소드 이상으로는 넘길 수 없으므로 throws Exception() 형태의 선언은 불가)
6. try-catch-finally에 대하여 설명하시오.
· try-catch-finally 예외처리는 try 혹은 catch 부분에서 예외 처리와 상관없이 finally 이후의 구문은 무조건 실행되므로, 반드시 실행되어야 하는 부분은 finally 구문에서 처리한다.
7. try-with-resource 에 대하여 설명하시오.
· try-catch 예외처리 하는 경우, .close()를 선언하여 안정적으로 try 구문을 빠져나가도록 표기해주어야 한다.
· try( resource ) 이와 같이, resource에는 객체가 들어가고, 객체에 대한 리소스를 관리해줌으로써 .colse();가 자동으로
실행되어 try 구문을 빠져나가 다음 문장을 자동 실행시키는 역할을 한다.
8. 아래가 컴파일 에러가 나는 이유에 대하여 설명하시오.
· Exception은 InputMismatchException를 포함하는 상위클래스이므로 자식클래스를 재차 선언할 필요가 없기 때문이다.
9. 사칙연산 계산기를 아래의 조건으로 작성하시오.
· 참고: interface를 활용하고, 예외 처리 메커니즘을 적용할 것
· 작성
1
2
3
4
5
6
7
|
public interface ICalculate{
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
int play();
}
|
cs |
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
class Calculator implements ICalculate{
private int x;
private int y;
private String oper;
@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;
}
@Override
public int play() {
Scanner sc = new Scanner(System.in);
while(true) {
try{
System.out.println("숫자, 연산자를 입력해주세요.");
int x = sc.nextInt();
String oper = sc.next();
int y = sc.nextInt();
}
catch(InputMismatchException | ArithmeticException e) {
System.out.println("다시 입력해주세요.");
}
switch(oper) {
case "+" :
System.out.println(add(x, y));
break;
case "-" :
System.out.println(sub(x, y));
break;
case "*" :
System.out.println(mul(x, y));
break;
case "/" :
System.out.println(div(x, y));
break;
}
}
}
}
|
cs |
1
2
3
4
5
6
|
class Calmain{
public static void main(String[] args) {
Calculator cal = new Calculator();
cal.play();
}
}
|
cs |
10. 다음 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하여라.
· 참고
· 작성
1
2
3
4
5
6
7
8
9
10
|
abstract class Calculator {
protected int num1;
protected int num2;
public void setValue(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
abstract public int calculate();
}
|
cs |
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
|
class Add extends Calculator{
@Override
public int calculate() {
return num1 + num2;
}
class Sub extends Calculator{
@Override
public int calculate() {
return num1 - num2;
}
}
class Mul extends Calculator{
@Override
public int calculate() {
return num1 * num2;
}
}
class Div extends Calculator{
@Override
public int calculate() {
return num1 / num2;
}
}
}
|
cs |
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
32
33
34
35
36
37
38
|
class Calculatormain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int result = 0;
System.out.println("두 정수와 연산자를 입력하시오 >> ");
try {
int num1 = sc.nextInt();
int num2 = sc.nextInt();
char op = sc.next().charAt(0);
Calculator cal = null;
switch(op) {
case '+':
cal = new Add();
break;
case '-':
cal = new Sub();
break;
case '*':
cal = new Mul();
break;
case '/':
cal = new Div();
break;
default:
System.out.println("잘못된 연산입니다. ");
}
cal.setValue(num1, num2);
System.out.println(cal.calculate());
}
catch(Exception e) {
System.out.println("비정상 종료입니다.");
e.printStackTrace();
}
sc.close();
}
}
|
cs |
'bitcamp > JAVA' 카테고리의 다른 글
Object 클래스_연습문제 (0) | 2021.01.25 |
---|---|
JVM 메모리모델과 Object 클래스 (0) | 2021.01.25 |
interface와 추상클래스_연습문제 (0) | 2021.01.20 |
interface와 추상클래스 (0) | 2021.01.18 |
클래스의 상속과 오버라이딩_연습문제 (0) | 2021.01.17 |