기타/개발일기

[TIL] 예외처리, 제네릭

hu6r1s 2024. 1. 3. 19:30

예외처리

  • 확인된 예외처리 (Checked Exception)
    • 컴파일 시점에 확인하는 예외.
    • 반드시 예외 처리를 해줘야하는 예외.
  • 미확인된 예외 (Unchecked Exception)
    • 런타임 시점에 확인되는 예외.
    • 예외 처리가 반드시 필요하지 않은 예외.

예외 정의

class OurBadException extends Exception {
	public OurBadException() {
		super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
	}
}

super를 통해 Exception 클래스에 해당 문자열을 넘겨준다.

throws throw
메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어. 메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어.
여러 종류의 예외사항을 적을 수 있다. 실제로 던지는 예외 객체 하나와 같이 써야 한다.
  일반 메서드의 return 키워드처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 메서드가 종료된다.

try ~ catch ~ finally

public class StudyException {
    public static void main(String[] args) {
        OurClass ourClass = new OurClass();

        try {
            // 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
            // "시도" 해보는 코드가 들어가는 블럭입니다.
            ourClass.thisMethodIsDangerous();
        } catch (OurBadException e) {
            // 2. 예외가 발생하면, "잡아서" handling 합니다.
            // 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
						// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
						// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
						// 여기 있는 catch 블럭 내의 코드가 실행됩니다.
            System.out.println(e.getMessage());
        } finally {
            // 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
            // 무조건 실행되는 코드가 들어가는 블럭입니다.
            System.out.println("우리는 방금 예외를 handling 했습니다!");
        }

    }
}
  • `try` - `catch` 는 각각 중괄호{} 를 통해 실행할 코드들을 담는다.
  • `try` 단어의 “시도한다” 라는 뜻에 맞게 의 중괄호{} 안에는 예외가 발생할 수 있지만 실행을 시도할 코드를 담는다.
  • `catch` 단어의 `“잡는다”`라는 의미에 맞게 중괄호{} 안에는 try 안에있는 코드를 실행하다가 예외가 났을때 실행할 코드를 담는다.
    • catch 는 소괄호() 를 통해 어떤 예외클래스를 받아서 처리할지 정의해주어야 한다.
    • catch 로 모든 예외를 다 받고 싶으면 Exception 을 넣어주면 된다.
    • catch 로 일부 예외만 받아서 처리하고 싶으면 해당 예외 클래스명을 넣어주면 된다.
    • 1개의 try 문에 catch 문은 여러개 사용할 수 있다. ex) 1try : 4catch
  • 기존 `try - catch` 의 맨 마지막에 `finally` 를 붙여서 마지막에 반드시 실행할 코드를 넣을 수 있다.

제네릭

  • 첫 번째로 제네릭의 효용은 타입 언어에서 “중복되거나 필요없는 코드를 줄여주는 것”.
  • 두 번째 제네릭의 효용은 그러면서도 타입 안정성을 해치지 않는 것
// 1.
public class Generic<T> {
		// 2.
    private T t;
    // 3.
    public T get() {
        return this.t;
    }

    public void set(T t) {
        this.t = t;
    }

    public static void main(String[] args) {
				// 4.
        Generic<String> stringGeneric = new Generic<>();
				// 5.
        stringGeneric.set("Hello World");
				
        String tValueTurnOutWithString = stringGeneric.get();

        System.out.println(tValueTurnOutWithString);
    }
}

이렇게 하면 `T`는 String이 되어 타입을 정할 수 있다.