Java Assertion(어설션) 실전 가이드: 버그 조기 발견과 코드 신뢰성 확보
Java 어설션
Java assert 문으로 버그 조기 포착, 가정 검증, 코드 품질 향상 방법 학습.
어설션은 실행 중 항상 참이어야 할 조건 테스트용 경량 개발자 전용 메커니즘. 명시적 활성화 필요, 프로덕션 빌드에서 제외되어 런타임 성능 영향 없음.
문법
assert condition;
여기서 condition은 true 평가 예상 불리언 표현식. 조건 false이고 어설션 활성화 시 JVM이 AssertionError 던지고 프로그램 정지.
어설션 활성화
어설션 기본 비활성화. JVM 스위치로 활성화:
java -ea:arguments java -enableassertions:arguments
활성화 시 true 조건 정상 진행, false 조건 AssertionError 트리거 후 실행 정지.
예제 1: 기본 어설션
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("There are " + weekends.length + " weekends in a week"); } }
어설션 비활성화 시 출력:
There are 3 weekends in a week
어설션 활성화 시 출력:
Exception in thread "main" java.lang.AssertionError
확장 어설션 문법
진단 메시지 포함:
assert condition : expression;
expression은 AssertionError 생성자 전달, 조건 실패 시 표시.
예제 2: 메시지 포함 어설션
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length==2 : "There are only 2 weekends in a week"; System.out.println("There are " + weekends.length + " weekends in a week"); } }
활성화 시 출력:
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
대상 어설션 활성화
특정 클래스나 패키지 어설션 활성화:
- 모든 사용자 클래스:
java -ea
- 특정 클래스:
java -ea:AnimalClass Main
- 패키지 및 하위 패키지:
java -ea:com.animal... Main
- 이름 없는 패키지:
java -ea:... Main
시스템 클래스 -esa 또는 -enablesystemassertions로 활성화. 비활성화는 -da, -dsa로 유사 패턴.
어설션이 유용한 경우
- 도달 불가능 코드: 도달 불가능 표시 코드 진짜 도달 불가능 검증.
void unreachableCodeMethod() { System.out.println("Reachable code"); return; // 도달 불가능 코드 System.out.println("Unreachable code"); assert false; }
- 누락된 default 분기: switch 문 철저 처리 보장.
switch (dayOfWeek) { case "Sunday": System.out.println("It's Sunday!"); break; case "Monday": System.out.println("It's Monday!"); break; // … default: assert false : dayOfWeek + " is an invalid day"; }
- 가정 문서화: 깨지기 쉬운 주석 대신 assert 문으로 동기화 유지.
if (i % 2 == 0) { // ... } else { assert i % 2 == 1 : i; // ... }
어설션 피해야 할 경우
- 공개 API 인수 검사: 사용자 입력은 어설션 에러 아닌 런타임 예외 트리거해야 함.
- 사이드 이펙트 있는 조건: 어설션 내 상태 수정 메서드 호출 피하기, 어설션 비활성화 시 코드 무음 실행 가능.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday" )); boolean removed = weekdays.removeAll(weekends); assert removed;
어설션 이점
- 빠른 개발자 중심 버그 탐지.
- 프로덕션 빌드서 자동 제거, 제로 런타임 비용 보장.
- 보일러플레이트 감소, 의도 명확화.
- 리팩토링과 최적화 시 자신감 증대.