정리정리

[Java] assert 알아보기 본문

Java

[Java] assert 알아보기

wlsh 2024. 5. 20. 14:49

Assert란

assert 조건식;			//기본 형식
assert 조건식 : 에러 메시지;		//메시지 포함 형식

assert age >= 0;
assert age >= 0 : "나이는 음수일 수 없습니다";

assert는 jdk 1.4에서 추가된 키워드로, 코드가 논리적으로 올바르게 작동하는지 확인하는 데 사용합니다.

 

Assert, Exception 차이

1. assert의 쓰임새

어떻게 보면 if - exception의 간결한 표현이라고 생각할 수 있지만 둘의 쓰임새는 많이 다릅니다.

마틴 파울러의 리팩토링 책에서도 assert의 사용법에 대해 다음처럼 언급합니다.

• 코드에서 기본적으로 가정하고 있는 조건들을 주석이 아닌 Assertion을 사용해서 보다 명시적으로 나타낼 수 있다.
 Assertion은 '반드시 참이어야 하는' 가정을 검사할 때 사용한다.
• Assertion이 없어도 프로그램 기능의 정상 동작에 아무런 영향을 주지 않도록 작성돼야 한다.
 Assertion은 프로그램이 어떤 상태를 가정하는지 다른 개발자에게 알려주는 훌륭한 의사 소통 도구이다.

이 부분만 보더라도 exception처럼 비정상적인 흐름을 정상적인 흐름으로 돌리거나 하는 방식과는 쓰임새가 조금 다르다는 것을 알 수 있습니다.

2. 컴파일 옵션

assert는 exception과는 다르게 기본적으로 비활성화 되어있습니다.

프로그램이 문제없이 실행됨

이는 jdk 1.4 이전 버전에서는 변수나 메서드 등에 assert라는 단어를 사용할 수 있었기 때문에, JVM에서는 assert를 추가하면서 이전 버전과 호환성을 맞추기 위해 해당 키워드를 비활성화시켜놓았다고 합니다.

따라서 assert 키워드를 활성화하기 위해서는 컴파일 옵션에 -ea (enable assertions)을 추가하여 사용해야 합니다. (어쩌면 이런 이유 때문에 assert는 개발용, 디버깅용으로만 사용되는 것 같기도 하네요)

Modifiy options -> Java -> Add VM Options -> -ea 추가

3. Assert는 Error

3번은 1번의 연장선으로, assert는 Exception이 아닌 Error라는 점에서 차이점이 있습니다.

assert에서 검증을 실패하면 AssertionError가 발생합니다.

Java를 공부하면 Exception과 Error의 차이를 꼭 한 번쯤은 들어보게 됩니다.

보통 Exception은 프로그램에 비정상적인 흐름이 발견되거나, 잘못된 값이 넘어오는 경우에 사용합니다. 대표적으로 비즈니스 로직의 예외를 잡아내는 데 사용하죠.

그에 반면, Error는 StackOverFlowError나 OutOfMemoryError처럼 복구가 불가능한 치명적인 오류가 발생했을 때 사용됩니다. 그렇기 때문에 assert는 1번에서 언급한 것처럼 '반드시 참이어야 하는' 부분에서만 사용해야 하며, 이를 복구시키려는 코드를 작성을 권장하지 않는다고 합니다.

하지만 assert는 다른 Error보다 개발자의 실수로 발생하기 더 쉽고, 이를 처리할 코드가 없다면 시스템이 종료되기 때문에 assert는 개발 단계나 디버깅 모드에서만 주로 사용합니다.

정리

assert와 exception의 쓰임새가 많이 다르고, 실제 운영 단계에서는 assert를 사용하지 않도록 옵션을 끈다고 합니다.

그래도 assert를 꼭 사용하고 싶다! 하시면 Spring의 Assert에 대해서도 한 번 알아보시는 것을 추천드립니다.

'Java' 카테고리의 다른 글

정적 팩토리 메서드 장점  (0) 2023.05.07
Comments