NOW OR NEVER

[JAVA] 예외 처리 & Collection 본문

Back-End/JAVA

[JAVA] 예외 처리 & Collection

LAURA 2022. 4. 8. 13:51
반응형

예외 처리

  • 예외: 프로그램 실행 중에 사용자의 부주의 등으로 인하여 예기치 않는 상황이 발생하는 것
  • 예외 처리: 위에서 설명한 예외를 처리하는 것
  • 자바에서는 대부분의 발생할 수 있는 예외에 대하여 이미 클래스로 만들어져 있다. 그 상황이 되면 자동으로 new ArrayIndexOutOfBoundsException()으로 예외객체가 생성된다.
  • 자바에서는 대부분의 예외에 대하여 이미 클래스로 만들어져 있고 그 상황이 되면 자동으로 예외 객체가 생성된다.
  • 예외가 발생할 만한 코드를 그대로 두게 되면 사용자로부터 신뢰를 잃게 된다.
  • 모든 예외 중에 제일 조상은 Exception 이다.
    • ArrayIndexOutOfBoundsException 과 NumberFormatException은 is a 관계
    • 세분화 하지 않아도 된다면 Exception 클래스 하나만으로도 처리할 수 있다.
      • 모든 exception의 결과를 받아 하나로 처리할 수 있다.

1. try catch

  try{
      예외가 발생할 만한 명령어(들)
  } catch(예외클래스명1 변수명){
      예외가 발생되었을 때 처리할 명령어(들)
  } catch(예외클래스명2 변수명){
      예외가 발생되었을 때 처리할 명령어(들)
  }
  • 하나의 try문에 대한 여러 개의 catch문이 올 수 있다.
    • 반드시 범위가 작은 순서대로 와야 한다.

2. finally

  • 예외가 발생하거나 예외가 발생하지 않거나 반드시 동작시켜야 할 명령어들을 두는 곳
  • catch 맨 뒤에 작성

3. method 안에서의 예외 처리

  • java.io, java.net, java.sql 등 대부분의 생성자와 메소드들은 예외릂 포함하고 있어 예외처리를 해야 한다.

  • 어떤 메소드에서 예외가 발생할 때에 그 메소드 안에서 예외 처리를 하지 않고 메소드 호출하는 쪽으로 예외를 전파하고자 할 때에 메소드이름 뒤에 throws 예외클래스명을 써서 전달한다.

method 안에서 직접 try catch로 처리

        public void 메소드이름(매개변수) {
            try {
                 예외가 발생할 만한 명령어들
            } catch (예외 클래스명 변수) {
                예외 발생 시 실행할 명령어
            }

        }
        public static void main(String[] args) {
            메소드();

        }

method가 호출되는 곳으로 예외 처리를 맡기기(전파한다)


      public void 메소드이름(매개변수) throws 예외클래스명1, 예외클래스명2{
          예외가 발생할 만한 명령어들


      }

      public static void main(String[] args) {
          try {
              메소드();
          } catch (예외 클래스명 변수) {
              예외 발생 시 실행할 명령어
          }

      }
  • method 옆에 throws 작성, 그리고서 그 method 사용하는 곳 가서 try catch 작성
  • throw로 여러 개의 예외클래스명 작성 가능
  • 대체로 예외처리를 메소드 안에서 직접하게 되면 코드가 뚱뚱해지므로 메소드가 호출되는 곳으로 예외 처리를 맡기는 것이 낫다.

4. RunTimeException

  • 후손: ArithmeticException, InputMismatchException,NumberFormatException, ArrayIndexOutOfBoundsException 등

  • RunTimeException 및 후손들은 사용자가 특별히 예외처리를 하지 않아도 컴파일이 가능하고 자바가 예외처리를 해준다(빨간색 글자로) 또한 필요하다면 사용자가 직접 예외 처리를 할 수 있다.

  • 후손이 아닌 경우는 사용자가 직접 예외 처리를 해야 한다. 만약 사용자가 예외처리(생성자를 사용하는 쪽에서)를 하지 않으면 컴파일이 되지 않는다. ex)MalformedURLException, IOException 등

  • FileWriter의 생성자는 다음과 같이 예외를 포함하고 있다.

    • FileWriter객체.write(파일 내 작성할 내용); : 작성 내용 포함한 파일 생성,

    • FileWriter객체.close(); : 파일 생성 완료

    • public FileWriter(String fileName) throws IOException

    • IOException은 RunTimeException의 후손이 아니기 때문에 사용자가 반드시 예외 처리를 해야 컴파일이 된다.

        try {
                FileWriter fw = new FileWriter("c:/temp/hello.txt");
      
        } catch (IOException e /*or Exception e*/) {
            System.out.println("예외가 발생되었습니다." +e.getMessage() );
        }

5. throw

  • throw new 예외클래스이름();
  • 사용자가 강제로 예외를 발생시켜야 할 필요가 있다면 throw 키워드를 사용한다,
  • throws와 throw의 차이점
    • throws : 메소드 안에서 예외가 발생이 될때 메소드 호출하는 쪽으로 예외 전파
    • throw: 강제로 예외 발생

6. 사용자 정의 예외

  class 예외클래스이름 extends Exception {
      public 예외클래스이름(String msg) {
          super(msg);
      }
  }
  • 흔한 예외는 만들어져있지만 시스템 내에서 특별한 경우의 예외는 자바는 모른다. 그래서 그 경우를 정의하고자 강제로 예외를 발생 시킬 수 있다.
  • 대부분의 일반적인 예외에 대해서는 자바가 이미 클래스로 만들어 두었지만 내가 만드는 시스템에서의 특별한 예외에 대해서는 자바가 모른다. 그럴 때에 사용자가 예외 클래스를 만들 수 있고 그런 상황이 되어도 자바는 모르기 때문에 직접 예외객체를 생성해야 한다.
  • 예외클래스명은 의미있는 이름으로 설정한다.
  • 강제로 예외 발생은 throw를 이용하여 다른 예외와 동일하게 발생시킨다.
  • 사용자 정의 예외는 RunTimeException의 후손이 아니기 때문에 반드시 예외 처리를 해야 한다.

Java의 Collection

  • 많은 양의 데이터를 처리하기위해서는 "배열"을 이용한다. 배열의 단점을 보완하기 위하여 자바에서 더 좋은 배열을 제공한다. 그것을 "컬렉션"이라고 부른다

    • 배열의 단점
      • 배열은 자료형이 같아야 한다.
      • 배열의 크기가 고정되어 있어 처음 정해진 크기가 더 많은 데이터를 저장하기 어렵다.
      • 데이터의 추가, 삭제가 빈번한 경우 처리하기 어렵다.
  • 컬렉션에 자료 형이 다른 것도 담을 수 있다.

  • 컬렉션은 동적인 배열로써 자료의 추가, 삭제하기가 용이하다.

  • 데이터를 담는 것만큼 혹은 데이터를 삭제하는 것 만큼 크기가 줄어들거나 늘어난다.

    종류

  • java,util 클래스에 인터페이스로 존재

  • Set

    • 중복된 자료 허용 x
    • 객체.add : 데이터 담는 메소드
    • 종류
      • HashSet : 순서 무시
      • LinkedHashSet : 순서 유지
      • TreeSet : 사전 식으로 정렬, 일이 가장 많은 set으로 꼭 정렬이 필요한 경우에만 사용하는 것이 좋음
  • List

    • 중복된 자료 허용

    • 예전에는 Vector을 많이 사용하였으나 최근에는 ArrayList를 가장 많이 사용한다

    • 메소드

      • 객체.get(index) : 해당 리스트의 인덱스 위치한 인자 가져옴
      • 객체.remove : 해당 리스트의 인덱스 위치한 인자 지움
      • 객체.add(index, 추가할 인자) : 해당 리스트의 인덱스에 해당 인자 추가됨
    • 종류

      • ArrayList

        • 중복을 허용하며 순서 유지
        • 동작 방식 : 기차 처럼 연결되어 있다. 칸에 하나씩 들어가 있는 꼴이다. 내부적으로는 배열처럼 동작한다. 추가할 데이터가 천 개가 있다면 천 개만큼 루프(반복문)가 돌아야 한다.
      • LinkedList

        • ArrayList와 사용법이 동일하다.
        • 데이터 구조가 연속된 메모리가 아니다.
        • 메모리의 주소를 가리키는 방식
      • ArrayList와 LinkedList 차이 : 사용하는 방법은 둘다 동일하지만 내부적으로 동작하는 것이 다르다. 자료의 중간에 추가 삭제가 빈번할 경우에는 LinkedList가 더 용이하다.(효율성이 좋다)

  • Map
    • 데이터에 접근하기 위해서 인덱스가 아닌 key에 의해서 접근하는 방식이다.
    • key와 value가 한 쌍으로 이루어지는 자료 구조
    • 인덱스보다 키로 접근하는 것이 더 직관적일 수 있다. 이러한 키로 자료구조를 만드는 자료형이 map이다.
    • key의 중복을 허용하지 않는다.
      • 키가 중복이 되고 값 다시 입력시 원래 있던 키를 반환하되 값을 변경한다.
      • 중복된 key에 값을 추가하면 원래의 데이터를 반환하고 value를 새로운 값으로 변경한다.
    • 존재하지 않는 key의 값을 요구하면 null 반환
    • 메소드
      • 객체.put(key,value) : 키와 값 입력
      • 객체,put(key) : 객체에서 해당 키에 해당되는 값 가져옴
    • 종류
      • HashMap: 입력한 순서를 유지하지 않는다.
      • LinkedHashMap: 입력한 순서를 유지한다.
      • TreeMap: key를 기준으로 정렬

Tips

  • 문제 해결은 반복문과 선택문의 조합으로 이루어진다.
  • 버그 : 논리적인 오류
  • eclipse에서 main 메소드의 매개변수인 String[] args 활용해서 콘솔처럼 실행하기
    • Run configurations - Arguments - program arguments
  • unreachable catch : 해당 catch에 도달할 리 없다.
  • 클래스 명 바꾸기 : 바꾸고 싶은 클래스 오른쪽 클릭 - Refactor - rename
  • 에러변수(e).getMessage로 어떤 부분에서 에러가 발생했는지 알 수 있다.
  • unhandled exception : 예외처리가 안되어 있다.
Comments