오늘은 추상과 예외 처리를 공부할 예정이다.
예외 처리까지 2주가 걸리다니..
엄청 빠른 진도다.
요즘도 여전히 좋은 생활을 유지하고 있다.
오늘은 끝나고 바로 집에 간 다음 빨래도 하고 방도 좀 치우고 조깅을 하며 하루를 마무리할 생각이다.
물론 방통대 강의는 자기 전에 계속 듣고 있고 오늘도 들을 생각이다!
사실 너무 빨리 들어서 3월 중에 모두 다 들어버릴 것 같다.
추상 메서드
- 몸체가 없는 메서드
- 추상 메서드의 선언부에 abstract 키워드 사용
- 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메서드
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
public abstract void ex1();
추상 클래스
- 몸체가 없는 메서드를 포함한 클래스(미완성 설게도)
- 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
[접근제한자] abstract class 클래스명 {}
public abstract class Class1() { ex1(); }
- 추상 메서드가 없어도 추상 클래스 선언 가능하다는 것은
완성된 클래스이지만 객체로 만들지 못하게 하겠다는 뜻
인터페이스
- 경계면, 접점, 공유 영역이라는 뜻
- 상수형 필드와 추상 메서드만을 작성할 수 있는 추상 클래스의 변형체
메서드의 통일성을 부여하기 위해 추상 메서드만 따로 모아놓은 것으로
상속 시 인터페이스 내에 정의된 모든 추상 메서드를 구현해야 함- 껍데기만 만들어놓은 개념으로 비유
[접근제한자] interface 인터페이스명 { public static final 자료형 변수명 = 초기값; [public abstract] 반환자료형 메소드명([자료형 매개변수]); }
추상클래스와 인터페이스
- 인터페이스의 특징:
1) 모든 인터페이스의 메서드는 묵시적으로 추상 메서드(public abstract)(static, (default) 메서드는 예외)
2) 변수는 묵시적으로 상수형 필드(public static final)로 고정
3) 객체 생성은 안되나 참조형 변수로는 가능(다형성)
4) 다중 상속 가능- 인터페이스의 장점:
다형성을 이용하여 상위 타입 역할(자식 객체 연결)
인터페이스 구현 객체에 공통된 기능 구현 강제화 (== 구현 객체간의 일관성 제공)
공동 작업을 위한 인터페이스 제공public class LSJCalculator implements Calcalator, Academy { // 다중 상속 @Override public int plus(int a, int b) { return a + b; } @Override public void lesson() { System.out.println("학원에서 강의를 듣습니다"); } }
프로그램 오류
- 프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것(프로그램 에러)
- 1) 컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러, 코드 수정으로 해결(오타)
2) 런타임 에러 : 프로그램 실행 중 발생하는 에러, 주로 if문 사용으로 에러 처리
3) 시스템 에러 : 컴퓨터 오작동으로 인한 에러, 코드 수정으로 해결 불가- 예외(exception): 해결 가능한 문제(예외 처리로 해결 가능)
- 에러(error): 해결 불가능한 문제
- 에외 확인하기:
Java API Document에서 해당 클래스에 대한 생성자나 메서드를 검색하면
그 메서드가 어떤 Exception을 발생시킬 가능성이 있는지 확인 가능public void ex1() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("입력: "); String input = br.readLine(); // 예외가 발생할 가능성이 있기 때문에 예외 처리하라고 경고 }
예외 클래스
- 프로그램 실행 중 예외 상황이 발생하면
해당 상황과 일치하는 예외 클래스를 찾은 후 객체로 만들어 문제가 발생한 위치로 던진다.- Class Exception:
모든 예외의 최상위 부모 클래스
- 1) Unchecked Exception:
컴파일 단계에서 예외가 발생할 가능성이 있는지 확인하지 않는 예외
2) Checked Exception:
컴파일 단계에서 예외가 발생할 가능성이 있는지 반드시 확인해야 하는 예외- RuntimeException:
모두 if문으로 해결 가능한 예외로 심각한 오류가 아니기 때문에 따로 컴파일 에러가 발생하지 않는다.
(Unchecked Exception)System.out.println(5/0);
int[] arr = new int[3]; System.out.println(arr[100]);
String s = null; System.out.println(s.equals("Unchecked"));
예외 처리 방법
- 1) try ~ catch ~ finally
- catch문은 여러 개 작성 가능하다.
- 상위 타입 예외를 매개변수로 작성해도 하위 타입 예외를 모두 처리(다형성의 업 캐스팅 적용)
다만 상위 타입을 처리하는 catch문을 하위 타입을 처리하는 catch문보다 먼저 쓰면 오류 발생public void ex1() { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("입력: "); String input = br.readLine(); throw new IOException(); // 예외 강제 발생 }catch(IOException e) { // catch 매개변수에는 던져진 예외 객체를 // 저장할 수 있는 참조변수 작성 System.out.println("키보드 문제로 입력 문제 발생"); } System.out.println("프로그램 종료"); }
public void ex2() { Scanner sc = new Scanner(System.in); try { System.out.print("입력 1: "); int num1 = sc.nextInt(); System.out.print("입력 2: "); int num2 = sc.nextInt(); System.out.printf("%d / %d = %d \n", num1, num2, (num1/num2)); }catch(ArithmeticException e) { System.out.println("0으로 나눌 수 없습니다"); }catch(Exception e) { System.out.println("입력이 잘못되었습니다"); }finally { System.out.println("프로그램 종료"); } }
- 2) throws
- 다중으로 던지기 가능
- throw는 예외 강제 발생임에 주의
- printStackTrace(): 예외 경로 추적
- getMessage(): 예외 내용만 출력
public void ex3() throws { System.out.println("ex4() 실행"); try { methodA(); }catch(IOException e) { e.printStackTrace(); } public void methodA() throws IOException { System.out.println("methodA() 실행"); methodB(); } public void methodB() throws IOException { System.out.println("methodB() 실행"); methodC(); } public void methodC() throws IOException { System.out.println("methodC() 실행"); throw new IOException(); } }
예외와 오버라이딩
- 자식 클래스는 부모 클래스보다 더 넓은 범위의 예외를 기술할 수 없음
사용자 정의 예외
- 자바에서 제공하지 않는 예외 상황이 있을 경우
이를 처리하기 위한 예외 클래스를 사용자가 직접 작성하는 것- 이미 존재하는 자바의 Exception 클래스 중 하나를 상속받으면 된다.
(관련성 있는 예외가 있으면 해당 예외 클래스, 없으면 Exception 또는 RuntimeException을 상속)