1.예외처리 (Exception Handling)
프로그램 오류
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것으로 프로그램 에러라고도 한다
오류의 종류
컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러. 소스 코드 수정으로 해결할 수 있다
런타임 에러 : 프로그램 실행 중 발생하는 에러. 주로 if문의 사용으로 처리 가능하다
시스템 에러 : 컴퓨터 오작동으로 인한 에러. 소스코드의 수정으로는 해결이 불가능하다
코드의 수정으로 해결이 가능한 에러를 예외(Exception)이라고 하는데 그러한 예외 상황을 예측하여 구문으로 처리할 수 있다.
예외 클래스 계층 구조
Exception과 Error 클래스 모두 Object 클래스의 자손이며 모든 예외의 최고 조상은 Exception클래스며 반드시 예외 처리해야 하는 Checked Exception과 예외 처리를 하지 않아도 되는 Unchecked Exception으로 나뉜다
Unchecked Exception
RuntimeException 클래스 : 주로 프로그래머의 부주의로 인한 오류인 경우가 많기 때문에 예외처리보다는 코드를 수정해야 하는 경우가 많다
예외 처리 방법
Exception이 발생한 곳에서 직접 처리
try~catch문 :
try { 예외가 발생할 가능성이 있는코드
}catch(예외원인){예외처리할 내용
}finally{예외발생 여부와 상관없이 수행해야하는 코드 작성}
주의사항
-예외를 처리하며 catch문에 부모클래스의 Exception이 먼저 나오게 될 경우 자식 클래스의 Exception은 값을 받을 수 없기 때문에 상위 타입(부모클래스)은 나중에 작성해야한다
-부모클래스 Exception은 다형성 업캐스팅에 의해 자식클래스 Exception을 모두 처리할 수 있기 때문에 부모클래스의 Exception이 먼저 나오게 될 경우 일괄 처리가 가능하다
이때 .printStackTrace(); 를 통해 어디에서 어떤 Exception이 발생했는지 알 수 있다
-메서드선언 시 throws Exception명을 추가하여 호출한 상위 메서드에게 처리를 위임할 수 있다. 계속 위임하면 mani 메서드에게까지 위임하게 되고 main메서드에서 처리를 못하면 프로그램을 비정상 종료한다
throw : 예외를 강제로 발생시키는 구문
throws : 호출한 메서드에게 예외를 위임하는 구문
*오류가 발생한 메서드를 호출하는 상위 메서드에서 오류에 대한 예외처리를 했고 그 오류가 Unchecked Exception이라면 하위 메서드에서 따로 예외처리를 안해도 괜찮다
2.컬렉션(Collection)
제네릭스 : 클래스나 메소드 내부에서 다룰 데이터의 클래스 타입을 지정하거나, 컬렉션이 다룰 클래스 타입을 제한하여 한 가지 종류의 클래스만 저장할 수 있게 한 기능이다.
이때 클래스 타입은 기본형(int, char, double…)은 사용이 불가능하다
제네릭스 사용 이유
컴파일 시 강한 타입 체크 가능, 타입 변환 제거 가능
제네릭스 타입과 표현식
클래스명 <클래스타입> 레퍼런스 = new 생성자 <클래스타입> ();
*제네릭스에 기본자료형을 사용하고 싶을 경우 Wrapper 클래스를 사용하면 된다.
Wrapper 클래스
기본 자료형을 한번 감싸 다른 타입의 자료형인 것 처럼 꾸민 클래스이며 목록은 다음과 같다
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
컬렉션(Collection)
컬렉션이란?
메모리상에서 자료를 구조적으로 처리하는 방법을 자료구조라 하는데 컬렉션은 자바에서 제공하는 자료구조 모음 프레임워크로 여러 데이터를 관리하기 위해 사용한다.
또한 추가, 삭제, 정렬 등의 기능처리가 간단하게 해결되어 자료구조적 알고리즘을 구현할 필요가 없다
자료구조
데이터(자료)를 메모리에서 구조적으로 처리하는 방법론이다.
배열의 문제점과 컬렉션의 장점
컬렉션의 장점
1) 저장하는 크기의 제약이 없다
2) 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다
3) 여러 타입의 데이터가 저장 가능하다
배열의 문제점
1) 한번 크기를 정하면 바꾸지 못한다
2) 배열에 기록된 데이터의 추가, 삭제, 정렬등이 힘들다
3) 한 타입의 데이터만 저장이 가능하다
컬렉션의 주요 인터페이스
Collection 인터페이스 : List, Set의 공통 코드를 작성해둔 부모 인터페이스
Java Collection : 자바의 자료구조 모음(List, Set, Map)
Collection - List 계열 : 순서를 유지하고 중복저장이 가능하다. 배열과 같은 형식을 가진다
배열과 같이 인덱스를 지니고 있어 중복된 데이터의 구분이 가능하다
Collection - Set 계열 : 순서를 유지하지 않고 중복저장이 불가능하다. 한 주머니 안에
마구잡이로 섞인 모양과 같아 중복데이터의 구분이 불가능하여
중복저장이 안된다
Map 계열 : 키와 값이 한쌍으로 저장되며 키는 중복이 안된다. 키 하나당 값이 하나가 저장되
며 키를 통해 객체를 구분하기 때문에 키의 중복은 불가능하지만 값의 중복은 키
를 통해 구분할 수 있기 때문에 가능하다.
List
자료들을 순차적으로 나열한 자료구조로 인덱스로 관리되며, 중복해서 객체 저장이 가능하다
구현 클래스로는 ArrayList와 Vector, LinkedList가 있다.
List 계열 주요 메서드
add(E e) : boolean리턴 주어진 객체를 맨 끝에 추가
add(int index, E element) : void리턴 주어진 인덱스에 객체를 추가
addAll(Collection<>c) : boolean리턴 주어진 Collection타입 객체를 리스트에 추가
set(int index, E element) :
ArrayList
-동기화는 제공하지 않는다(데이터에 다중 접근이 가능)
-검색이 효율적이다(빠르다)
Vector
List의 후손으로 ArrayList와 동등하지만 동기화를 제공한다
LinkedList
List의 후손으로 특정 인덱스에서 객체를 제거하거나 추가하게 되면 앞뒤 링크만 변경하면
되기 때문에 객체의 삭제와 수정이 용이하다
List에서 사용하는 간단한 문법
List.add(a) : List의 맨 끝에 객체 a를 추가하고 성공하면 true를 반환한다
List.add(int i, a) : i번째 인덱스에 객체a 를 대입한다. 반환은 하지 않는다
List.remove(int i) : i번째 인덱스 제거 후 정렬하고 제거전 객체를 반환한다
List.get(int i) : i번째 인덱스 객체를 반환한다
List.set(int i, a) : 객체 a를 i번째 인덱스에 대입하고 대입전 객체를 반환한다
List.isEmpty() : List가 비어있는지 검사하고 비어있다면 true를 반환한다
List.size() : 저장되어 있는 객체수를 리턴한다