자바 12일차

김재현·2022년 8월 12일
0

Java

목록 보기
13/15

익명클래스

  • 다른 내부 클래스들과 달리 이름이 없는 클래스.
  • 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고, 오직 하나의 객체만을 생성할 수 있는 일회용 클래스.
new 부모클래스이름(){
 	// 멤버선언
}
new 구현인터페이스이름(){
	// 멤버 선언
}
  • 이름이 없기 때문에 생성자도 가질 수 없고, 부모클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기에 하나의 클래스로 상속받는 동시에 인터페이스르 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.
  • 오로지 단 하나의 인터페이스만 구현할 수 있다.

프로그램 오류

  • 실행 중 이상이 발생할 때가 있는데, 그 원인을 프로그램 에러 또는 오류라고 함.
    발생시점에 따라 '컴파일 에러(compile-time error)'와 '런타임 에러(runtime error)'으로 나눌 수 있다.
  • '컴파일에러'는 컴파일 할 때 발생하는 에러. 프로그램의 실행 도중에 발생하는 에러는 '런타임에러'
  • 외에도 '논리적 에러(logical error)'가 있는데, 컴파일도 잘되고 실행도 잘되지만 의도한 것과 다르게 동작하는 것.

    컴파일 에러 : 컴파일 시 발생하는 에러.
    런타임 에러 : 실행 시 발생하는 에러.
    논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 에러.

  • 소스코드를 컴파일하면 컴파일러가 기본적인 검사를 수행해서 오류 검사.
    컴파일러가 알려준 에러를 모두 수정해 컴파일을 성공적으로 마치면, 클래스파일(.class)가 생성되고, 실행할 수 있다.
  • 컴파일을 성공적으로 마쳤다고해도 프로그램 실행 때 에러가 발생하지 않는 것은 아님. 프로그램 실행 도중 발생할 수 있는 잠재적 에러까지 검사할 수는 없기 때문.
  • 런타임 에러를 방지하기 위해서는 실행 도중 발생 가능한 모든 경우를 대비하는 것이 필요하다. 자바에서는 발생 가능한 프로그램 오류를 '에러(error)'와 '예외(exception)' 두 가지로 구분하였다.

    에러 : 코드에 의해 수습될 수 없는 심각한 오류.
    예 ) 메모리부족, 스택오버플로우 등
    예외 : 코드에 의해 수습 가능한 미약한 오류.

예외 클래스의 계층 구조

  • 실행 시 발생할 수 있는 오류(예외와 에러)를 클래스로 정의했다.
    오류 클래스 역시 Object클래스의 자손이다.
  • 예외 클래스들은 두 그룹으로 나눌 수 있다.
    1. Exception 클래스와 그 자식들
    2. RuntimeException 클래스와 그 자식들

Exception과 RuntimeException

  • Exception클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생.
    예) 존재하지 않는 파일명 입력. 클래스의 이름을 잘못 입력. 입력 데이터 형식의 잘못. 등등
  • RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외.
    예) 배열의 범위를 벗어남. 값이 null인 참조변수 멤버를 호출. 클래스간 형변환 잘못. 등등

예외 처리하기 try-catch문

  • 에러는 어쩔 수 없다해도, 예외는 프로그래머가 처리를 미리 해주어야 한다.
  • 예외처리(exception handling)이란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것.
    목적은 예외의 발생으로 인한 실행 중 프로그램의 갑작스런 비정상 종료를 막고, 정상 실행상태를 유지하는 것.

    예외처리 ( exception handling)
    정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것.
    목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지.
    예외와 에러는 모두 실행 시 (runtime) 발생하는 오류이다.

  • 예외처리 실패 > 비정상 종료 > 처리되지 못한 예외(uncaught exception)는 JVM의 '예외처리기(UncaughtExceptionHandler)'가 받아 화면에 출력.
  • try-catch문의 구조는 아래와 같다.
try{
	// 예외가 발생할 가능성이 있는 문장 삽입.
}catch (Exception e1){
	// Exception1 이 발생했을 경우, 이를 처리하기 위한 문장 삽입.
}catch (Exception2 e2){
	// Exception2 이 발생했을 경우, 이를 처리하기 위한 문장 삽입.
}catch (ExceptionN eN){
	// ExceptionN 이 발생했을 경우, 이를 처리하기 위한 문장 삽입.
}
  • 하나의 try 블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch블럭이 올 수 있으며, 예외와 일치하는 catch블럭만 수행된다.
    일치하는 catch블럭이 없으면 예외는 처리되지 않는다.

    if문과 달리, try블럭이나 catch블럭 내에 포함된 문장이 하나뿐이어도 괄호{} 생략 불가능.

try-catch문의 흐름

  • try-catch문은 예외가 발생한 경우와 그렇지 않을 때 흐름이 달라진다.

    try 블럭 내에서 예외 발생
    1) 발생한 예외와 일치하는 catch블럭 탐색.
    2) 일치하는 catch블럭을 찾으면, 블럭 내의 문장을 수행하고 전체 try-catch문을 빠져나가 그 다음 문장을 계속 수행.
    일치하는 catch블럭 찾지 못하면, 예외는 처리되지 못함.
    try 블럭 내에서 예외 발생하지 않음
    1) catch블럭을 거치지 않고 전체 try-catch문을 빠져나가 수행 속행.

예외의 발생과 catch블럭

  • catch블럭은 ( ){ } 두 부분으로 나뉘어져 있는데, ( )내에는 처리하고자 하는 예외와 같은 타입의 참조변수를 하나 선언해야한다.
  • 예외 발생 > 예외에 해당하는 클래스의 인스턴스 생성 > 예외가 발생한 문장이 try 블럭에 포함돼 있다면, 예외를 처리할 수 있는 catch 블럭 있는지 탐색.
  • 첫번째 catch블럭부터 차례로 내려가며 catch블럭의 ( ) 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연산자를 이용해 검사를 수행하고, 결과가 true인 catch블럭을 만날때까지 검사는 계속됨.
    true인 catch블럭을 찾게 되면 문장을 모두 수행한 후 try-catch문을 빠져나가고 예외는 처리하지만, true인 블럭이 하나도 없다면 예외는 처리되지 않음.
  • 모든 예외 클래스는 Exception 클래스의 자손이므로, catch블럭의 ( )에 Exception 클래스 타입의 참조변수를 선언해놓으면 어떤 예외가 발생하더라도 이 catch블럭에 의해 처리된다.

printStackTrace()와 getMessage()

  • 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 예외에 대한 정보가 담겨 있으며, getMessage()printStackTrace()를 통해 이 정보를 얻을 수 있다.
    catch블럭의 ( )에 선언된 참조변수를 통해 이 인스턴스에 접근할 수 있다. 이 참조변수는 선언된 catch블럭 내에서만 사용할 수 있다.

    printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 화면에 출력.
    getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻음.

  • 위 메서드를 사용해 예외의 발생원인을 알 수 있다.

0개의 댓글