시소당
Assertion 기본
자바 1.4 버전은 1.3 버전에 보안을 비롯한 다양한 확장 API를 추가하여 그 크기가 방대해졌을 뿐만 아니라 NIO와 로깅 등 새로운 기능을 추가함으로써 완벽한 개발 플랫폼으로 확장되었다. 이러한 새로운 기능들 중에서 자바에서는 전혀 새로운 기능이라고 할 수 있는 게 Assertion 기능이다.
Assertion은 무엇인가
JSR(Java Specifiaction Request) 41을 보면 다음과 같이 Assertion에 대해서 정의를 내리고 있다.
Assertion은 불리언 식(expression)을 포함하고 있는 문장으로서, 프로그래머는 그 문장이 실행될 경우 불리언 식이 참이라고 단언할 수 있다.
다시 말해서 개발자가 자신이 개발한 프로그램에서 가정하고 있는 사실이 올바른 지 검사할 수 있도록 하기 위해서 자바 1.4에 추가된 기능이 바로 Assertion인 셈이다. 예를 들어, 이러한 가정에는 이자율에 해당하는 변수가 0보다 커야 한다는 것 등이 있을 수 있다. Assertion은 그러한 가정이 올바른 지 검사할 수 있도록 함으로써 프로그램이 부드럽게 수행될 수 있도록 도와준다. 이러한 검사 기능은 예외(Exception)를 사용해서도 구현할 수 있긴 하지만, Assertion은 예외와는 다른 의미의 검사 기능을 제공한다. 이에 대해서는 이 글을 진행하면서 살펴볼 것이다.
왜 Assertion을 사용하는가?
사실, 예외를 사용하면 에러 검사 기능을 어느 정도 처리할 수 있다. 그런데 왜 Assertion이라는 새로운 검사 기능을 도입한 것일까? 이제 이 질문에 답을 해 보도록 하자. 먼저 자바의 예외는 주로 프로그램을 실행하는 도중에 예상하지 못한(또는 드물게 발생하는) 상태를 처리하는 데 사용된다. 예를 들어 파일을 열수 없다던가, 네트워크의 연결이 끊어졌다던가 하는 등의 이상 상태를 처리할 때 주로 예외가 사용된다. 반면에 Assertion은 개발자가 참이라고 가정하는 상태를 명시하기 위해서 사용된다. 에를 들어, 어떤 메소드가 파라미터로 양수만 입력받아야 한다고 확신한다면, Assertion을 사용하여 그 사실을(즉, 파라미터가 양수라는 것을) 명시할 수 있다.
예외는 프로그램을 수행하는 도중에 발생하는 비정상적인 상태를 처리하기는 하지만 프로그램의 코드가 수행되는 도중에 예외가 발생한다. 반면에 Assertion은 프로그램이 올바르게 수행될 수 있는 조건을 명시해주어 그 조건을 만족시키는 경우에만 코드가 실행될 수 있도록 해 준다. 따라서 Assertion은 프로그램이 올바르게 실행되도록 해주는 효과적인 도구가 될 수 있으며, 프로그램의 안정성을 높여줄 수 있다.
Assertion의 문법
Assertion 문장은 다음과 같은 두가지 형태를 취한다.
assert 불리언식;
assert 뷸라온식:수식;
첫번째 형태는 간단한 형태로서 불리언식을 인자로 받는다. 불리언 식은 개발자가 참(true)이라고 생각하는 식이다. 만약 그 가정이 틀렸다면(즉, 불리언식이 false가 된다면), 불리언식은 Assertion이 틀렸음을 나타내는 false 값을 리턴하고, 불리언식이 성공한 경우에는 프로그램의 수행이 정상적으로 진행된다.
두번째 형태는 좀더 상황에 맞는 설정을 하는 것으로서, 첫번째 인자에는 불리언 식이 오며, 두번째 수식에는 Assertion이 틀렸을 때 사용할 수식이 온다. 두번째 수식은 값이 될 수도 있고, 또는 메소드를 수행한 결과값이 올 수도 있다. 두번째 수식이 void 값을 리턴할 경우 컴파일러는 에러를 발생시킨다.
첫번째 형태와 두번째 형태 모두 불리언식이 틀렸을 때, 즉 불리언식이 false를 리턴하면 AssertionError를 발생시킨다. 일반적인 예외와 마찬가지로 AssertionError도 스택 트레이스의 한 부분으로서 보여진다. 두번째 형태에서 지정한 수식의 결과값은 AssertionError의 생성자에 전달되어 스택 트레이스에 출력되는 메시지로 사용된다.
다음은 몇가지 assert의 사용 예를 보여준 것이다.
assert i<0;
assert (!pageNo.equals(""));
assert age > 0 : "나이는 음수가 될 수 없습니다:"+age;
assert ((i/2*23-12)>0):checkValue();
위의 예에서 첫번째 assert 문장은 i가 0보다 작지 않을 경우 AssertionError를 발생시킨다. 세번째 assert 문장의 경우는 age가 0보다 크지 않은 경우 AssertionError를 발생시키며, 그때 AssertionError의 예외 메시지는 "나이는 음수가 될 수 없습니다:"와 age 변수를 연결한 문자열이 된다. 네번째 예제의 checkValue() 메소드는 void가 아닌 값을 리턴해야만 한다.
출처 : http://cafe.naver.com/glovallicence.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1749