본문 바로가기
개념

[JAVA의 정석] Chapter08 - 09

by cook_code 2024. 9. 8.
반응형

교재 목차

Chapter08. 예외처리 
Chapter09. java.lang 패키지와 유용한 클래스 

Chapter08. 예외처리 (Exception Handling)


 

1. 예외란? 

1-1. 예외 (Exception)

프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

  • 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 에러의 종류
    • 컴파일 에러 : 컴파일 시 발생하는 에러
    • 런타임 에러 : 실행 시 발생하는 에러
    • 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것
  • 예외 클래스의 계층구조

  • exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
  • runtimeexception 클래스들 : 프로그래머의 실수로 발생하는 예외

1-2. 예외처리의 필요성

프로그램 실행 중 발생할 수 있는 예상치 못한 상황에 대응하여 프로그램의 정상적인 흐름을 유지해야 한다. 이를 통해 프로그램의 안정성과 신뢰성을 높일 수 있다.~~

1-3. 예외처리

예외처리의 정의 : 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것

예외처리의 목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

try-catch

try {

//예외발생할 가능성이 있는 문장 
    
}catch(Exception1 e1) {

 //Exception1이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
 //보통 이곳에 예외메세지를 출력하고 로그로 남김.
 
}catch(Exception2 e2) {

 //Exception2이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
 
}catch(ExceptionN eN) {

 //ExceptionN이 발생했을 경우, 이를 처리하지 위한 문장을 적는다.
 
}finally{

//예외발생여부에 관계없이 상항 수행되어야 하는 문장을 적는다.

}

https://cheershennah.tistory.com/147 [Today I Learned. @cheers_hena 치얼스헤나:티스토리]

 

try-catch 흐름

  • try 블럭 내에서 예외가 발생한 경우
    • 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
    • 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.
  • try 블럭 내에서 예외가 발생하지 않은 경우

printStackTrace()

예외 발생 당시의 호출스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

=> 가장 자세한 예외 정보 제공

getMessage()

발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

2. 예외 발생시키기  

2-1. 예외 발생시키기 

⑴ 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다

⑵ 키워드 throw를 통해 예외를 발생시킨다

 

2-2. 메서드에 예외 적용하기

메서드 선언부에 예외 클래스 적기

void method() throws Exception1, Exception2 {
	...
}

자손타입의 예외까지도 발생할 수 있음을 주의!

try-catch문을 사용해 중간에 예외처리를 한다.

오버라이딩 시에는 단순히 선언된 예외의 개수가 아니라 상속관계까지 고려해야 한다.

// try-catch문을 사용하지 않았을때
public static void method1() throws Exception {
	method2();
}
public static void method2() throws Exception {
	throw new Exception();
}
// 사용하는 메서드들의 예외처리가 main 메서드까지 전달되어야 한다.
public static void main(String[] args) throws Exception { 
	method1();
}
// try-catch문을 사용할 때
public static void method1() {
	try {
		method2();
	} catch (Exception e) {
		e.printStackTrace();
	}
}
public static void method2() throws Exception {
	throw new Exception();
}
// 중간에 예외처리가 되었으므로 thorws Exception을 선언하지 않아도 된다.
public static void main(String[] args) { 
	method1();
}

 

finally 블럭

예외 발생 여부와 상관없이 실행

2-3. 자동 자원 반환

try-with-resources

파일을 열고 읽거나 쓴 후에 반드시 파일을 닫아야 하는데, 이 구문을 사용하면 블록 종료시 자동으로 filereader가 닫히도록 되어있다는 것이 장점이다. 이 구문은 AutoCloseable 인터페이스르 구현한 객체만 사용할 수 있다.

  • try-with-resources 활용처
    • 파일입출력
    • 데이터베이스 연결
try (FileReader fr = new FileReader("path/to/file.txt")) {
    int i;
    while ((i = fr.read()) != -1) {
        System.out.print((char) i);
    }
} catch (IOException e) {
    e.printStackTrace();
}

 

2-4. 사용자 정의 예외 만들기

표준 API가 제공하는 예외 클래스가 아닌 사용자가 직접 정의하여 사용하는 예외

  • 사용자 정의 예외는 반드시 java.lang.Exception 클래스를 상속받아 정의해야한다.
  • 사용자 정의 예외는 JVM에서 예외를 발생시켜 주지 않으므로 직접 예외를 생성해야한다.
  • 예외 생성 하기 : throw new 사용자정의예외()

- 입출력 시 사용자 정의 예외처리 예시

class elementException extends Exception {
    public elementException(String a) {
        super(a);
    }
}

public class Test {
    public static int sum() throws elementException {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        if (a<0 || b<0) {
            throw new elementException("음수 값 입력 금지");
        }
        return a+b;
    }

    public static void main(String[] args) {
        try {
            System.out.printf("합 : %d", sum());
            System.out.println("sum 함수 실행 완료");
        } catch (elementException e) {
            System.out.println(e.getMessage());
        }
        System.out.println("try catch 문 실행 완료");
    }

public static void main(String[] args) {
        System.out.printf("합 : %d", sum());
        System.out.println("sum 함수 실행 완료");
}

## 출력 결과
3
-1
Exception in thread "main" elementException: 음수 값 입력 금지
	at Test.sum(Test.java:16)
	at Test.main(Test.java:22)

https://velog.io/@bosl95/%EC%9E%90%EB%B0%94%EC%9D%98-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%EC%98%88%EC%99%B8

 

2-5. 예외 되던지기 (exception re-throwing)

한 메서드에서 발생할 수 있는 예외가 여럿인 경우

몇 개는 try-catch문을 통해서 메서드 내에서 자체적으로 처리하고,

그 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽에서 나눠서 처리되도록 할 수 있다.

 

그리고 단 하나의 예외에 대해서도 예외가 발생한 메서드와 호출한 메서드,

양쪽에서 처리하도록 할 수 있다.

 

이것은 예외를 처리한 후에 인위적으로 다시 발생시키는 방법 통해서 가능한데, 이것을 예외 되던지기(exception re-throwing)라고 한다.

2-6. 연결된 예외 (chained exception)

한 예외가 다른 예외를 발생시킬 수도 있다.

A가 B의 예외를 발생시킨다면, A를 B의 ‘원인 예외(cause exception)’라고 한다.

 

  • 발생한 예외를 그냥 처리하지 않고 서로 연결시키는 이유?

- 여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서이다.

- checked 예외를 unchecked 예외로 바꾸기 위해서이다.

  • 상속을 사용하지 않는 이유?

- 번거로움, 구조적 엉킴, 조상관계 설정 시 어떤 자식에서 예외가 발생했는지 알기 어려움

 

Chapter09. java.lang 패키지와 유용한 클래스


 

1. java.lang 패키지 

 

1-1. java.lang 패키지 특징 (jdk11 기준)

프로그래밍에 가장 기본이 되는 클래스를 포함, import 필요없음

1-2. 유용한 클래스

  • java.lang.Object
  • java.lang.String
  • java.lang.StringBuffer
  • java.lang.StringBuilder
  • java.lang.Math
  • java.lang.wrapper

프로그램에 따라 기본 타입의 데이터를 객체로 취급 해야하는 경우가 있음.

8개의 기본 타입에 해당하는 데이터를 객체로 포장해주는 클래스를 wrapper 클래스라고 한다.

참고

오토박싱(AutoBoxing) - new 키워드를 사용하지 않고 Character 인스턴스 생성 가능

오토언박싱(AutoUnBoxing) - charValue() 메서드 사용없이 인스턴스에 저장된 값을 바로 참조 가능

  • 기본 타입과 래퍼 클래스 간의 다양한 연산 가능
  • 인스턴스에 저장된 값의 동등 여부 판단은 equals 메서드를 사용해야만 함
  • wrapper 클래스도 객체이기 때문에 동등 연산자(==)를 사용하게 되면, 두 인스턴스의 값을 비교하는 것이 아니라 두 인스턴스의 주소값을 비교하게 된다.
integer num = new Integer(17); // 박싱

int n = num.intValue();        // 언박싱

System.out.println(n);

 

Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱

char c = ch;        // char c = ch.charValue();           : 오토언박싱

System.out.println(c);

17

X

 

2. 기타 유용한 클래스 

2-1. 유용한 클래스

  • java.util.Objects
  • java.util.Random
  • java.util.regex
  • java.util.Scanner
  • java.util.StringTokenizer
  • java.math.BigInteger
  • java.math.BigDecimal
  • java.math.MathContext

반응형

'개념' 카테고리의 다른 글

[JAVA의 정석] Chapter11  (1) 2024.09.08
[JAVA의 정석] Chapter10  (0) 2024.09.08
[JAVA의 정석] Chapter07  (2) 2024.09.08
[JAVA의 정석] Chapter06  (2) 2024.09.07
[JAVA의 정석] Chapter04 -05  (5) 2024.09.07