[Section 1] Collection(2)

Kim·2022년 9월 19일
0

Boot Camp

목록 보기
16/64
post-thumbnail

Collection

예외 처리

개발자는 프로그램을 만들고 실행하는 과정에서 수많은 에러와 마주치게 된다.
어떤 원인에 의해 에러가 발생하게 되면 프로그램은 의도한대로 작동하지 않고 비정상적으로 종료된다.
자바의 예외 처리란 이렇게 예기치 않게 발생하는 에러에 대응할 수 있는 코드를 사전에 작성하여 프로그램의 비정상적인 종료를 방지하고 정상적인 실행 상태를 유지한다.

에러가 발생하는 원인

에러가 발생하는 원인은 다양하지만 크게 내부적인 요인외부적인 요인으로 구분할 수 있다.
외부 요인으로는 하드웨어나 네트워크의 문제, 사용자 조작 오류 등이 있고, 내부 요인으로는 개발자의 코드 작성 오류를 언급할 수 있다.

몇 가지의 오류를 살펴보자.

java: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

FileNotFoundException이란 이름에서 확인할 수 있듯이, 실제 존재하지 않는 파일을 불러오려고 시도할 때 발생한다.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at ErrorTest.main(ErrorTest.java:4)

마찬가지로 ArrayIndexOutOfBoundsException 이란 이름에서 확인할 수 있듯이 배열의 범위를 벗어난 값을 불러오고자 시도할 때 발생한다.

대부분의 경우, 에러가 발생한 경우에 에러 메시지를 확인하면 어렵지 않게 원인을 유추할 수 있다.

컴파일 에러 vs 런타임 에러

컴파일 에러

컴파일 에러는 이름 그대로 컴파일 할 때 발생하는 에러다. 세미클론(;)의 생략이나 오탈자, 잘못된 자료형이나 포맷 등 문법적인 문제를 가리킨다.
자바 컴파일러가 오류를 감지해 사용자에게 알려주기 때문에 상대적으로 쉽게 발견하고 수정할 수 있다.

런타임 에러

런타임 에러 또한 이름에서 손쉽게 유추할 수 있듯이, 코드를 실행하는 과정인 런타임 시에 발생하는 에러를 말한다.

public class RuntimeErrorTest {

    public static void main(String[] args) {
        System.out.println(4 * 4);
        System.out.println(4 / 0); // 예외 발생
    }
}

위의 코드를 실행하면 아래와 같은 예외가 발생한다.

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at RuntimeErrorTest.main(RuntimeErrorTest.java:5)

ArithmeticException 은 특정 숫자를 0으로 나눴을 때 발생하는 예외다.

에러 vs 예외

넓은 의미로 프로그램 실행 시에 발생할 수 있는 문제들을 에러라고 칭했다. 사실은 엄밀한 의미에서 에러(error)예외(exception)로 구분하고 있다.

에러는 복구하기 어려운 수준의 심각한 오류를 말한다. 대표적으로 메모리 부족과 스택오버플로우 등이 있다.

예외는 잘못된 사용이나 코딩으로 인한 상대적으로 미약한 수준의 오류로, 코드 수정 등을 통해서 수습이 가능한 오류를 말한다.

예외 클래스의 상속 계층도


자바에서 예외가 발생하면, 예외 클래스로부터 객체를 생성해 해당 인스턴스를 통해 예외처리를 한다.
자바의 모든 에러와 예외 클래스는 위 이미지에서 확인할 수 있다. Throwable 클래스로부터 확장되며, 모든 예외의 최고 상위 클래스는 Exception 클래스다.
Exception 클래스는 일반 예외 클래스와 실행 예외 클래스로 나눌 수 있다.

일반 예외 클래스 (Exception)

런타임 시 발생하는 RuntimeException 클래스와 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스를 가르킨다. 컴파일러가 코드 실행 전, 예외 처리 코드 여부를 검사하여 checked 예외라고 부르기도 한다.
주로 잘못된 클래스명이나 데이터 형식 등 사용자의 실수로 발생하는 경우가 많다.

실행 예외 클래스 (Runtime Exception)

런타임 시 발생하는 RuntimeException 클래스와 하위 클래스를 지칭한다. 컴파일러가 예외 처리 코드 여부를 검사하지 않아 unchecked 예외라 부르기도 한다.
주로, 개발자의 실수에 의해 발생하는 경우가 많고 자바 문법 요소와 관련이 있다.

try-catch문

자바에서 예외 처리는 try - catch 블럭을 통해 구현이 가능하다.

try {
    //예외가 발생할 가능성이 있는 코드 삽입
} 
catch (ExceptionType1 e1) {
    //ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    //ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    //finally 블럭은 옵셔널
    //예외 발생 여부와 상관없이 항상 실행
}

예외 전가

try - catch문 외에 예외를 호출한 곳으로 다시 떠넘기는 방법도 있다.
이를 위해서는 아래와 같이 메서드 선언부의 끝에 throws 키워드와 발생할 수 있는 예외들을 쉼표로 구분해 나열하면 된다.

반환타입 메서드명 (매개변수, ...) throws 예외클래스1, 예외클래스 2, ... {
    ...
}

예를 들면, 특정 메서드에서 모든 종류의 메서드가 발생할 가능성이 있을 때 아래와 같이 작성할 수 있다.

void ExampleMethod() throws Exception {
}

또한, throws 키워드와 유사한 throw 키워드를 사용하여 의도적으로 예외를 발생시킬 수도 있다.

컬렉션 프레임워크

컬렉션이란 여러 데이터들의 집합을 의미하며, 컬렉션을 다루는데 있어 편리한 메서드들을 미리 정의해놓은 것을 컬렉션 프레임워크라고 한다.
특정 자료 구조에 데이터를 추가하고, 삭제, 수정, 검색 등의 동작을 수행하는 편리한 메서드들을 제공한다.

컬렉션 프레임워크는 주요 인터페이스로 List, Set, Map을 제공한다.

List

데이터의 순서가 유지되며, 중복 저장이 가능한 컬렉션을 구현하는데 사용된다.
ArrayList, Vector, Stack, LinkedList 등이 List 인터페이스를 구현한다.

Set

데이터의 순서가 유지되지 않고 중복 저장이 불가능한 컬렉션을 구현하는데 사용된다.
HashSet, TreeSet 등이 Set 인터페이스를 구현한다.

List와 Set은 공통점이 많아 Collection이란 인터페이스로 묶인다. 이 둘의 공통점이 추출되어 추상화된 것이 바로 Collection 인터페이스다.

Map

key와 value의 쌍으로 데이터를 저장하는 컬렉션을 구현하는데 사용된다.
데이터의 순서가 유지되지 않고, key는 value를 식별하기 위해 사용되므로 중복 저장이 불가능하다. 하지만, value는 중복 저장이 가능하다.
HashMap, HashTable, TreeMap 등이 있다.


참고자료

[Java] ArrayList 값 읽기, 추가, 변경, 삭제하기
[자바] 리스트를 순회하는 방법

[자료구조] List, Map, Set 특징 정리
Class ArrayList<E>
Class TreeSet<E>


이미지 출처

금광캐는광부
장인개발자를 꿈꾸는 :: 기록하는 공간

0개의 댓글