JAVA 기초 다지기
* JAVA를 공부하면서 정리하고 있는 내용입니다. 잘못된 내용에 대한 피드백은 언제나 환영입니다. :)
JAVA나 다른 개발 언어의 기초 중의 기초, 예외 처리에 대해 알아보자.
내가 짠 코드는 언제든지 문제가 발생할 수 있다. 문제가 없으면 오히려 이상하다. 손으로 타이핑을 하다가 오타를 낼 수도 있고 엉뚱한 방향으로 코드를 짤 수도 있다. 내가 짠 코드를 믿을 수 없기도 하고 사용자가 입력하는 부분에서 에러가 생길 수도 있고, 예기치 못한 네트워크의 문제로 에러가 발생할 수도 있다. 그 경우의 의 수는 아주 많다. 이런 상황에 대비해 코드 중간 중간에 대처해놓는 것을 예외 처리라고 한다. 예상 가능한 에러에 대해 대처 방법을 적어놓는 것이다.
컴파일이란 내가 짠 코드를 컴퓨터가 알아들을 수 있는 언어(기계어)로 변환시켜주는 것을 말한다. 컴파일 에러란, 기계어로 변환시킬 수 없는 문법적인 오류, 타입 에러등이 있어서 에러가 발생하는 것을 말한다. 이는 실제 프로그램이 실행되기 전 단계인 컴파일 단계에서 발생하는 에러이다. 그래서 프로그램이 아예 작동조차 되지 않는다. 대체로 IDE (VSCode 나 인텔리제이 같은 툴)에서 코드를 짜다보면 미리 알려주는 경우가 많다.
예를 들면,
String name = 1; // 문자열 타입의 데이터에 숫자를 넣음
int age = '안녕'; // 정수 타입의 데이터에 문자를 넣음
System.out.println(birthday); // 선언되지 않은 변수를 사용함
이렇게 적으면 대부분의 에디터에서 에러표시(빨간 밑줄)를 해주는 것을 볼 수 있다.
런타임이란 말 그대로 프로그램이 작동하다가 생기는 에러이다. 다양한 경우의 수가 있다. 사용자가 입력을 잘못하는 경우도 있고, 배열의 잘못된 데이터를 참조하는 경우도 있다. 대체로 논리적인 오류나 여러 예외 상황들이 포함된다.
int[] arr = new int[5];
System.out.println(arr[10]); // 배열 범위 초과 오류
try catch 문은 앞서 이야기한 "에러가 발생하면 이렇게 대처해라"를 명시하는 코드이다. try 구역 안에는 내가 실행하고자 하는 코드를 적는다. catch 문에서는 내가 실행한 코드에서 발생할 수 있는 예외 클래스를 인자로 받아서 해당 에러를 처리하거나 에러를 던진다. try catch 부분은 하나의 기능만을 담거나 짧을 수록 좋다. 그래야 예외를 특정하기가 좋다.
코드를 보다 보면 이렇게 메소드에 throws가 붙은 걸 볼 수 있다.
public void methodHello() throws 예외 클래스 { }
기본적으로 throw는 사용자가 특정 에러를 발생시킬 수 있는 구문이다. 인위적으로 예외 상황을 발생시키는 것이다. throw new Exception();을 하면 내가 임의로 에러를 발생시킬 수 있다.
근데 이렇게 메소드에 throws를 붙이고 예외 클래스를 명시해주면, 해당 메소드를 실행했을 때 에러가 발생하면 이 메소드를 실행시킨 곳에다가 예외 클래스를 던져(!!) 준다는 것이다.
3, 4번에 대한 내용은 코드를 보면 더 명확하게 이해가 된다.
이 코드를 실행해보면, 먼저 TestThrows가 실행되면 test1()이 실행된다. 그러면 test 에서 에러가 발생하고, test1에서는 exception을 throws 하고 있는 걸 볼수 있다. 그래서 5번째 열로 돌아간다. 그러면 여기서 에러를 캐치해서 7번째 라인인 "에러 발생 1"이 콘솔에 찍힌다.
두번째 try catch 에서는 test2()가 실행된다. test2는 메소드 내부에 자체적으로 try catch 문이 있어서, 여기서 에러가 발생하면 25번째 라인의 "에러 발생 3"이 콘솔에 찍힌다.
결과적으로 13번 라인의 "에러 발생 2"는 찍히지 않는다. 왜냐면 test2는 내부 메소드에서 에러 처리를 하고 있고 에러를 던지지(throws) 않는다.
위 내용은 어라운드 허브 스튜디오의 자바 기초 강의를 참고로 작성한 필기 노트입니다.