HOWTO · Java
Java의 assert 키워드
이 기사에서는 Java의 assert 키워드를 사용하는 시기와 방법을 설명하고, -ea 옵션으로 어설션을 활성화하는 방법과 내부 가정에 적용하는 방법을 소개합니다.
이 페이지의 내용
Java의 assert 키워드는 프로그래머의 가정을 확인하며, JVM에서는 어설션이 기본적으로 비활성화되어 있습니다. 어설션을 활성화하려면 -ea 옵션을 사용해 프로그램을 실행하세요. 활성화된 어설션의 조건이 false로 평가되면 Java는 AssertionError를 발생시키고, 그렇지 않으면 실행을 계속합니다. 개발 중에 참이어야 하는 내부 가정을 확인하는 데 어설션을 사용하고, 실행할 때마다 애플리케이션이 반드시 수행해야 하는 동작에는 사용하지 마세요.
Java에서 assert를 불리언 조건으로 사용하기
기본 형식은 assert condition;이며, condition은 불리언 표현식이어야 합니다. 어설션이 활성화된 상태에서 표현식이 false이면 Java는 해당 어설션 문에서 AssertionError를 발생시킵니다. 어설션이 비활성화되어 있으면 JVM은 조건을 평가하는 것까지 포함해 어설션을 건너뜁니다. 따라서 조건 안에 프로그램이 의존하는 작업을 넣어서는 안 됩니다.
다음 완전한 클래스는 개수를 확인하고 짧은 결과를 출력합니다.
public class JavaAssertCheck {
public static void main(String[] args) {
String[] names = {"John", "Mary", "David"};
assert names.length == 3;
System.out.println("Name count: " + names.length);
}
}
클래스를 컴파일한 다음 java -ea JavaAssertCheck로 실행하면 검사가 활성화됩니다. -ea 없이 실행하면 검사를 건너뜁니다. 예상 개수를 배열의 실제 개수와 다르게 바꾸고 어설션을 활성화하면 프로그램은 어설션 문에서 AssertionError와 함께 중단됩니다. 코드 예제의 문자열은 바이트 단위로 동일하게 유지하기 위해 영어 그대로 표시됩니다.
assert condition : expression으로 진단 메시지 추가하기
실패할 때 맥락을 함께 표시하려면 assert condition : expression 형식을 사용하세요. 표현식은 어설션이 활성화되어 있고 조건이 false일 때만 평가되며, 그 값은 발생한 AssertionError의 상세 메시지가 됩니다. 예를 들어 assert names.length == expected : "Expected " + expected + " names, got " + names.length;는 두 개수를 모두 알려 줍니다. 조건이 참이거나 어설션이 비활성화된 경우에는 표현식이 평가되지 않으므로, 여기에 부수 효과를 넣지 마세요.
예상치 못한 분기를 표시하기 위해 assert 사용하기
프로그램의 논리상 도달하지 않아야 하는 런타임 분기를 어설션으로 표시할 수 있습니다. 무조건적인 return 뒤에 문장을 두면 Java가 이를 거부하므로, 컴파일러가 도달 불가능하다고 증명할 수 없는 분기 안에 어설션을 넣으세요:
public class StatusLabel {
static String label(int status) {
if (status == 0) {
return "ready";
} else if (status == 1) {
return "busy";
} else {
assert false : "Unexpected status: " + status;
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(label(0));
}
}
어설션이 활성화되어 있으면 마지막 분기에 도달할 때 상태를 맥락으로 포함한 AssertionError가 발생합니다. 비활성화되어 있으면 실행은 대체 반환문에 도달합니다. 따라서 이 어설션은 필수 제어 흐름이 아니라 진단을 돕는 수단입니다. 코드 예제의 문자열은 바이트 단위로 동일하게 유지하기 위해 영어 그대로 표시됩니다.
내부 불변 조건에 어설션을 안전하게 사용하기
프로그램 내부에서 성립하도록 만든 불변 조건을 문서화할 때 어설션을 유용하게 쓸 수 있습니다. 예를 들어 내부 계산 후에도 값이 특정 범위 안에 있어야 한다는 조건을 확인할 수 있습니다. 어설션을 사용하면 개발 중에 가정이 깨진 위치를 더 쉽게 찾을 수 있습니다.
공개 메서드에 전달된 인수를 어설션으로 검증하지 마세요. 호출자는 JVM 옵션과 관계없이 정해진 검증 응답을 받아야 합니다. 또한 어설션이 비활성화되면 조건이 평가되지 않으므로, 반드시 실행되어야 하는 애플리케이션 작업을 어설션 안에 넣지 마세요. 같은 이유로 어설션 표현식에서 부수 효과를 일으키지 마세요. 프로덕션에서도 프로그램이 일관되게 대응해야 한다면 일반적인 검증과 제어 흐름을 사용하세요.