테마
Java 추상 클래스·인터페이스·예외
추상 클래스(abstract class)와 인터페이스(interface)는 "무엇을 해야 하는지"만 정하고 구현은 자식에게 맡기는 장치다. 예외 처리(exception handling)는 실행 중 문제가 생겼을 때 프로그램이 바로 멈추지 않고 대응하게 하는 문법이다. 시험은 try·catch·finally가 어떤 순서로 실행되는지와 상황에 맞는 예외 클래스 이름을 자주 묻는다.
추상 클래스와 인터페이스
추상 메서드(abstract method)는 본문 없이 선언만 있는 메서드다. 이런 메서드를 하나라도 가진 클래스는 abstract를 붙여야 하고, 직접 new로 객체를 만들 수 없다. 자식 클래스가 추상 메서드를 모두 구현해야 비로소 객체를 만들 수 있다. 공통 코드는 부모에 두고, 달라지는 부분만 자식에게 강제할 때 쓴다.
인터페이스는 클래스가 지켜야 할 메서드 목록이다. 클래스는 implements로 인터페이스를 구현한다. 클래스 상속(extends)은 하나만 되지만 인터페이스는 여러 개를 동시에 구현할 수 있어, 서로 관련 없는 클래스에 같은 기능을 약속시킬 때 알맞다.
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 키워드 | abstract class, extends | interface, implements |
| 다중 상속 | 불가 | 여러 개 구현 가능 |
| 필드 | 일반 필드 가능 | 상수만(public static final) |
| 객체 생성 | 불가 | 불가 |
인터페이스의 메서드는 따로 적지 않아도 public abstract다. Java 8부터는 기존 구현 클래스를 건드리지 않고 기능을 추가할 수 있도록, 본문이 있는 default·static 메서드도 둘 수 있다.
try·catch·finally
예외(exception)가 try 블록에서 생기면 그 뒤 코드는 건너뛰고 형이 맞는 첫 catch 블록으로 간다. finally 블록은 예외가 났든 안 났든, 심지어 try나 catch 안에서 return을 만나도 빠져나가기 직전에 반드시 실행된다. 파일 닫기처럼 꼭 해야 하는 정리 작업을 여기에 둔다.
java
static int run(int d) {
try { System.out.print("T"); return 10 / d; }
catch (ArithmeticException e) { System.out.print("C"); return -1; }
finally { System.out.print("F"); }
}
// run(2) → TF, 반환 5 / run(0) → TCF, 반환 -1catch는 위에서부터 검사하므로 Exception 같은 상위 예외를 먼저 두면 아래의 구체적인 catch에 닿을 수 없어 컴파일 오류가 난다. 구체적인 예외를 위에, 넓은 예외를 아래에 둔다.
주요 예외 클래스
| 예외 | 원인 |
|---|---|
| ArithmeticException | 정수를 0으로 나눔 |
| ArrayIndexOutOfBoundsException | 배열 범위 밖 인덱스 |
| NullPointerException | null 참조의 멤버 사용 |
| NumberFormatException | 숫자로 못 바꾸는 문자열 변환 |
| NegativeArraySizeException | 음수 크기 배열 생성 |
| IllegalArgumentException | 메서드에 잘못된 인자를 넘김 |
| ClassNotFoundException | 클래스를 찾지 못함 |
| NoSuchMethodException | 메서드를 찾지 못함 |
| FileNotFoundException | 파일을 찾지 못함 |
| InterruptedIOException | 입출력 작업이 중단됨 |
NumberFormatException은 IllegalArgumentException의 자식 클래스라, 둘 다 catch에 적으면 NumberFormatException을 위에 둬야 한다. 실수형 나눗셈 5.0 / 0은 예외가 아니라 Infinity가 된다는 점도 함정으로 나온다.
시험 포인트
- 예외 발생: try(발생 지점까지) → catch → finally. 예외 없음: try → finally.
- finally는 return이 있어도 실행된다.
- 추상 클래스·인터페이스는
new로 직접 만들 수 없다. 인터페이스는 다중 구현 가능. - 0으로 나눔 → ArithmeticException, 배열 범위 밖 → ArrayIndexOutOfBoundsException.
