심심한잉여의 잡동사니

JAVA - 예외처리, 제네릭, 컬렉션 본문

코딩일기/Java

JAVA - 예외처리, 제네릭, 컬렉션

심심한잉여 2021. 8. 30. 22:04
반응형

예외처리, 제네릭, 컬렉션


예외처리

프로그램 오류
프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것, 프로그램 에러라고도 함

오류의 종류
1. 컴파일 에러 : 프로그램의 실행을 막는 소스 상의 문법 에러, 소스 구문을 수정하여 해결
2. 런타임 에러 : 입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나, 계산식의 오류 등 주로 if문 사용으로 에러
3. 시스템 에러 : 컴퓨터 오작동으로 인한 에러, 소스구문으로 해결 불가

오류 해결 방법
소스 수정으로 해결 가능한 에러를 예외(Exception)라고 하는데 이러한 예외 상황(예측 가능 에러)은
예외처리를 통해 해결 가능

예외 클래스 계층 구조
Exception과 Error 클래스 모두 Object 클래스의 자손이며
모든 예외의 최고 조상은 Exception 클래스
반드시 예외 처리해야 하는 Checked Exeption과 해주지 않아도 되는 Unchecked Exception으로 나뉨

RuntimeException 클래스
Unchcked Exeption으로 주로 프로그래머의 부주의로 인한 오류인 경우가 많기 때문에 예외 처리보다 코드를 수정해야 하는 경우가 많음.

주로
ArithmeticException
0으로 나누는 경우 발생
if문으로 나누는 수가 0인지 검사

ArrayIndexOutOfBoundsException
배열의 index범위를 넘어서 참조하는 경우
배열명.length를 사용하여 배열의 범위 확인

NegativeArraySizeException
배열 크기를 음수로 지정한 경우 발생
배열 크기를 0보다 크게 지정해야 함

NullPointerException
Null인 참조 변수로 객체 멤버 참조 시도 시 발생
객체 사용 전에 참조 변수가 null인지 확인

ArrayIndexOutOfBoundsExeception
배열의 index범위를 넘어서 참조하는 경우
배열명.length를 사용하여 배열의 범위 확인

ClassCastException
Cast연산자 사용 시 타입 오류
instanceof연산자로 객체타입 확인 후 cast연산


예외처리 방법

1. Exception 처리를 호출한 메소드에게 위임
메소드 선언 시 throws ExceptionName문을 추가하여
호출한 상위 메소드에게 처리 위임 / 계속 위임하면 main()메소드까지 위임하게 되고
거기서도 처리되지 않는 경우 비정상 종료

2. Exception이 발생한 곳에서 직접 처리
try~catch문을 이용하여 예외처리
- try : exception 발생할 가능성이 있는 코드를 안에 기술
- catch : try 구문에서 exception 발생 시 해당하는 exception에 대한 처리 기술 여러개의 exception처리가 가능하나
            exception간의 상속 관계 고려
- finally : exception 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술 중간에 return문을 만나도
            finally구문은 실행되지만 System.exit();를 만나면 무조건 포로그램 종료
            주로 java.io나 java.sql패키지의 메소드 처리 시 이용

 

try~with~resource
자바7에서 추가된 기능으로 finally에서 작성했던 close 처리를 try문에서 자동 close처리

try(BufferedReader br = new BufferdReader(new FileReader("C:/data/text.txt"))){
	String s;
    while((s = br.readLine()) != null)){
    	System.out.println(s);
    }
} catch(FileNotFoundException e) {
		System.out.println("파일이 없습니다.");
}catch(Exception){
	e.printStackTrace(); //어플 출시 시 있으면 안된다함.
}

위 코드와 같이 사용을 하면 된다.


제네릭
내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
jdk 1.5부터 제공되는 기능이다.
클래스와 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 함
타입 파라미터는 코드 작성 시 구체적인 타입으로 대체되어 다양한 코드를 생성하도록 해줌

제네릭 프로그래밍
데이터 형식에 의존하지 않고 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식
즉 외부에서 사용 시 제네릭을 사용하여 타입제한을 걸어두면
컴파일 시 못잡던 에러에 대해 타입제한이라는 정보를 줘서 컴파일 시 잡을 수 있도록 도와주는 것이다.

장점
1. 컴파일 시 제네릭 코드에 대해 강한 타입 체크를 함
  - 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있음
2. 컬렉션, 람다식, 스트림, NIO에서 널리 사용됨
3. 불필요한 타입변환을 제거
 - 제네릭코드로 타입을 지정해 놓으면 해당 타입으로 사용할 때 타입 변환을 하지 않아도 됨

제네릭 타입
타입을 파라미터로 가지는 클래스와 인터페이스 클래스 또는 인터페이스 이름뒤에 <타입> 기호를 추가
타입 파라미터는 변수와 동일한 규칙에 따라 작성 일반적으로 대문자 알파벳 한글자로 표현

 

제네릭 멀티 타입 파라미터
제네릭 타입은 두 개 이상의 멀티 타입 파라미터 사용 가능
각각 타입 파라미터를 콤마로 구분

 

제네릭 메소드
매개타입과 리턴 타입으로 타입 파라미터를 갖는 메소드
리턴 타입 앞에 <타입>기호를 추가

제네릭 제한된 타입 파라미터
타입 파라미터로 지정되는 타입을 제한하기 위한 용도로 사용
타입 파라미터 뒤에 extends 키워드를 붙이고 상위타입을 명시
상위타입은 클래스와 인터페이스도 가능하며 모두 extends 키워드를 사용한다.
타입 파라미터 변수로 상위 타입의 멤버(필드, 메소드)만 사용가능
반대로 하위타입으로 제한할 때에는 super 를 사용

제네렉 와일드카드 타입 파라미터
코드에서 '?'를 사용하면 일반적으로 와일드 카드라 부름
제네릭 타입을 매개변수나 리턴 타입으로 사용할 때 구체적인 타입 대신 와일드카드를 사용 가능

제네릭 타입의 상속과 구현
제네릭 타입의 클래스나 인터페이스를 상속 받을 경우 자식 클래스도 제네릭 타입으로 정의
자식 제네릭 타입은 부모타입 외 추가로 타입 지정 가능

 


컬렉션
메모리상에서 자료를 구조적으로 처리하는 방법을 자료구조라 일컫는데
컬렉션은 자바에서 제공하는 자료구조를 담당하는 프레임워크(API다발)이다.

추가, 삭제, 정렬 등의 기능처리가 간단하게 해결 되어 자료구조적 알고리즘을 구현할 필요 없음

java.util패키지에 포함되며, 인터페이스를 통해 정형화된 방법으로 다양한 컬렉션 클래스 이용 가능

컬렉션은 배열의 문제점을 보완하는 api로서 많이 사용된다.

배열의 문제점을 짚어보면
1. 한 번 크기를 지정하면 변경 불가
 필요에 따라 공간을 늘리거나 줄일 수 없음
 공간 크기가 부족하면 에러가 발생(할당 시 넉넉한 크기로 할당하게되면 메모리 낭비)
2. 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
 추가, 삭제할 데이터부터 마지막 기록된 데이터까지 하나씩 뒤로 밀어내고 추가해야 함(복잡)
3. 한 타입의 데이터만 저장 가능하다.

이를 보완하여 나온것이 컬렉션이며 보완된 것이 무엇인지 장점으로 알아보자.

컬렉션의 장점
1. 저장하는 크기의 제약이 없다.
2. 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다.
 자료를 구조적으로 처리 하는 자료구조가 내장되어 있어 알고리즘 구현이 필요 없음
3. 여러 타입의 데이터가 저장 가능하다.
 객체만 저장할 수 있기 때문에 필요에 따라 기본 자료형을 저장해야 하는 경우 Wrapper클래스 사용

List - 순서를 유지하고 저장, 중복 저장 가능
Set - 순서를 유지하지 않고 저장, 중복저장 불가능
Map - 키와 값을 쌍으로 저장, 키는 중복저장 불가

위 그림으로 각 컬렉션의 특징과 구현가능 클래스에 대해 알 수 있다.


List
자료들을 순차적으로 나열한 자료구조로 인덱스로 관리된다.
중복해서 객체 저장 가능
구현 클래스로 ArrayList와 Vector, LinkedList가 있음

위와 같은 구조이며
List컬렉션을 이용하여 배열에서 값을 지우면 null값이 중간에 오지 않도록 자동으로 빈 공간을 당겨준다.

해당 컬렉션의 주요 메소드 정보들이다.


ArrayList(웹 개발 시 가장 밥먹듯이 사용된다 함)
List의 후손으로 초기 저장용량은 10으로 자동 설정 / 따로 지정 가능
저장 용량을 초과한 객체들이 들어오면 자동으로 증가 / 고정도 가능
동기화 제공하지 않음

*동기화 - 하나의 자원(데이터)에 대해 여러 쓰레드가 접근하려 할 때
             한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것

Vector
List의 후손으로 ArrayList와 동등하지만 동기화를 제공하는 것이 차이점 * 리스트 중 가장 성능이 안좋음

LinkedList
List의 후손으로, 인접 참조를 링크해 체인처럼 관리
특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞 / 뒤 링크만 변경하면 되기 때문에 객체 삭제와 삽입이
빈번하게 일어나는 곳에서는 ArrayList보다 성능이 좋음


Set
저장 순서가 유지되지 않고, 중복 객체도 저장하지 못하게 하는 자료 구조
null도 중복을 허용하지 않기 때문에 1개의 null만 저장
구현 클래스로 HashSet, LinkedHashSet, TreeSet이 있음

HashSet
Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠름
동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않음

LinkedHashSet
HashSet과 거의 동일하지만
Set에 추가되는 순서를 유지한다는 점이 다름

TreeSet
이진 트리 자료구조의 형태로 데이터를 저장
중복된 데이터의 저장을 허용하지 않음
오름차순 정렬 기준으로 정렬

Enumeration, Iterator, ListIterator
컬렉션에 저장된 요소를 접근하는 데 사용되는 인터페이스

- Enumeration : Iterator의 구버전
- ListIterater : Iterator를 상속받아 양방향 특징

 


Map

HashMap
키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 함,
때문에 키 타입은 hashCode()와 equals()메소드가 재정의되어있는 String타입을 주로 사용

Hashtable
키 객체 만드는 법은 HashMap과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에,
복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드에 안전

Properies
키와 값을 String타입으로 제한한 Map컬렉션
주로 Properties는 프로퍼티 파일을 읽어 들일 때 주로 사용

TreeSet과 TreeMap
검색 기능을 강화시킨 컬렉션으로, 계층 구조를 활용해 이진 트리 자료구조를 구현하여 제공

위 그림과 같이 트리형 계층구조로 검색이 진행되어 빠르게 찾는 것이 가능합니다.

TreeSet
이진 트리를 기반으로 한 Set컬렉션으로,
왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

TreeMap
이진 트리를 기반으로 한 Map 컬렉션으로 키와 값이 저장된 Map.Entry를 저장하고 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성

TreeSet, TreeMap 정렬
오름차순(기본 정렬)
- TreeSet의 객체와 TreeMap의 key는 저장과 동시에 자동으로 오름차순 정렬
- 숫자(Integer, Double)타입일 경우 값으로 정렬
- 문자열(String) 타입일 경우 유니코드로 정렬
- 정렬을 위해 java.lang.Comparable을 구현한 객체 요구
  그러지 않을 경우 ClassCastException 오류 출력
  (Integer, Double, String 모두 Comparable 인터페이스를 통해 오름차순이 구현되어 있음)

내림차순(따로 구현)
- Comparable을 상속 받은 객체인 경우 compareTo()메소드의 오버라이딩 부분을 내림차순으로 변경

 


깃허브(List1) - https://github.com/thyum3891/kh_java_study/commit/9929512f905ffe101bddd680cc12cf1a29da9b9e

 

ArrayList1 · thyum3891/kh_java_study@9929512

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

github.com

깃허브(List2) -https://github.com/thyum3891/kh_java_study/commit/4f7b8f8ee84d1cc7b391ce31a088d3ac19eeef18

 

ArrayList2 · thyum3891/kh_java_study@4f7b8f8

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

github.com


깃허브(Set) -https://github.com/thyum3891/kh_java_study/commit/bc6f31eebaa0679d58cb9a03c0f82ed2d8284c9e

 

Set · thyum3891/kh_java_study@bc6f31e

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

github.com


깃허브(Map) -https://github.com/thyum3891/kh_java_study/commit/7a28ae22baf64e8e0fc1f0c8c392da6cd1c2df69

 

Map · thyum3891/kh_java_study@7a28ae2

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

github.com

 

마치며
드디어 자바의 꽃이라 불리는 컬렉션을 배웠다.
그동안 객체배열 등 많은것들을 해둬서 그런지 큰 어려움은 없었다.
이제 이것을 자연스럽게 쓸 수 있도록 계속 연습을 할 예정이다.

 

반응형

'코딩일기 > Java' 카테고리의 다른 글

JAVA - 향상된 for문이 기존 for문보다 성능이 좋다?  (0) 2021.10.13
Kh 국비 지원 학원 - JDBC (feat.미니프로젝트)  (0) 2021.10.12
JAVA - 기본 API  (0) 2021.08.29
JAVA - 다형성  (0) 2021.08.23
JAVA - OOP 상속  (0) 2021.08.22