슈퍼코딩/주특기(JAVA)

2024.05.10(금) 슈퍼코딩 신입연수원 6주차 Day 5 후기 - Throwable

곰돌이볼 2024. 5. 10. 14:26
  • 강의
    • 49강(big picture) ~ 52강(예외처리)

품질 좋은 코드


  • 성능이 좋은 코드
    • 데이터와 사용자가 늘어나도 한정된 리소스를 통해 활용 가능
  • 버그와 예외 방어하는 안전한 코드
    • 악의적 요청(해킹) 대응
    • 특정 시스템의 사고 발생 대처
  • 가독성과 코드 재사용성이 좋은 코드
    • 요구사항 변경 대응 ↑
    • 협업에 좋음

버그 처리


  • 자바 입출력
    • 로컬 파일 입출력
    • 프로토컬을 사용한 외부 입출력(ex. API)
  • 버그(Throwable 클래스)
    • 오류(error)
      • 통제 불가능 
      • 실행하는 컴퓨터 자체의 문제
      • JVM 오류
    • 예외(exception)
      • 통제 가능
      • Check Exception : 무조건 처리해야하는 예외
      • Uncheck Exception : 처리하지 않아도 되는 예외
      • 발생 원인
        • 개발자 코드 실수
        • 코드상으로는 구현되지만 비즈니스적으로(논리적으로) 맞지 않은 요청
        • 외부 환경 변화 ex) 외부 인프라 사고 발생, 읽고 있는 file 수정

  • Error와 Exception 던지기
    • class에 Throwable 상속받아서 구현 가능
    • 에러나 예외를 미룰 경우에 메서드에 throws 키워드 사용하기
    • throw new [발생시킬 에러 또는 예외]();
class MyThrowable extends Throwable {
	...
}

class CustomerThrower
	public void anotherMethod() throws MyThowable {
    	throw new MyThrowable();
    }
]

Try-Catch-Finally문


  • try-catch-finally 예외처리
    • try문 : 예외가 발생할 것 같은 구문
    • catch문
      • 예외가 발생할 때 동작하는 구문
      • 여러 개의 Catch문 사용 가능
    • finally문
      • 예외가 발생 여부와 상관없이 동작하는 구문
      • 리소스 해제할 때 사용
      • 필수 X
  • try-catch 다중 예외처리
    • 여러 개의 catch문을 사용해서 여러 예외를 처리하는 방법
    • Catch문에 Exception(상위 클래스)를 이용해서 모든 예외 잡기
    • | 연산자를 이용해서 여러 개의 예외를 한꺼번에 잡기
try {
	// FileNoutFoundException 발생
	FileInputStream fs = new FileInputStream("src/test.txt");
    
    // ArithmeticException 발생
    int i = 0;
    int data = 10 / i;
    
    // NullPointException 발생
    String str = null;
    System.out.println(str.toUppterCase());
    
    // ArrayIndexOutOBoundsException 발생
    int[] arr = new int[10];
    System.out.println(arr[10]);
} catch (FileNotFoundException e) {
	System.out.println("FileNotFoundException 발생");
    e.printStackTrace();
} catch(NullPointException | ArithmeticException e) {
	System.out.println("NullPointException 또는 ArithmeticException 발생");
    e.printStackTrace();
} catch(Exception e) {
	System.out.println(e);
    e.printStackTrace();
} finally {
	fs.close(); // 리소스 해제
	System.out.println("무조건 실행되는 finally 구문");
}

 

 

  • 리눅스 명령어
    • lsof -c java | grep test.txt : 열려있는 java가 사용하는 리소스 중 test.txt 가 있는지 검색검색
- lsof : 열려있는 파일 나열
- grep : 텍스트 검색 명령어, 특정 패턴과 일치하는 파일 검색 명령어

 

  • try-with-resource과 AutoCloseable
    • AutoCloseable : 자원 리소스 해제를 하지 않아도 자동으로 리소스를 해제하는 인터페이스
      • FileInputStream이 AutoCloseable을 상속받아서 구현된 클래스
    • try()의 () 안에 작성하면 try-catch문 종료 시 자동으로 리소스 해제됨
try(FileInputStream fs = new FileInputStream("src/test.txt")) {
} 
} catch(Exception e) {
	System.out.println(e);
    e.printStackTrace();
}

예외


예외 미루기

  • 메서드를 호출하는 곳에서 예외를 처리할 수 있도록 하는 방법
  • method에 thorows 키워드를 통해서 미룰 예외 선언
  • 사용 이유 : 예외를 한꺼번에 예외를 처리하기 위해서
  • 주의사항
    • main 메서드에는 예외 미루기 사용 X
    • main 메서드가 가장 최종적으로 사용되는 메서드이므로 예외 미루기를 할 경우에는 예외 처리 불가능
class CustomerThrower
	public static void main(String args[]) {
    	try() {
        	anotherMethod();
        } catch(IOException e) {
		    e.printStackTrace();
        }
    }
    
	public static void anotherMethod() throws IOException { 
    	System.out.println("예외 미루기");
    }
]

 

 

예외 던지기

  • 예외 발생시키기
  • 함수 반환형과 상관없이 예외 던지기 가능
  • 예외 던지기가 되면 아래의 구문은 동작X
  • if문과 예외 미루기와 함께 사용
  • 방법 : throw new ArithmeticException("에러 메세지 던지기");
    • throw를 통해서 예외 던지기
    • new를 통해서 객체 생성
    • 예외 클래스의 생성자에 메세지 담기

 

사용자 정의 예외 던지기

  • 사용자가 직접 정의한 예외 발생시키기
  • 여러 예외가 발생할 수 있는 상황에 대비해서 사용자가 직접 예외를 정의함으로써 상황에 맞춘 예외 발생 가능
  • RuntimeException을 상속받아 정의하기
// 사용자 정의 예외 던지기
public class PositiveNumberException extends RuntimeException {
	public PositiveNumberException(String message) {
    	super(message);
    }
}

public class Main {
	public static void main(String[] args) {
    	int age = -1;
    	if(age < 0) throw new PositiveNumberException("나이는 0 이상");
    }
}

 

실무에서 예외처리 사용

  • 예외 발생 로그 기록 남기기
  • 예외 발생 알림 설정