Posts 객체지향 프로그래밍 - 7(클래스 다이어그램, 예외 처리)
Post
Cancel

객체지향 프로그래밍 - 7(클래스 다이어그램, 예외 처리)

클래스 다이어그램

특징

  • 클래스의 구성요소 및 클래스간의 관계를 묘사하는 다이어그램
  • 시간에 따라 변하지 않는 정적인 시스템 구조를 표현

목적

  • 문제해결을 위한 도메인 구조를 표현하는 것

사용 방법

  • 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보다 조상이다.
    //오버라이딩을 할 때 부모 예외에 속하지 않는 다른 예외는 발생할 수 없도록, 구현하는 내용을 어느정도 제한하는 부븐.
}

Class Diagram Link Handling Exception Link

This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags