[신세계I&C KDT][Java 프로그래밍] #13 예외 처리, 제네릭, 컬렉션 API (0325)

박현아·2024년 3월 25일
0

신세계아이앤씨 KDT

목록 보기
13/42

1. 예외처리 (exception handling)

1) 예외

  • 일반적으로 에러(error) 라고 불리는 것
    _ 예외가 발생되면 프로그램이 '비정상 종료' 된다

2) 예외 처리

  • 예외가 발생됐을 때 프로그램이 '정상 종료' 되도록 처리하는 방법
  • 정상 처리 방법 : 사용자에게 문제 발생 이유를 알려주는 방법도 표현됨 (콘솔 또는 경고창)
    • 사용자가 이해하기 쉽도록 친절하게 알려줘야 된다 (예> 한국어)
  • 문제 발생 코드 이후를 실행해서 main 끝까지 가도록 해야한다

3) 예외 처리 방법

(1) 예외 클래스 제공

						  Object
   		  		  			|
			   			Throwable
   				  			|	
		      Error     		   Exception
      (개발자가 핸들링 불가)				|
     							- RuntimeException      
                        		(런타임 계열, 컴파일 unchecked 계열)
                                - IOException, SQLException
                                (비런타임 계열, 컴파일 checked 계열
- 런타임 계열 (RuntimeException)

: 런타임시 (실행) 발생

  • ArithmeticException (예> 10/0)
  • ClassCastException (클래스 형변환시)
  • NullPointerException (null값을 가진채로 메서드 호출시)
  • ArrayIndexOutOfBoundsException (없는 배열 요소 접근시)
- 비런타임 계열 (IOException, SQLException)

: 컴파일시 발생

  • 반드시 try~catch로 예외 처리를 해야된다
  • FileNotFoundException

(2) 예외 클래스 + try~catch~finally문

  • 예외가 발생된 곳에서 처리
  • 문법
main {
	try {
		실행문1;
   		실행문2;
	} catch (예외클래스 변수) { // 아무 예외클래스가 아닌 적합한 예외클래스 지정, 다형성 가능 (권장 X)
		예외 발생시처리하는 문장;
	} finally {
		반드시 수행해야되는 문장
	}
		문장;
   	 	문장;
}
  • 아무 예외클래스가 아닌 적합한 예외클래스 지정해야됨. 다형성 가능 (권장 X)
  • 가장 마지막 catch문에 Exception을 지정하는 관례가 있다
  • finally
    - 예외가 발생되거나 안되거나 반드시 실행해야되든 문장
    (일반적으로 파일사용 및 DB 연동시 close 작업 처리)
  • e.printStackTrace(); : 예외발생메세지, 예외발생 line, 예외클래스 정보 등 제공함. 개발시 디버깅용으로 사용됨
  • try~finally문 가능 (catch문 없이) : 예외처리 목적이 아닌 반드시 실행해야되는 문장을 알려주는 용도로 사용된다

(3) 예외 클래스 + throws문 (위임 처리)

  • 예외가 발생된 곳이 아닌 다른 곳에서 위임 받아서 처리하는 방법

4) Overriding 관련 throws 처리

  • 부모
public void a() throws ArithmeticException {

}
  • 자식
@Override
public(확대) void a() (축소) {} // 가능
@Override
public(확대) void a() throws ArithmeticException (축소) {} // 가능
@Override
public(확대) void a() throws RuntimeException (축소) {} // 불가능
@Override
public(확대) void a() throws Exception (축소) {} // 불가능
@Override
public(확대) void a() throws IOException (축소) {} // 불가능

5) 런타임 계열의 특징

  • try~catch, throws로 예외 처리 X (실행할 때 예외가 발생되면 안 되는 코드들)
  • 다음 런타임 계열은 조건문으로 처리
    • ArithmeticException
    • ClassCastException
    • NullPointerException
String name = null;
if(name!=null)
System.out.println(name.length()); // if 안 쓰면 NullPointerException 발생

6) 비 런타임 계열의 특징

  • 규칙: 반드시 try~catch 또는 throws 문을 이용해서 예외를 처리해야 된다 ★
    -> 컴파일 에러 발생
    -> 결론은 I/O 작업 또는 DB 연동작업시 무조건 예외처리를 해야 됨!! ★

7) 사용자정의 예외클래스(throw)

  • 명시적으로 예외를 발생시키는 경우 + 사용자정의 예외 클래스
  • 시스템에서는 정상적 코드이지만 문제있는 코드로 정의하고 싶은 경우
    예> Random 클래스에서 랜덤값이 0일 때
  • 문법
if (n == 0) throw new MyException("예외메세지");
  • 사용자정의 예외클래스 작성 방법
public class MyException extends Exception {
	// 문자열을 하나 받는 생성자
    public MyException(String msg) {
		super(msg); // 부모 클래스에 msg 보내주기
    }
}

2. 제네릭 (generics)

1) 개념

다양한 타입을 다루는 메서드 및 클래스에서 컴파일 시점에 타입체크를 해서 예외를 미리 알 수 있도록 지원 가능

2) 장점

  • 저장하고자 하는 데이터형 지정 -> 저장하는 객체 타입의 안정성 확보
  • 형변환의 번거로움이 없다

3) 제네릭스 표현

: 타입 파라미터라고 부른다

- <T> : reference type
- <E> : Element
- <K, V> : Key, Value
- <T, R> : Return Type

4) 특징

  • < T > 같은 제너릭은 컴파일 시점에 실제 지정된 타입으로 치환된다
  • 타입 파라미터는 인스턴스 멤버로 간주 (static 사용불가, 객체생성불가, instanceof 불가)
  • 클래스 및 인터페이스, 메서드 파라미터로 사용 가능

5) 메서드 파라미터 전달시 사용되는 파라미터 타입 표현식

  • method(List<?> xxx) : 제네릭된 모든 데이터타입 전달 가능
  • method(List<? extends Person> xxx) : 제네릭된 Person 또는 person의 자식 데이터타입만 전달 가능
  • method(List<? super Man> xxx) : 제네릭된 Man 또는 Man의 부모 데이터타입만 전달 가능

3. 컬렉션 API

1) 데이터 저장 방법

(1) 변수

(2) 배열

  • 크기 변경 불가
  • 같은 데이터타입만 저장 가능
  • 지원되는 메서드가 없다. (배열명.lenght만 있음)
  • 나중에 Arrays 유틸리티 클래스 API 추가됨
    - List xx = Arrays.asList(값, 값2,...);
    - Arrays.sort();

(3) 컬렉션 API

  • 크기 변경 가능
  • 저장하는 데이터 타입에 제한이 없다 (일반적으로 제네릭으로 타입 제한해서 사용)
  • 지원되는 메서드가 많다
  • 추가된 API가 Collections 유틸리티 클래스

2) 컬렉션 API 종류 (java.util 패키지)

			Collection<E> (인터페이스)				     Map<K,V> (인터페이스)
  					| (상속)							         |
  Set<E> (인터페이스)	  List<E> (인터페이스)			        |
  		| 					  |						    HashMap<K,V> ()
  		| (구현)			     | (구현)
  HashSet<E> ()	   ArrayList<E> ()
  

cf) 데이터 저장 방식에 따른 3가지 종류
1. set 계열
: 저장되는 데이터의 순서가 없음
: 중복 저장이 안 됨
2. list 계열
: 저장되는 데이터의 순서가 있음
: 중복 저장이 가능
3. map 계열
: 데이터뿐만 아니라 데이터의 이름(키)까지 같이 저장됨 (key/value 쌍)
: 저장 순서가 없다
: key를 이용해서 값을 찾는다

3) Collections 유틸리티 API

  • 컬렉션 정렬
    Collections.sort(리스트, Comparator 타입);
  • Comparator 인터페이스
    : Comparator 내의 compare(T t1, T t2) 메서드를 재정의해서 정렬 구현
  • 구현 방법 1 : 익명 클래스
Comparator<Cat> comp = new Comparator<Cat>() {
	@Override
	public int compare(Cat c1, Cat c2) {
		int result = c1.age - c2.age; // 오름차순 정렬
		// int result = c2.age - c1.age; // 내림차순 정렬
		return result; 
	}
};
  • 구현 방법 2 : 람다 ★
Comparator<Cat> comp = (c1, c2) -> c1.age - c2.age; // 오름차순 정렬

0개의 댓글