assert 예약어 - 단언문

Jamie·2020년 11월 23일
1

java

목록 보기
1/1
post-thumbnail

assert 예약어

Java 1.4에 도입

선언법

assert 조건식
assert 조건식: AssertionError메세지

assert false;
Exception in thread "main" java.lang.AssertionError
	at test.Main.main(Main.java:23)
    
assert false: "단언문 실패 메세지입니다.";
// 발생 Exception
Exception in thread "main" java.lang.AssertionError: 단언문 실패 메세지입니다.
	at test.Main.main(Main.java:23)

assert 거짓이면 어떻게 되나요!?

  • 거짓인 경우시 JVM이 AssertionError를 발생시킴
  • AssersionError : 응용 프로그램에서 복구할 수 없는 조건을 나타내기 위한 것, 이를 처리하거나 복구하려 하지 말 것
    • 즉, Catch로 잡는 행위 등을 하려 하지 말 것

어디서 쓰이나요?

  • Preconditions : private 메서드를 호출할 때 지켜야하는 요구사항 단언
    (private은 객체 스스로가 호출할 것임이 명확하기 때문)
  • Postconditions : 코드 수행 결과 확실하는 값 단언
  • Class Invariants : 객체 상태가 특정 값일 것이라는 부분을 단언

주의 사항

  • assertion이 실서버에서는 사용되지 않을 수 있음(옵션에 따라 다름)
    → 업무 로직에 해당하는 부분의 검증은 assert가 아닌, IllegalArgumentException, NullPointerException과 같은 예외 사용
  • assertion 조건에서 메서드를 호출하지 말 것
    → 메서드 결과를 로컬 변수에 할당하고 해당 변수를 assert와 함께 사용
  • assertion은 프로그램의 신뢰성을 높이기 위해서 사용
    → 코드가 실행될 때 반드시 어떤 값일지 확신하는 값, 범위 또는 확실한 클래스의 상태 등을 체크
    → switch문의 기본 케이스 또는 완료되지 않는 반복문 이후 등과 같이 (절대) 실행되지 않을 코드 위치에 적합함

JVM가 assertion 유효성 검사를 하지 않는다구요?

  • JVM은 기본적으로 assertion 유효성 검사를 비활성화
  • 비활성화 이유
    • 이전 버전의 호환성을 유지하기 위해
    • Java 1.4 이전에 assert는 예약어가 아니었기 때문에, 변수명 등으로 쓰일 수 있었음
  • 옵션을 통해 유효성 검사를 할 수 있음
  • 옵션과 상관 없이, 컴파일러는 컴파일을 함

유효성 검사를 하고 싶다면?

  • 옵션
    • 유효성 검사를 포함할 경우 : -enableassertions, -ea
    • 유효성 검사를 배제할 경우 : -disableassertions, -da
  • 옵션 값 설정 방법
    • 옵션만 명시하는 경우 : 전체 적용
    • 클래스명 명시하는 경우 : 해당 클래스에 적용
    • 패키지명... 명시하는 경우 : 해당 패키지와 하위 패키지의 모든 클래스에 적용
    • ea와 da는 같이 쓸 수 있음
    • 설정 예
    -ea Main : 시스템 클래스를 제외한 모든 클래스 활성화
    -ea:<class name> Main : 지정한 <클래스>만 활성화
    -ea:... Main : 기본 패키지를 활성화 = 전체 패키지 활성화(모든 클래스와 하위 패키지 포함)
    -ea:<package name>... Main : 지정된 <패키지> 활성화(모든 클래스와 하위 패키지 포함)
    -ea -da:<class name> Main : 지정된 클래스를 제외한 모두 활성화
    -ea -da:<package name>... Main : 지정된 패키지를 제외한 모두 활성화

IntelliJ에서 assert 예약어 사용하기

  • 아래와 같이 Run Configuration의 VM Options에 옵션을 적어주기
profile
성장중인 제이미입니다.

0개의 댓글