클래스 다이어그램
특징
- 클래스의 구성요소 및 클래스간의 관계를 묘사하는 다이어그램
- 시간에 따라 변하지 않는 정적인 시스템 구조를 표현
목적
- 문제해결을 위한 도메인 구조를 표현하는 것
사용 방법
public
: +protected
: #default
: ~private:
-- 따로 주석은 없고 note를 사용한다.
note (bottom, top, left, right) of class
: class의 ( ) 위치에 노트를 추가한다.- 마지막에 end note를 추가한다.
예외 처리(Handling Exception)
오류
- 메모리 부족 또는 프로그램 실행이 꼬이는 경우에 발생한다.
- 더이상 어떻게 프로그램을 복구해야할지 알 수 없을때 발생한다.
- -> 프로그램을 종료시키고, 프로그램의 문제를 해결해야한다.
예외
- 오류에 비해서 심각도가 낮고, 프로그램의 정상적인 흐름만 방해하는 경우
- 파일을 읽으려 했으나, 파일이 없는 경우
- 네트워크 연결 유실
- 문제상황을 처리하는 로직을 구현하여, 런타임에서 자연스럽게 해결할 수 있다.
예외처리
- 예외가 발생했을 경우에 이 상황을 ‘감지’ 하고 ‘처리’ 하는 코드
try ~ catch
,throw
,finally
키워드를 사용한다.- Throwable 클래스를 상속하는 자식 클래스들로 이러한 문제를 해결
- try ~ catch
1
2
3
try {
} catch (Exception e) {
}
- try 부분에 예외가 발생할 수 있는 코드를 작성한다. 예외가 발생할 경우 예외 객체를 catch 부분으로 던진다.
- catch부분에서 던져진 예외를 받는다. Exception 클래스 및 그 자식 클래스를 사용
1
2
3
4
5
6
try{}
int[] integers = new int[10];
integers[20] = 5; // length가 10인 배열에 20번 index로 접근하므로 에러가 발생한다.
} catch(ArrayIndexOutOfBoundsException e){ // catch를 통해 에러를 처리한다.
System.out.println("배열의 크기를 초과했습니다.");
}
- 다중 예외 처리
- 아주아주 예민한 내용이 실행되는 부분
- 특정 catch 구문에 선택되는 조건은 다형성에 의해서 결정된다. 즉, catch하고 있는 클래스와 자식 클래스의 객체면 catch 가능.
- catch를 여러개 만들 경우 순서도 신경써야 한다.
1
2
3
4
5
6
7
try{
} catch (ArithmeticException e){ // 첫 번째 캐치
} catch (FileAlreadyExistsException e) {// 두 번째 캐치
} catch (IOException e){
} catch (Exception e){ // 나머지 모든 Exception을 모두 catch
// Exception은 예외 처리 객체의 조상이다. 모든 에러가 catch되므로 구문을 완벽히 아는 것이 아니면 안쓰는것이 좋다.
}
- try ~ catch ~ finally
- finally 블럭은 catch 발생 여부에 상관없이 실행된다.
1
2
3
4
5
6
7
8
9
try {
int[] integers = new int[20];
integers[21] = 10;
} catch (Exception e){
System.out.println("받았다");
} finally { // catch 발생 여부에 상관없이 실행
System.out.println("마침내!");
// try에서 생성한 리소스를 회수하기 위해 구현하기도 한다.
}
- try ~ with ~ resources
- java 1.7에서 추가된 기능
- AutoClosable 인터페이스를 구현하는 클래스만 사용 가능
- .close()를 사용하지 않아도 된다.
1
2
3
4
5
try(FileInputStream file1 = new FileInputStream("A.txt")){
file1.read();
}catch (IOException e){
System.out.println("파일 처리 실패");
}
예외의 종류
- Check Exception
Exception
클래스를 상속하고 있으면 Checked Exception 이다.- 컴파일러에서 에러가 발생한다.
try ~ catch
를 작성하지 않으면 빌드를 할 수 없다.
- Unchecked Exception
RuntimeException
클래스를 상속하고 있으면 Unchecked Exception이다.- 런탄임에서 에러가 발생한다.
try ~ catch
를 작성하지 않아도 빌드할 수 있다.- 대표적으로
ArrayIndexOutOfBoundsException
,ArithmeticException
이 있다.
예외 처리 위임
- 자신이 직접 예외 처리를 하지 않고, 호출한 메소드에서 예외 처리를 하도록 위임할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class CheckedExceptionThrow{ void methodA() throws IOException{ FileInputStream file1 = new FileInputStream("a.txt"); file1.read(); file1.close(); } void methodB(){ // methodA를 호출한 methodB에서 예외 처리를 한다. try{ methodA(); } catch (IOException e) { System.out.println("메소드A 실패"); } } }
UncheckedException
의 경우throws
를 사용하지 않아도 된다. 자신이 처리를 못하면 알아서 호출한 메소드로 예외 처리를 위임한다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class UncheckedExceptionThrows{ void methodA(){ int x = 10/0; } void methodB(){ methodA(); } public static void main(String[] args) { //호출한 메소드에서 예외 처리를 한다. try { new UncheckedExceptionThrows().methodB(); }catch (ArithmeticException e){ System.out.println(e.getMessage()); } } }
예외 처리한 메소드의 상속
- throws를 한 메소드를 상속하면 throws까지 같이 상속받는다.
- throws한 메소드를 오버라이드 하는 경우 부모 클래스 메소드의 예외의 자식 클래스만 예외할 수 있다.
- 부모 클래스 메소드의 예외보다 더 조상인 예외는 할 수 없다.
- 부모 예외에 속하지 않는 예외는 발생하지 않도록, 구현하는 내용을 제한하는 역할도 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Foo{
void methodA() throws IOException{} // Checked Exception
}
class BarOne extends Foo{
void methodA() {}// throws를 한 메소드를 상속하는 경우 throws 까지 같이 상속받는다.
}
class BarTwo extends Foo{
void methodA() throws FileNotFoundException {} // 부모 클래스 메소드에서 throws 한 클래스의 자식 클래스는 사용할 수 있다.
}
class BarThree extends Foo{
//void methodA() throws Exception{}
// Exception이 IOException보다 조상이다.
//오버라이딩을 할 때 부모 예외에 속하지 않는 다른 예외는 발생할 수 없도록, 구현하는 내용을 어느정도 제한하는 부븐.
}