예외처리, 제네릭

금은체리·2023년 10월 17일
1

Java

목록 보기
5/14

예외 vs 오류(에러)

  • 예외: 회복 가능한 문제
  • 오류: 회복 불가한 문제

예외의 종류

  1. 확인된 예외(Checked Exception)
    • 컴파일 시점에 확인하는 예외
    • 필수적 예외 처리
  2. 미확인된 예외(Unchecked Exception)
    • 런타임 시점에 확인되는 예외
    • 선택적 예외 처리

원인 예외를 다루기 위한 Method

  1. initCause(): 지정한 예외를 원인 예외로 등록하는 method
  2. getCause(): 원인 예외를 반환하는 method
// 연결된 예외 
public class main {
    public static void main(String[] args) {
        try {
            NumberFormatException ex = new NumberFormatException("가짜 예외이유"); // 예외 생성
            ex.initCause(new NullPointerException("진짜 예외이유")); // 원인 예외 설정(지정한 예외를 원인 예외로 등록)
            throw ex; // 예외를 직접 던짐
        } catch (NumberFormatException ex) {
            ex.printStackTrace(); // 예외 로그 출력
            ex.getCause().printStackTrace(); // 예외 원인 조회 후 출력
        }
        throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다.")); // checked exception 을 감싸서 unchecked exception 안에 넣음
    }
}
  • 출력
Caused by: java.lang.NullPointerException: 진짜 예외이유

throw vs throws: 예외가 발생하는 위험한 method임을 알림

class OurClass {
    private final Boolean just = true;		
    public void thisMethodIsDangerous() throws OurBadException {
        if (just) {
            throw new OurBadException();
        }
    }
}
  1. throw: 메서드 안에서 사용하는 예약어
    • return처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 method가 종료됨
  2. throws: 메서드 이름 뒤에 붙어 사용하는 예약어

제네릭 문법

public class Generic<T> {
    private T t;
    public T get() {
        return this.t;
    }
    public void set(T t) {
        this.t = t;
    }
    public static void main(String[] args) {
        Generic<String> stringGeneric = new Generic<>();
        stringGeneric.set("Hello World");
        String tValueTurnOutWithString = stringGeneric.get();
        System.out.println(tValueTurnOutWithString);
    }
}
  1. 제네릭 Class: 제네릭을 사용한 Class
    • Generic
  2. 타입 변수: 제네릭에서 <>사이에 들어가는 변수명
    • T

와일드 카드: 제네릭의 제한을 구체적으로 정할 수 있음

public class ParkingLot<T extends Car> { ... }
ParkingLot<BMW> bmwParkingLot = new ParkingLot();
ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!


1. <? extends T> : T와 그 자손들만 사용 가능
2. <? super T> : T와 그 조상들만 가능
3. <?> : 제한 없음


  • 제네릭의 효용
    1. 중복되거나 필요없는 코드를 줄여주는 것
    2. 1번 + 타입 안정성을 해치지 않는 것
  • 오버로딩
    • 메소드명은 동일하나, 매개변수의 타입은 다름
  • 제네릭
    1. 제네릭은 클래스 또는 메서드에 사용 가능
      • <>안에 들어가야 할 타입을 명시
    2. 내부 필드에 지정한 타입
    3. method의 return type도 지정한 타입
  • 제네릭의 제한
    1. 객체의 static 멤버에 사용 불가
      • 타입 변수는 인스턴스 변수로 간주되고, 모든 객체에 동일하게 동작해야하는 static 필드 특성상 사용 불가
    2. 제네릭 배열 생성 불가
  • 제네릭의 문법
    1. 다수의 타입 변수 사용 가능
      • <T, U, E>
    2. 상속과 타입의 관계는 그대로 적용됨
    3. 와일드 카드를 통해 제네릭의 제한을 구체적으로 정할 수 있음
      • <? extends T> : T와 그 자손들만 사용 가능
      • <? super T> : T와 그 조상들만 가능
      • <?> : 제한 없음
profile
전 체리 알러지가 있어요!

0개의 댓글