본문 바로가기
Today I learned

자바로 배우는 리팩토링 입문 4

by soheemon 2019. 7. 14.

※자바로 배우는 리팩토링 입문 책을 보고 작성하였습니다.

 

- '어떻게 될것이다-'라는 주석이 있는경우를 위한 어서션 도입.

좋은 주석은 프로그래머의 의도를 명확하게 보여주지만, 실제 코드에는 영향을 미치지 않는다.

 

어서션은, 프로그래머의 의도를 확실히 밝히면서도 실행 시 조건이 반드시 성립함을 보장한다.

(코드에 영향을 미치지 않는 주석과는 확연히 차이점이 드러나는 부분이다.)

 

예를들어 어떤 부분에서 변수 value 값이 참이어야 한다고 할때, 만약 value값이 참이 아니라면 프로그래머의 의도와는 다른 동작이 된다. 이부분은 어셔선으로 아래와 같이 작성한다.

 

assert value > 0; //value > 0을 어서션한다 또는 value > 0임을 표명한다 라고 부른다.

 

value가 >0임을 만족할경우에는 아무런 영향도 주지 않지만, 만약 value > 0이 만족하지 않는다면

JRE는 java.lang.AssertionError예외를 던진다. 이는 '프로그래머가 표명한 조건식이 성립하지 않았다'라는 뜻이다.

 

java.lang.AssertionError는 치명적인 에러를 뜻하는 java.lang.Error의 하위클래스이다. VirtualMachineError나 ThreadDeath처럼 일반적으로 *AssertionError를 잡아서 처리하는 코드는 작성하지 않는다.*

 

하지만 AssertionError가 발생하면 프로그래머의 기대와 다르다는 사실을 알 수 있으므로 어서션은 프로글매의 에러를 빨리 발견하는 방법이다.

 

이름: 어서션 도입

상황: 코드 속에 성립해야 할 조건이 있음

문제: 주석으로 '이런 조건이 성립한다'라고 적어도 프로그램 실행시 확인되지 않음.

해법: 어서션 넣기

결과:

 +해당 부분에서 성립해야 할 조건이 명확해지고 소스코드가 읽기 좋아짐

 +버그를 빨리 발견 가능함

 +어서션을 활성화하면 어서션이 성립하는지 자도응로 확인 가능함

 +어서션을 비활성화하면 어서션이 무시되어 성능이 개선됨 (단, 지나치게 쓰면 오히려 읽기 어려워짐)

방법:

 1.어서션 도입

  (1)소스 코드에서 '성립해야 할 조건' 찾기, (혹은 주석 찾기)

  (2)조건을 포함한 어셔선 작성 (+ 어서션 내부에 부수효과가 있는 코드를 작성하면 안 됨.)

  (3) 적혀 있던 주석은 무의미하므로 주석 삭제

  (4)컴파일 해서 테스트

주의:

 +자바 컴파일러는 어서션을 무효화해도 어서션 부분 코드를 삭제하지 않음(! 바이트 코드 크기를 줄이려면 '도달할 수 없는 문장'을 사용해야 함)

 +어서션 안에 부수 효과가 있는 코드를 작성하면 안 됨

 +어서션을 일반 에러 처리 대신에 사용하면 안 됨

 

//어서션 도입 before
void method(int value) {
	// 여기서 value는 참이어야함
    ...
}

//어서션 도입 After
void method(int value) {
	assert value > 0;
}

 

댓글