[Java] 강의를 복습하면서...(3)

석연걸·2025년 1월 5일

예외의 종류

  • Checked Exception : 컴파일 시점에 확인되는 예외이며, 반드시 예외 처리를 해줘야 하는 예외
  • Unchecked Exception : 런타임 시점에 확인되는 예외이며, 예외 처리가 반드시 필요하지 않는 예외

컴파일

  • 프로그래밍 언어로 작성한 코드가 컴퓨터가 이해할 수 있는 언어로 변환되는 것

컴파일 에러

  • 대부분 자바 프로그래밍 언어의 규칙을 지키지 않았을 때 발생
  • 해결 방법 : 문법에 맞게 다시 작성한다

런타임 에러

  • 문법적인 오류가 아닌, 프로그램이 실행 도중 맞닥뜨리는 예외

throw & throws (메서드가 위험하다는 것을 미리 예측)

  • 개발자가 직접 예외를 발생시키고 싶을 때 사용하며, throw는 예외 내용을 던져주지 않기 때문에 직접 예외를 만들어서 사용
  • throws : 메서드 이름 뒤에 붙으며, 이 메서드가 어떤 예외사항을 던질 수 있는지 알려주는 예약어
  • throw : 메서드 안에서 실제로 예외 객체를 던질 때 사용하는 예약어이며, 실제로 던지는 예외 객체 하나와 같이 써야함

try ~ catch ~ finally

  • try : try 블럭 내에 있는 로직을 일단 실행을 시도함
  • catch(예외 클래스) : 로직 실행중 예외가 발생하면 catch 블럭 내의 코드가 실행됨
  • finally : 예외 발생 여부와 상관없이 무조건 실행시켜야 하는 코드가 들어감

Throwable Class

  • 시작은 모든 객체의 원형인 Object에서 시작한다.
  • 문제 상황을 뜻하는 Throwable Class가 Object Class를 상속받는다.
  • Throwable Class의 자식으로는 Error와 Exception 클래스가 있다.
  • Error와 Exception 클래스는 각각 IOError(입출력 에러) 클래스, RuntimeException 클래스와 같이 구분해 처리된다.
  • RuntimeException을 상속받은 예외는 UnCheckedException, 상속받지 않은 예외는 CheckedException 으로 구현돼있다.


Chained Exception (연결된 예외)

  • 연결하는 이유 : 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
  • initCause() : 지정한 예외를 원인 예외로 등록하는 메서드
  • getCause() : 연결 예외를 반환하는 메서드

Generic

  • 효용 : 중복되거나 필요 없는 코드를 줄여주면서도 타입 안정성을 해치지 않음

  • 문법 : public class 클래스명 { ... }

  • static을 사용할 수 없으며(Type 변수는 인스턴스 변수로 간주되기 때문), 제네릭 배열을 생성 할 수 없다.

    • 예시
      public class Generic<T> {	
      	private T t;	 // 변수명 T는 Type 변수
      	
      	public T get() {
      		return this.t;
      	}
      
      	public void set(T t) {
      		this.t = t;
      	}
      
        	public static void main(String[] args) {
            // 타입 변수를 String으로 사용
      		Generic<String> stringGeneric = new Generic<>();
      
              stringGeneric.set("Hello World");
      	}
      }
  • 다수의 타입 변수를 사용할 수 있다.

    • 예시
    public class Generic<T, U, E> {
       public E multiTypeMethod(T t, U u) { ... }
    }
    
       Generic<Long, Integer, String> instance = new Generic();
       instance.multiTypeMethod(longVal, intVal);
  • 상속과 타입의 관계는 그대로 적용됨

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

    • <? extends T> : T와 그 자식들만 사용 가능
    • <? super T> : T와 그 부모들만 가능
    • <?> : 제한 없음
    • 예시
      public class ParkingLot<T extends Car> { ... } // Car 클래스를 상속한 클래스만 사용가능
      
       ParkingLot<BMW> bmwParkingLot = new ParkingLot();
       ParkingLot<Iphone> iphoneParkingLot = new ParkingLog(); // error!

0개의 댓글