Acorn academy 12/11 예외처리와 제네릭, 컬렉션

Bae Seong Jun·2023년 12월 11일

Acorn academy

목록 보기
16/70

예외처리

예외( Exception )

일반적으로 에러(error)라고 일컫는 예외는 프로그램 실행 중에 발생되는 의도하지 않은 문
제를 의미한다. 중요한 점은 예외가 발생되면 프로그램은 비정상 종료되고 프로그램이 비정
상 종료된다는 것은 프로그램이 끝까지 수행되지 못하고 중간에 종료됨을 의미하며, 프로그
램을 사용하는 사용자 입장에서는 매우 황당한 느낌을 받을 것이다. 사용자가 하려고 하는
특정기능은 예외발생으로 인해서 실행되지 못했으나 어떠한 문제로 실행되지 못했음을 메시
지를 통하여 알려주고 이후의 작업은 사용자가 선택해서 처리할 수 있도록 하는 추가 작업
이 필요할 것이다. 이와 같이 예외가 발생되었을 때 프로그램을 비정상 종료하지 않고 정상
종료되게 처리하는 것을 예외처리( Exception Handling)라고 한다.
개발자가 할 수 있는 최고의 예외처리는 발생된 예외를 수정하는 것이 아니고 예외가 발생된 이유를 예외 메시지를
통해서 알려주고, 이후의 작업은 계속적으로 실행될 수 있도록 처리하는 것이다.

예외처리( Exception Handling )

예외처리란 발생된 예외코드를 다시 수정해서 예외가 발생되지 않도록 처리하는 작업이 아
니고 발생된 예외 때문에 프로그램 자체가 비정상 종료되는 것을 방지하여 정상 종료되게
처리하는 것을 의미한다.
반복문을 제외하고는 한번 수행된 문장을 다시 수행 시킬 수 없기
때문에 실행시킨 예외코드를 수정하는 것은 불가능하다. 예외처리를 위해 자바에서는 예외
클래스 API를 제공하며 필요시 사용자가 예외 클래스를 직접 생성할 수도 있다.

예외클래스의 최상위 클래스는 Throwable 클래스이며 하위로 Error 와 Exception 클래스
가 있다. Error 클래스는 일반 애플리케이션에서 처리가 불가능한 심각한 에러와 관련된 부
분이고 Exception 클래스는 예외 처리가 가능한 부분이다. 심각한 에러의 대표적인 형태가
JVM의 에러 발생이며 JVM 에러가 발생했을 때 일반 어플리케이션에서는 예외처리를 할
수 없다. 따라서 교재에서 학습할 주요 내용은 일반 어플리케이션에서 발생되는 예외를 코
드로 예외처리할 수 있는 Exception 클래스와 관련된 내용이다. 다음은 Exception 클래스의 종류이다.

  • compile unchecked Exception 계열
  • 컴파일시에 예외처리 여부를 검사하지 않는 클래스 계열이다.
  • 237 -
  • RuntimeException 클래스 계열에 해당된다. - 컴파일시에 예외처리 여부를 검사하지 않는 이유는 대부분의 발생되는 예외가 개발자의
    부주의한 코드 작업 때문에 발생하기 때문이다. 값을 0으로 나누거나 null값을 가지고 메
    서드를 호출하거나 배열의 크기보다 큰 인덱스값을 이용해서 접근하는 경우등이다. 이런 문제들은 코드를 이용한 검증작업으로 충분히 예외 발생을 미리 방지할 수 있다. 정수값 3을 0이 저장된 value 로 나누기 전에 미리 자바코드를 이용해서 value 변수값을 조건 검사하는 방법으로 예외발생을 제거할 수 있다. 따라서 만약 프로그램 실행중에 RuntimeException 계열의 예외가 발생된다면 코드를 작성한 개발자는 조건 체크하는 방법으로 예외를 해결해야 된다.
ArithmeticException : 0으로 나누는 경우에 발생됨. => if문과 같은 조건문으로 먼저 나누는 수가 0인지 체크하면 예외발생 방지가능.
-NullPointerException : null값을 가진 참조변수로 객체 멤버 접근시 발생됨. => 객체를 접근하기 전에 참조변수가 null인지 체크하면 예외발생 방지가능.
-ArrayIndexOutOfBoundsException : 배열의 index범위를 넘어서 참조하는 경우. => 배열의 길이를 먼저 체크하고 참조하면 예외발생 방지가능.
-ClassCastException : 형변환 연산자 사용시 타입이 일치하지 않는 경우 발생됨. => 형변환하기 전에 instanceof 연산자를 사용하여 객체타입확인후 형변환하면 예외발생 
방지가능.
  • complile checked Exception 계열
  • 컴파일시에 예외처리 여부를 검사하는 클래스 계열이다. 예외처리 코드를 구현하지 않으
    면 컴파일시에 에러가 발생된다. - IOException과 SQLException 클래스들에 해당된다. 자바 I/O 작업 또는 SQL 처리 작업
    을 하기 위해서는 명시적으로 반드시 예외처리를 해야 된다는 의미이다. 즉 RuntimeException 처럼 조건 체크로 예외발생을 해결할 수 없기 때문에 명시적으로 예
    외처리 코드를 설정해서 자바(JVM)에게 처리를 위임하는 것이다. 자바에서는 예외처리를 하기 위해서 예외 클래스와 다음 2가지 방법중 하나를 같이 이용한
    다.
  • try~catch~finally 문 이용한 직접처리
  • throws 키워드 이용한 위임처리

try~catch~finally 문 이용

다중 catch 문

finally 문

예외처리 여부와 상관없이 항상 실행되는 부분

throws 키워드를 이용한 예외처리 위임

예외가 발생되는 기본단위는 메서드이다. 메서드를 호출하고 호출된 메서드가 실행되면서
예외가 발생 될 수 있다. 예외가 발생된 곳에서 예외처리를 하는 것이 일반적이지만 호출한
곳으로 예외처리를 위임하는 것이 throws 방법이다. 따라서 계속적으로 위임하면 main()
메서드까지 위임하게 되며 최종적으로 main()메서드에서 try~catch로 예외처리를 할 수 있
다. 만약 main() 메서드에서도 try~catch로 예외처리를 하지 않으면 프로그램은 비정상 종
료가 된다. 기본적인 구현방법은 발생된 예외를 호출한 곳으로 넘겨주고 호출한 곳에서
try~catch문을 사용하여 예외처리를 구현하는 것이다
지정자 리턴타입 메서드명( [파라미터] ) throws 예외클래스,예외클래스2 { }

  • main에서까지 throw시 jvm에게 위임

throw 이용한 명시적 예외 발생

특정 조건이 돼었을 때 명시적으로 강제 발생시키는 것

프로그램에서 예외가 발생되는 경우는 일반적으로 특정 조건에 위배되는 경우이다. 예를 들
어 정수값을 0으로 나누거나 배열에서 인덱스값을 초과하거나 null값을 가진 참조변수가 객
체를 접근하거나 파일에서 데이터를 읽을 때 존재하지 않은 파일을 접근하는 경우가 대표적
이다. 이러한 상황에서는 시스템이 미리 지정한 조건에 위배되기 때문에 자동으로 예외를
발생시키고 적합한 예외클래스를 사용하여 예외처리를 할 수 있도록 지원한다. 하지만 개발

자가 만든 프로그램에서 특정 조건에 맞지 않는 경우를 예외라고 가정할 수 있으며, 이 경
우에는 예외를 명시적으로 발생시켜야 된다. 예를 들어 특정 값이 100보다 작은 경우에 예
외라고 가정할 수도 있는데 시스템에서는 이 상황이 예외가 아니기 때문에 자동으로 예외
발생이 안되기 때문이다. 다음과 같이 조건에 맞으면 명시적으로 예외를 발생시킨다. 발생시킨 예외는 반드시 예외처
리를 해야 비정상 종료를 막을 수 있다.
if(조건) throw new XXXException([인자]);
사용하고자 하는 예외클래스를 객체생성하고 반드시 throw을 이용하여 예외를 강제적으로
발생시킨다. 만약 throw 까지만 하고 예외처리를 하지 않으면 프로그램은 비정상 종료된다. 따라서 발생시킨 곳에서 try~catch 하거나 호출한 곳으로 throws 할 수 있는데, 일반적으
로 호출한 곳으로 throws 하는 방법으로 예외를 처리한다.

catch에서 throw 한번 더 발생

제네릭과 컬렉션 API


< 목차 >
01. 제네릭 (Generic )
02. 컬렉션 ( Collection API )

  1. Map API

☆☆제네릭 ( Generic )

컴파일 시점에서, 사용하는 데이터형을 체크하기 때문에 프로그램의 안정성을 향상시키거나 데이터 사용시 형변환 코드가 필요하지 않기 때문에 코드 사용도 간편하다는 장점이 있다.
제네릭은 앞으로 배울 컬렉션 API, 람다식등에서 전반적으로 사용되는 개념이기 때문에 매우 중요하다.

상속을 배우면서 다형성이란 개념을 살펴보았는데 Object 배열을 사용하면 자바의
모든 데이터 저장이 가능하게 된다. 하지만 저장된 데이터에서 특정 데이터형만 추출할때는
instanceof 연산자를 사용하여 일치하는 데이터만 추출하도록 코드가 추가 되거나 또는 저
장할 데이터가 미리 정해져 있어도 다형성에 의해서 다른 데이터형이 저장되어도 컴파일 시
점에서는 확인할 수 없고 실행시에 비로소 잘못된 데이터가 저장되었음을 확인할 수 있다.

상속과 다형성을 사용하면 데이터 관리가 매우 쉬운 장점도 있으나 위의 코드처럼
잘못된 데이터가 저장되었다는 것을 인지하는 시점이 컴파일 시점이 아닌 매운 늦은 실행시
점이거나 또는 instanceof 연산자와 형변환을 사용해서 구현해야 하는 큰 불편함이 있는 것
이 사실이다. 이러한 불편한 점을 개선한 것이 제네릭(Generic)이고 클래스 또는 인터페이
스, 메서드의 파라미터, 리턴타입에 사용될 수 있다.

클래스의 제네릭 타입

클래스와 인터페이스에 제네릭이 적용된 타입을 ‘제네릭 타입’ 이라고 부르고 적용하지 않
은 타입을 ‘원시 타입(raw type)’이라고 부른다. 제네릭 타입은 클래스와 인터페이스 이름
뒤에 다음과 같이 <> 사용하여 표현한다.

public class Class_Name<T>{ }
public interface Interface_Name<T>{ }

위에서<T> 라고 쓰인 부분이 타입 파라미터 선언이다. 작성자가 임의로 지정하는 것이기
때문에 반드시 T라고 사용할 필요는 없다. 하지만 일반적으로 다음과 같이 지정하는 것이
관례이다

T 참조 타입 ( Reference Type) 지정시
E 요소 ( Element ) 지정시
K Map계열의 키( Key ) 지정시
V Map계열의 값( Value ) 지정시

  • 제네릭 클래스의 객체 생성시 Generic 사용안하는 경우 Object가 기본타입임

☆☆☆컬렉션 ( Collection API )

set계열의 특징

  1. 데이터가 들어가는 것에 대한 순서가 없음 - 저장 순서대로 저장되지 않음
  2. 중복 저장이 불가능.
  3. index값으로 데이터를 얻어내는데 불가능
  4. 따라서 데이터 정보를 출력할 때는 모든 데이터
    를 출력하는 방법이 최선의 작업으로 일반적으로 foreach 또는 Iterator를 사용할 수 있고
    Iterator는 hasNext()와 next() 메서드를 사용하여 반복 처리한다.

디커플링 set 이용한 실습함 09Day7_2 -> 11Day3

☆☆☆ArrayList 클래스를 이용한 데이터 저장하기

순서 있음
중복 저장가능
저장된 위치값 사용 가능
Set 계열보다 훨씬 다양한 기능을 처리하는 메서드가 제공된다. Set에서는 불가능했던 특정 값만 검색하거나 중간에 값을 삽입하거나 특정 값을 수정하는 작업등이 모두 가능하다.

profile
코딩 프로?

0개의 댓글