Agile Java Lesson 6, 7

기본

레슨 6은 상속에 관한 내용입니다. 레슨 첫 장에 switch 문이 등장합니다. 어디선가 switch 문을 if-else로 바꿔서 컴파일 한다는 얘기를 들었었는데, JLS에는 딱히 명시된 얘기는 없었고 Sun 포럼에서 찾은 글을 보면 바이트코드가 if-else, switch 문에 따라 달라지며, switch문이 테이블스위치로 변환되는 경우 O(1), 룩업스위치로 바뀌는 경우 O(log(n)) 이기 때문에 O(n)인 if-else 보다는 어쨌든 더 퍼포먼스가 나오지만 그래봐야 microsecond 정도 아닐까 싶습니다.

개인적으로 숫자나 enum을 사용할 땐 switch 쪽이 가독성이 더 좋다고 생각하고, 적어도 자바에선 퍼포먼스보단 어느 코드가 더 읽기 좋은가에 포커스를 맞추는게 맞는 것 같습니다.

그런데 switch 문도 break를 빼먹으면 재앙이 일어날 수도 있고, 코드 변화에 민감하기 때문에 중복과 반복의 정도, 유지보수 용이성에 따라 아예 다형성을 이용하는 코드로 바꾸는게 좋다고 합니다. switch 문의 대안(다형성을 사용하는)으로 EnumMap을 소개하는데요. 이름에서 알 수 있듯이 이 맵은 키가 Enum이어야 합니다.

private Map messages = new EnumMap<Student.Grade, String>(Student.Grade.class);

public String getMessgae(Student.Grade grade) {
return getMessages().get(grade);
}

다음으로 늦은 초기화(lazy initialization)에 대해서 나오는데 역설이지만 OOP에서는 객체를 많이 만드는게 좋지많은 않습니다. 왜냐면 객체를 생성하고 유지하는데 비용이 적지 않기 때문입니다. 따라서 이런 부담을 줄이기 위해 꼭 필요할 때 객체를 생성하는 것을 늦은 초기화라고 합니다.

레슨 5에서 학점 계산을 하는 코드를 리팩토링 하면서 Strategy 패턴을 적용했었는데, 이때 중복되는 코드가 있었습니다. 이번엔 이 구조를 상속을 통해 개선합니다. GradingStrategy 인터페이스에 학점 계산 메소드를 하나 선언해 두고 BasicGradingStrategy에서 기본 구현을 한 다음, HonorsGradingStrategy, SenatorsSonGradingStrategy 등의 전략에서는 인터페이스가 아닌 BasicGradingStrategy 클래스를 상속 받아 메소드를 확장하는 형태입니다.

이제 본격적으로 Enum 클래스의 생성자와 메소드를 이용하기 시작하는 코드가 나오는데 역시 유용하단 생각이 듭니다. 토비님의 책에서도 아마 회원 등급 계산할 때 Enum 클래스를 사용하는 걸로 기억하는데 처음에 좀 이상해 보여서 그렇지 사용할수록 좋아 보입니다.

제가 TDD를 접하면서 들었던 의문 중에 하나는, 어떤 메소드를 만들고 그에 따른 테스트 코드를 만들지 않고 왜 테스트 코드를 먼저 만드는가? 하는 거였습니다. 그리고 테스트 코드를 먼저 만들면서 느낀점은 테스트 코드를 먼저 작성하면서 어떤 기능에 대한 템플릿 내지는 목표를 정확하게 지정해 삼천포로 빠지는 일을 막아주지 않았나 싶습니다. 책에서도 이런 내용이 나옵니다.

클라이언트는 어떤 객체에 메시지를 보낼 때 특정 방식으로 객체가 동작하기를 기대하는데, TDD에서 단위 테스트(unit test)가 바로 이 방식을 정의한다고 할 수 있다. 왜냐면, 단위 테스트는 인터페이스에서 정의한 기능에 대해 실제로 동작시켜보고 몇 가지 조건을 확인해 기능을 확인하기 때문이다.

레슨 끝 부분에 Abstract Test 패턴에 대해서 나옵니다. Abstract Test 패턴은 상위 테스트 클래스에서 어떤 공통적인 규칙을 만들어두고 이를 통과하면 하위 테스트 클래스에서 좀 더 강화된 테스트조건을 테스트 하는 것입니다. 왜 이러한 구조가 필요한가에 대한 설명은 이렇습니다.

하위 클래스는 extends의 의미대로 상위 클래스를 확장하기 때문에 결국 하위 클래스의 테스트에는 조건이 추가되어야 한다는 것을 의미합니다.  따라서 상위 -> 하위 클래스 순으로 테스트 하는게 이치에 맞아 보입니다.

그런데 이 패턴을 이클립스에서 지원해 주지 않는건지 상위 테스트 클래스에서 테스트를 할 경우 프로젝트 폴더 안에 있는 모든 테스트가 실행됩니다. 상위 테스트 클래스가 추상 클래스이기 때문에 그렇다고 생각되긴 하지만 type hierarchy 기능을 가지고 있는 IDE 툴로써 좀 아쉬운 부분이었습니다.

레슨 7은 C언어에서 파생된 요소들을 배우게 되는데 특별한 내용은 없었습니다. 단지 다른 입문서와 다른건 이런 내용을 담은 예제가 모두 단위 테스트로 나오기 때문에 이 예제가 뭘 확인하려는지 의도가 확실하다는 점입니다. 책에서 오타가 심심찮게 나오긴 하지만 자바 입문하시는 분들이 이 책으로 시작하면 어떨런지요.

ps. 책을 쭉 둘러보니 체스 예제가 여기서 사실상 마감이네요.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중