Java - DAY 14

NewTypeAsuka·2023년 2월 22일
0

Java@

목록 보기
15/22

오늘은 추상과 예외 처리를 공부할 예정이다.

예외 처리까지 2주가 걸리다니..

엄청 빠른 진도다.

요즘도 여전히 좋은 생활을 유지하고 있다.

오늘은 끝나고 바로 집에 간 다음 빨래도 하고 방도 좀 치우고 조깅을 하며 하루를 마무리할 생각이다.

물론 방통대 강의는 자기 전에 계속 듣고 있고 오늘도 들을 생각이다!

사실 너무 빨리 들어서 3월 중에 모두 다 들어버릴 것 같다.

1. 추상(abstract)

추상 메서드

  • 몸체가 없는 메서드
  • 추상 메서드의 선언부에 abstract 키워드 사용
  • 상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메서드
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
public abstract void ex1();

추상 클래스

  • 몸체가 없는 메서드를 포함한 클래스(미완성 설게도)
  • 추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용
[접근제한자] abstract class 클래스명 {}
public abstract class Class1() {
	ex1();
}

  • 추상 메서드가 없어도 추상 클래스 선언 가능하다는 것은
    완성된 클래스이지만 객체로 만들지 못하게 하겠다는 뜻

2. 인터페이스(interface)

인터페이스

  • 경계면, 접점, 공유 영역이라는 뜻
  • 상수형 필드와 추상 메서드만을 작성할 수 있는 추상 클래스의 변형체
    메서드의 통일성을 부여하기 위해 추상 메서드만 따로 모아놓은 것으로
    상속 시 인터페이스 내에 정의된 모든 추상 메서드를 구현해야 함
  • 껍데기만 만들어놓은 개념으로 비유
[접근제한자] 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("학원에서 강의를 듣습니다");
    }
}

3. 예외 처리(exception handling)

프로그램 오류

  • 프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것(프로그램 에러)
  • 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을 상속)

0개의 댓글