일반적으로 에러(error)라고 일컫는 예외는 프로그램 실행 중에 발생되는 의도하지 않은 문
제를 의미한다. 중요한 점은 예외가 발생되면 프로그램은 비정상 종료되고 프로그램이 비정
상 종료된다는 것은 프로그램이 끝까지 수행되지 못하고 중간에 종료됨을 의미하며, 프로그
램을 사용하는 사용자 입장에서는 매우 황당한 느낌을 받을 것이다. 사용자가 하려고 하는
특정기능은 예외발생으로 인해서 실행되지 못했으나 어떠한 문제로 실행되지 못했음을 메시
지를 통하여 알려주고 이후의 작업은 사용자가 선택해서 처리할 수 있도록 하는 추가 작업
이 필요할 것이다. 이와 같이 예외가 발생되었을 때 프로그램을 비정상 종료하지 않고 정상
종료되게 처리하는 것을 예외처리( Exception Handling)라고 한다. 개발자가 할 수 있는 최고의 예외처리는 발생된 예외를 수정하는 것이 아니고 예외가 발생된 이유를 예외 메시지를
통해서 알려주고, 이후의 작업은 계속적으로 실행될 수 있도록 처리하는 것이다.
예외처리란 발생된 예외코드를 다시 수정해서 예외가 발생되지 않도록 처리하는 작업이 아
니고 발생된 예외 때문에 프로그램 자체가 비정상 종료되는 것을 방지하여 정상 종료되게
처리하는 것을 의미한다. 반복문을 제외하고는 한번 수행된 문장을 다시 수행 시킬 수 없기
때문에 실행시킨 예외코드를 수정하는 것은 불가능하다. 예외처리를 위해 자바에서는 예외
클래스 API를 제공하며 필요시 사용자가 예외 클래스를 직접 생성할 수도 있다.
예외클래스의 최상위 클래스는 Throwable 클래스이며 하위로 Error 와 Exception 클래스
가 있다. Error 클래스는 일반 애플리케이션에서 처리가 불가능한 심각한 에러와 관련된 부
분이고 Exception 클래스는 예외 처리가 가능한 부분이다. 심각한 에러의 대표적인 형태가
JVM의 에러 발생이며 JVM 에러가 발생했을 때 일반 어플리케이션에서는 예외처리를 할
수 없다. 따라서 교재에서 학습할 주요 내용은 일반 어플리케이션에서 발생되는 예외를 코
드로 예외처리할 수 있는 Exception 클래스와 관련된 내용이다. 다음은 Exception 클래스의 종류이다.
ArithmeticException : 0으로 나누는 경우에 발생됨. => if문과 같은 조건문으로 먼저 나누는 수가 0인지 체크하면 예외발생 방지가능.
-NullPointerException : null값을 가진 참조변수로 객체 멤버 접근시 발생됨. => 객체를 접근하기 전에 참조변수가 null인지 체크하면 예외발생 방지가능.
-ArrayIndexOutOfBoundsException : 배열의 index범위를 넘어서 참조하는 경우. => 배열의 길이를 먼저 체크하고 참조하면 예외발생 방지가능.
-ClassCastException : 형변환 연산자 사용시 타입이 일치하지 않는 경우 발생됨. => 형변환하기 전에 instanceof 연산자를 사용하여 객체타입확인후 형변환하면 예외발생
방지가능.
예외처리 여부와 상관없이 항상 실행되는 부분
예외가 발생되는 기본단위는 메서드이다. 메서드를 호출하고 호출된 메서드가 실행되면서
예외가 발생 될 수 있다. 예외가 발생된 곳에서 예외처리를 하는 것이 일반적이지만 호출한
곳으로 예외처리를 위임하는 것이 throws 방법이다. 따라서 계속적으로 위임하면 main()
메서드까지 위임하게 되며 최종적으로 main()메서드에서 try~catch로 예외처리를 할 수 있
다. 만약 main() 메서드에서도 try~catch로 예외처리를 하지 않으면 프로그램은 비정상 종
료가 된다. 기본적인 구현방법은 발생된 예외를 호출한 곳으로 넘겨주고 호출한 곳에서
try~catch문을 사용하여 예외처리를 구현하는 것이다
지정자 리턴타입 메서드명( [파라미터] ) throws 예외클래스,예외클래스2 { }
특정 조건이 돼었을 때 명시적으로 강제 발생시키는 것
프로그램에서 예외가 발생되는 경우는 일반적으로 특정 조건에 위배되는 경우이다. 예를 들
어 정수값을 0으로 나누거나 배열에서 인덱스값을 초과하거나 null값을 가진 참조변수가 객
체를 접근하거나 파일에서 데이터를 읽을 때 존재하지 않은 파일을 접근하는 경우가 대표적
이다. 이러한 상황에서는 시스템이 미리 지정한 조건에 위배되기 때문에 자동으로 예외를
발생시키고 적합한 예외클래스를 사용하여 예외처리를 할 수 있도록 지원한다. 하지만 개발
자가 만든 프로그램에서 특정 조건에 맞지 않는 경우를 예외라고 가정할 수 있으며, 이 경
우에는 예외를 명시적으로 발생시켜야 된다. 예를 들어 특정 값이 100보다 작은 경우에 예
외라고 가정할 수도 있는데 시스템에서는 이 상황이 예외가 아니기 때문에 자동으로 예외
발생이 안되기 때문이다. 다음과 같이 조건에 맞으면 명시적으로 예외를 발생시킨다. 발생시킨 예외는 반드시 예외처
리를 해야 비정상 종료를 막을 수 있다.
if(조건) throw new XXXException([인자]);
사용하고자 하는 예외클래스를 객체생성하고 반드시 throw을 이용하여 예외를 강제적으로
발생시킨다. 만약 throw 까지만 하고 예외처리를 하지 않으면 프로그램은 비정상 종료된다. 따라서 발생시킨 곳에서 try~catch 하거나 호출한 곳으로 throws 할 수 있는데, 일반적으
로 호출한 곳으로 throws 하는 방법으로 예외를 처리한다.
< 목차 >
01. 제네릭 (Generic )
02. 컬렉션 ( Collection API )
컴파일 시점에서, 사용하는 데이터형을 체크하기 때문에 프로그램의 안정성을 향상시키거나 데이터 사용시 형변환 코드가 필요하지 않기 때문에 코드 사용도 간편하다는 장점이 있다.
제네릭은 앞으로 배울 컬렉션 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 ) 지정시
디커플링 set 이용한 실습함 09Day7_2 -> 11Day3
순서 있음
중복 저장가능
저장된 위치값 사용 가능
Set 계열보다 훨씬 다양한 기능을 처리하는 메서드가 제공된다. Set에서는 불가능했던 특정 값만 검색하거나 중간에 값을 삽입하거나 특정 값을 수정하는 작업등이 모두 가능하다.