[프래피티]

Checked Exception과 Unchecked Exception

everydeveloper 2024. 5. 17. 13:34

Checked Exception과 Unchecked Exception의 차이는 무엇인가요? 그리고 각각을 처리하는 방법에는 어떤 차이가 있을까요?

Checked Exception은 컴파일러가 강제로 처리하도록 요구하는 예외입니다.

Unchecked Exception은 컴파일러가 강제로 처리하도록 요구하지 않는 예외입니다.

차이점은 처리 방법의 차이가 있는데 Checked Exception 처리 방법에는 try-catch 블록이 있고, Unchecked Exception 처리 방법에는 try-catch 블록으로 처리하지 않아도 되지만, 필요에 따라 예외 처리를 통해 프로그램의 안정성을 높일 수 있습니다.

Checked Exception과 Unchecked Exception은 자바의 예외 처리에서 중요한 역할을 합니다. Checked Exception은 컴파일 타임에 처리 여부를 확인하여 안정성을 높이는 반면, Unchecked Exception은 주로 프로그래밍 오류를 나타내며, 런타임에 처리할 수 있습니다. 각각의 예외를 적절히 처리함으로써 프로그램의 안정성과 가독성을 높일 수 있습니다.

Checked Exception의 대표적인 예시로는 어떤 예외가 있나요? Unchecked Exception은 프로그램 오류를 나타내는데, 어떤 상황에서 이러한 예외가 발생할 수 있을까요?

IOException: 파일 입출력 작업 중 발생할 수 있는 일반적인 예외입니다.

SQLException: 데이터베이스 접근 중 발생할 수 있는 예외입니다.

ClassNotFoundException: 클래스 파일을 찾을 수 없을 때 발생하는 예외입니다.

(예시: 동적으로 클래스를 로드할 때, 해당 클래스가 클래스패스에 없을 경우.)

Unchecked Exception의 발생 상황과 예시

NullPointerException: 객체 참조가 null인데 접근하려고 할 때 발생합니다.

ArrayIndexOutOfBoundsException: 배열의 잘못된 인덱스에 접근할 때 발생합니다.

ArithmeticException: 수학적 계산에서 잘못된 연산이 수행될 때 발생합니다.

IllegalArgumentException: 잘못된 인자를 메서드에 전달할 때 발생합니다.

Unchecked Exception은 주로 프로그램 오류를 나타내는데, 이 외에도 프로세스 실행 중에 발생하는 예외들이 있습니다. 예를 들어, 어떤 경우에 ConcurrentModificationException이 발생할 수 있을까요?

이 예외는 컬렉션이 반복되는 동안 구조가 변경되었을 때 발생합니다.

ConcurrentModificationException 발생 상황

반복 도중 컬렉션 수정:

컬렉션을 반복(iterate)하는 동안 그 컬렉션을 직접 수정하려고 할 때 발생합니다. 예를 들어, ArrayList의 요소를 반복하면서 요소를 추가하거나 제거하는 경우입니다.

기타 구조적 변경:

반복 중에 요소를 추가하는 경우에도 마찬가지로 예외가 발생할 수 있습니다.

ConcurrentModificationException을 피하는 방법

Iterator의 remove 메서드 사용:

반복 중에 요소를 제거해야 할 경우, 컬렉션의 remove 메서드 대신 Iterator의 remove 메서드를 사용합니다.

CopyOnWriteArrayList 사용:

다중 스레드 환경에서 컬렉션을 안전하게 수정하려면 CopyOnWriteArrayList와 같은 스레드 안전 컬렉션을 사용합니다.

CopyOnWriteArrayList는 어떻게 동작하며, 어떤 상황에서 사용하는 것이 좋을까요? 해당 컬렉션은 어떻게 결과를 보장하나요?

CopyOnWriteArrayList의 동작 원리와 사용 상황

CopyOnWriteArrayList는 Java의 동시성 컬렉션 중 하나로, 멀티스레드 환경에서 안전한 리스트 구현체입니다. 이 컬렉션은 쓰기 작업(write operation)이 일어날 때마다 기존 배열의 복사본을 생성하여 새로운 배열에 변경 사항을 적용하는 방식으로 동작합니다. 이러한 구조는 읽기 작업(read operation)이 대부분인 환경에서 특히 유용합니다.

동작 원리

읽기 작업:

CopyOnWriteArrayList의 읽기 작업은 항상 스레드 안전합니다. 리스트를 읽는 동안에도 다른 스레드가 리스트를 수정할 수 있으며, 이 경우 수정된 내용이 반영된 새로운 배열이 생성되기 때문에 읽기 작업에는 영향이 없습니다.

읽기 작업은 원래 배열의 스냅샷을 사용하기 때문에 동기화가 필요 없습니다.

쓰기 작업:

쓰기 작업이 발생할 때마다 새로운 배열을 생성하여 수정된 내용을 적용합니다. 예를 들어, 요소를 추가하거나 제거할 때마다 전체 배열을 복사한 후 새로운 요소를 추가하거나 제거합니다.

이러한 방식은 쓰기 작업이 비싸기 때문에 읽기 작업이 많고 쓰기 작업이 적은 상황에서 적합합니다.

사용 상황

읽기 작업이 많은 경우:

CopyOnWriteArrayList는 읽기 작업이 많고 쓰기 작업이 적은 상황에서 사용하기 적합합니다. 예를 들어, 읽기 작업이 주로 이루어지는 캐시나 설정 데이터 등에서 유용합니다.

동시성 읽기-쓰기 환경:

다중 스레드가 동시에 읽고 쓰는 상황에서도 안전하게 사용할 수 있습니다. 쓰기 작업이 발생할 때마다 새로운 배열이 생성되기 때문에 읽기 작업에는 영향을 미치지 않습니다.

Fail-safe Iterator 필요 시:

CopyOnWriteArrayList는 구조가 변경되더라도 ConcurrentModificationException을 발생시키지 않는 fail-safe 이터레이터를 제공합니다. 이는 반복 중에도 컬렉션을 안전하게 수정할 수 있게 합니다.

'[프래피티]' 카테고리의 다른 글

자바에서 자주 쓰는 자료구조 2  (0) 2024.05.17
자바에서 자주 쓰는 자료구조1  (0) 2024.05.17
자바 어노테이션  (0) 2024.05.17
자바의 예외  (0) 2024.05.17
자바의 ENUM  (0) 2024.05.16