시소당
Assertion의 사용
Assertion은 예외를 대체하진 않지만 예외보다 효과적인 기능을 제공할 수가 있다. 프로그램을 매끄럽게 실행하기 위해서는 Assertion의 위치가 중요하다. 만약 Assertion의 위치가 올바르지 않다면 Assertion이 아무 소용이 없기 때문이다.
전위조건으로 Assertion 사용하기
Assertion을 사용하기 가장 좋은 경우는 어떤 동작을 수행하기 전에 수행에 필요한 값들의 조건을 검사하는 것이다. 예를 들어, 회원 가입을 처리하는 register(MemberInfo member)라는 메소드를 생각해보자. register() 메소드는 다음과 같이 전달받은 파라미터를 검사할 수 있을 것이다.
private void register(MemberInfo member) {
assert Member != null:"MemberInfo cannot be null";
assert member.getId() != null && !member.getId().equals("");
...
}
후위조건으로 Assertion 사용하기
어떤 동작을 수행하기 전에 값들을 검사할 때 Assertion을 사용하는 것과 반대로, 동작을 수행한 후의 결과값들을 검사하기 위해서도 Assertion을 사용할 수 있다. 예를 들어, 어떤 값을 리턴하기 전에 assert 문장을 사용하여 리턴할 값이 올바른지의 여부를 판단할 수 있다.
Assertion을 사용해선 안 되는 경우
예외가 모든 경우에 알맞은 것이 아니듯이, Assertion도 모든 경우에 알맞지는 않다. 다음의 경우에는 Assertion을 사용하지 않는 것이 좋다.
* public 메소드의 파라미터를 검사하는 경우
* 올바른 수행을 위해 필요한 작업을 수행하는 경우
먼저 public 메소드의 파라미터를 검사하는 경우를 살펴보자. 일반적으로 public 메소드에 전달된 파라미터를 검사할 때에는, 파라미터의 값이 잘못된 경우에 메소드에 알맞은 의미를 나타내지 않는 AssertionError 보다는 IllegalArgumentException과 같이 알맞은 의미를 갖는 예외를 발생시키는 것이 좋다.
또한, 올바른 수행을 위해서 필요한 작업을 assert 문장에서 실행하면 안된다. 예를 들어, 다음과 같은 코드를 생각해보자.
assert checkName();
1.4버전의 자바가상환경(JRE)는 기본적으로 Assertion 기능을 사용하지 않는다. 따라서, 기본적으로 기능을 사용하도록 명시하지 않는다면 위의 메소드는 실행되지 않을 것이다. 따라서, 올바른 수행을 하는 데 반드시 필요한 코드는 assert 문장에 넣어서는 안 되며, 다음과 같이 해 주어야 한다.
boolean checked = checkName();
assert checked;