|
자바를 공부한 사람이면서 좋은 프로그램을 만들고 싶은 사람들에게 가끔 과제를 하면서 내가 코드를 효율적으로 짜고 있는지 의문이 들 때가 있다. '나는 어떻게 프로그래밍을 하고 있을까?' 이에 대한 답으로 나는 자바로 배우는 리팩토링입문을 읽어볼 것으로 추천한다. 리팩토링에 대해 예제를 통해 쉽게 설명할 뿐만 아니라 챕터의 끝마다 퀴즈를 통해 다시 한번 리마인드를 할 기회를 준다. 이 책을 접하기 전에는 리팩토링이란 많은 공식을 외우고 많은 노하우가 필요하 것이라 지레 겁을 먹었었다. 그러나 예상과 달리 간단한 예제를 통해 쉽게 내용을 이해할 수 있었다. 학기가 끝나면 방치되고 말던 과제의 결과물인 프로젝트를 꺼내자 책의 예제를 이해한 후, 나의 프로젝트를 고쳐볼 시간을 가질 수 있다. 예를 들어, 프로젝트 중 사이즈 100 이하로 입력을 받는 부분이 있다고 가정하자. 100 초과시 사이즈 초과를 알려줄 것이다. 다음의 코드를 보자.
if ( input.length() > 100 ){ System.out.println("사이즈 초과"); } 100이상시 사이즈 초과시 사이즈 초과가 출력될 것이다. 그러나, 만약 프로그램의 성능이 좋아지거나 입력받는 최대 사이즈에 대해 수정을 해야할 경우 프로젝트에 있는 모든 관련 숫자 100을 찾아서 지워야 하는 번거로움이 있을 것이다. 이를 위한 리팩토링으로 책에서는 1장) 매직 넘버를 기호상수로 바꾸는 리팩토링 방법론을 제시한다. 100이란 숫자 대신 아래와 같이 max로 고쳐서 표현하면 어떨까? public static final max 100; ( c/c++의 #define max 100 과 같은 의미) if(input.length() > max){ System.out.println("사이즈 초과"); } 이게 바로 리팩토링이다. 거창한 것이 아니다라고 말하고 싶다. 내 프로젝트 라이브러리에는 중복된 코드, 너무 긴 코드로 범벅이 된 채로 저장된 채 날 기다리는 과제들이 있다. 이 책을 읽는 분들 역시 다른 사람이 짠 코드가 아닌 나의 코드를 통해 적용해봄으로써 리팩토링의 재미와 성취감을 느껴보았으면 좋겠다. 책 정독을 마치며.. 이번 학기도 정신없이 과제를 하다보니 방학이 왔다. 이번 겨울 방학은 무엇을 할지 고민이 했는데, 우연히 자바로 배우는 리팩토링 입문을 리뷰할 기회가 생겼다. 너무 기뻤다. 휘몰아치는 과제들로 인해 코드의 퀄리티가 떨어지는 부분이 있어 개인적으로 너무 아쉬워하던 차였다. 이를 위해, 아래와 같이 학습 계획표를 세웠다 . 내용이 무겁지 않아서, 가볍게 하루에 한 챕터씩이란 목표를 세웠었다. 다만 학습에 있어서 책 읽는 순서를 다소 나의 필요와 흥미순으로 선정하였는데, 책의 챕터가 독립적으로 구성되어있기 때문에 자신의 상황에 맞게 공부하는 것도 괜찮았다. 나의 경우, 0장부터 2장까지를 초반 학습을 한 후 리팩토링의 정의와 작은 사이즈의 리팩토링을 통해 개념을 익힌 후 과감하게 13장으로 넘어갔다. 평소 클래스의 상속에 관심이 많아 클래스르 앞으로 어떻게 설계해야할지에 대해 공부할 수 있어서 더욱 흥미를 붙여 계획대로 책을 잘 읽을 수 있었다. 참고로 3,4 장이 뒤로 빠진 이유를 설명하자면, 내가 리팩토링으로 선정할 프로젝트에서 어서션을 활용할 만한 곳이 없어서 학습 순서를 맨 뒤로 미루었었다. 향후 프로그래머로 살아가면서 새로운 코드를 만드는 단계보다 기존의 코드를 리팩토링하는 과정이 훨씬 더 많다고 한다. 능력있는 개발자는 이미 존재하는 코드를 리팩토링하면서 새로운 요구사항을 추가할 수 있는 사람일 것이다. 이번 방학에 무엇을 공부해볼까 고민하는 학부전공생에게 정말 추천해주고 싶다. 이 책은 정말 정리가 깔끔하게 되어있어 하루에 한 챕터씩 꾸준히 하면 다 읽을 수 있는 책이다. 나 역시 이 책을 통해 이번 방학은 자바 개발자로서 한층 더 성장할 수 있었다. |
|
01월 03일 리뷰 - 리뷰자 김종욱
자바로 배우는 리팩토링 입문 유키 히로시 지음, 서수환 옮김
프로그램을 만드는 것은 하나의 예술 작품을 만드는 것과 같다. 왜 예술 작품을 만드는 것과 같냐면, 만들어 놓고 끝이 아니라 예술의 미를 유지하기 위해서 지속적인 유지와 보수가 필요하며 꾸준한 리뉴얼을 필요로하기 때문이다.(물론 미술의 경우 리뉴얼은 없다.) 특히나 간략하며 깔끔하고 가시성이 뛰어나 한눈에 파악 가능한 코드는 다른 사람과의 협업을 증진시킬 뿐만 아니라 본인의 능력을 공고화 하는데에 도움을 준다. 왜 공고화 하는데에 도움이 되느냐? 가시성이 뛰어나며 한눈에 파악 가능한 코드는 유지 보수가 용이할 뿐만 아니라, 추후 API 업데이트나 혹은 새로운 기술을 접목 시킬때에 효율적이며 에러 없는 업데이트 환경을 제공해주기 때문이다. 이러한 특징 때문에 대부분의 현업 프로그래머들은 자신의 프로젝트를 항상 리팩토링하며 보다 효율적인 코드의 배열이 되도록 노력한다. 이 번에 본 블로거는 새로운 프로젝트에 접목시킬 리팩토링과 관련된 보다 기초를 튼튼히할 학습이 필요했다. 하여 리팩토링과 관련된 서적들을 찾던 중 위의 책을 발견하였고 그 속에서 뛰어난 의미와 가치를 찾아냈다. 【어떤 독자를 위한 책인가】 본 도서 '자바로 배우는 리팩토링 입문'은 단순 자바 프로그래머만을 대상으로하는 것이 아니다. 물론 책은 자바 베이스로 작성되었으나, 이를 다른 언어 기반의 프로젝트에 충분히 적용 시킬 수 있으며, 리팩토링에 관한 튼실한 기초 지식을 제공하고 있기 때문에 리팩토링이란 무엇인지에 관한 독자의 간지러움을 시원이 긁어줄 것이다. 이 책의 대상 독자는 입문자가 대상이나 중급자 혹은 나아가 고급자도 자신의 지식을 견고히 하기 위해 읽어보실 것을 권한다. 책의 저자 '유키 히로시'씨는 다년간의 IT 서적을 집필한 노하우 있는 프로그래머로써 독자의 기대치에 충분히 만족할 만한 지식을들을 책에 담아두었기 때문이다. (물론 이를 한국 독자가 적절히 이해할 수 있게 끔 옮겨주신 서수환 님께도 박수를 보낸다.) 【책의 구성】자바로 배우는 리팩토링 입문 이것만은 알고 시작하자, UML 0장 리팩토링이란 0.1 리팩토링이란 0.2 리팩토링과 악취 0.3 리팩토링 카탈로그 0.4 리팩토링 에센스 0.5 리팩토링 Q&A 0.6 연습 문제 0.7 연습 문제 해답 1장 매직 넘버를 기호 상수로 치환 _소스 코드에 100이라고 적힌 경우 1.1 리팩토링 1.1.1 매직 넘버를 기호 상수로 치환 1.2 예제 프로그램 1.2.1 리팩토링 전 1.2.2 리팩토링 실행 1.2.3 리팩토링 후 1.3 한 걸음 더 나아가기 1.3.1 분류 코드를 클래스로 치환하기 1.3.2 enum 1.3.3 기호 상수가 적합하지 않은 경우 1.3.4 바이트 코드에 내장된 상수에 주의하기 1.4 정리 1.5 연습 문제 1.6 연습 문제 해답 2장 제어 플래그 삭제 _제어 플래그 때문에 코드가 읽기 어려운 경우 2.1 리팩토링 2.1.1 제어 플래그 삭제 2.2 예제 프로그램(FindInt) 2.2.1 리팩토링 전 2.2.2 리팩토링 실행(break 사용) 2.2.3 리팩토링 실행(return 사용) 2.3 예제 프로그램(SimpleDatabase) 2.3.1 리팩토링 전 2.3.2 리팩토링 실행 2.4 한 걸음 더 나아가기 2.4.1 break나 return을 쓰면 가독성이 좋아지는 이유 2.4.2 인스턴스 필드로 만든 제어 플래그의 위험성 2.4.3 플래그명 2.4.4 boolean 이외의 플래그 2.4.5 정규 표현식 패키지 사용 2.5 정리 2.6 연습 문제 2.7 연습 문제 해답 3장 어서션 도입 _‘이렇게 될 것이다’라는 주석이 있는 경우 3.1 리팩토링 3.1.1 어서션 도입 3.2 예제 프로그램 3.2.1 리팩토링 전 3.2.2 리팩토링 실행 3.2.3 리팩토링 후 3.2.4 컴파일과 실행 3.3 어서션 동작 확인 3.4 한 걸음 더 나아가기 3.4.1 자바 어서션 문법 3.4.2 어서션은 에러 처리를 대신할 수 없음 3.4.3 자바 어서션은 클래스 라이브러리가 아님 3.4.4 어서션 완전 삭제 3.4.5 다른 언어 환경의 어서션 3.5 정리 3.6 연습 문제 3.7 연습 문제 해답 4장 널 객체 도입 _null 확인이 너무 많은 경우 4.1 리팩토링 4.1.1 널 객체 도입 4.2 예제 프로그램 4.2.1 리팩토링 전 4.2.2 리팩토링 실행 4.2.3 리팩토링 후 4.3 한 걸음 더 나아가기 4.3.1 팩토리 메서드 패턴 4.3.2 싱글톤 패턴 4.3.3 널 객체로 중첩 클래스 사용 4.3.4 null 확인은 나쁜가 4.3.5 패턴 중독에 빠지지 않기 4.3.6 상수와 널 객체 4.3.7 isNull 메서드는 필요한가 4.3.8 기존 클래스를 수정할 수 없다면 4.4 정리 4.5 연습 문제 4.6 연습 문제 해답 5장 메서드 추출 _코드가 너무 길어서 읽기 어려운 경우 5.1 리팩토링 5.1.1 메서드 추출 5.2 예제 프로그램 5.2.1 리팩토링 전 5.2.2 리팩토링 실행 5.2.3 리팩토링 후 5.3 한 걸음 더 나아가기 5.3.1 역 리팩토링 5.3.2 메서드 추출은 당연한가? 5.3.3 메서드가 길어지는 경우 5.4 정리 5.5 연습 문제 5.6 연습 문제 해답 6장 클래스 추출 _클래스의 책임이 너무 많은 경우 6.1 리팩토링 6.1.1 클래스 추출 6.2 예제 프로그램 6.2.1 리팩토링 전 6.2.2 리팩토링 실행 6.2.3 리팩토링 후 6.3 한 걸음 더 나아가기 6.3.1 양방향 링크는 피한다 6.3.2 기능 추가와 리팩토링 6.3.3 불변 인터페이스 6.3.4 역 리팩토링: 클래스 인라인화 6.4 정리 6.5 연습 문제 6.6 연습 문제 해답 7장 분류 코드를 클래스로 치환 _int로 객체를 구분하는 경우 7.1 리팩토링 7.1.1 분류 코드를 클래스로 치환 7.2 예제 프로그램 7.2.1 리팩토링 전 7.2.2 기본 타입을 사용한 분류 코드의 문제점 7.2.3 리팩토링 실행 7.2.4 리팩토링 후 7.3 한 걸음 더 나아가기 7.3.1 기본 타입을 사용한 분류 코드의 문제점 7.3.2 enum 7.4 정리 7.5 연습 문제 7.6 연습 문제 해답 8장 분류 코드를 하위 클래스로 치환 _분류 코드마다 동작이 다른 경우(1) 8.1 리팩토링 8.1.1 분류 코드를 하위 클래스로 치환 8.1.2 구조와 동작 8.2 예제 프로그램 8.2.1 리팩토링 전 8.2.2 리팩토링 실행 8.2.3 리팩토링 후 8.3 한 걸음 더 나아가기 8.3.1 switch 문과 instanceof 연산자가 풍기는 악취 8.3.2 객체 생성 switch 문 삭제 8.3.3 팩토리 메서드 여러 개 준비하기 8.3.4 어디까지 리팩토링해야 하나 8.4 정리 8.5 연습 문제 8.6 연습 문제 해답 9장 분류 코드를 상태/전략 패턴으로 치환 _ 분류 코드마다 동작이 다른 경우(2) 9.1 리팩토링 9.1.1 분류 코드를 상태/전략 패턴으로 치환 9.2 예제 프로그램 9.2.1 리팩토링 전 9.2.2 리팩토링 실행 9.2.3 리팩토링 후 9.3 코드 추가 수정 9.3.1 enum 사용 9.3.2 상태 의존 코드를 상태 객체로 이동 9.3.3 코드 추가 수정 9.4 한 걸음 더 나아가기 9.4.1 분류 코드를 치환하는 세 가지 방법 비교 9.4.2 상태 패턴과 전략 패턴의 차이 9.4.3 다형적 해결로 default 제거 9.5 정리 9.6 연습 문제 9.7 연습 문제 해답 10장 에러 코드를 예외로 치환 _에러 처리가 흩어져 있는 경우 10.1 리팩토링 10.1.1 에러 코드를 예외로 치환 10.2 예제 프로그램 10.2.1 리팩토링 전 10.2.2 리팩토링 실행 10.2.3 리팩토링 후 10.3 코드 추가 수정 10.3.1 분류 코드를 상태/전략 패턴으로 치환 10.4 한 걸음 더 나아가기 10.4.1 검사 예외와 비검사 예외 10.4.2 예외 계층 10.4.3 java.io.EOFException에 대해 10.4.4 비검사 예외와 사전 확인용 메서드 10.4.5 실패 원자성 10.5 정리 10.6 연습 문제 10.7 연습 문제 해답 11장 생성자를 팩토리 메서드로 치환 _클래스 이름이 new로 하드 코딩된 경우 11.1 리팩토링 11.1.1 생성자를 팩토리 메서드로 치환 11.2 예제 프로그램 11.2.1 리팩토링 전 11.2.2 리팩토링 실행 11.2.3 리팩토링 후 11.2.4 분류 코드를 하위 클래스로 치환 리팩토링 실행 11.2.5 리팩토링 후 11.3 한 걸음 더 나아가기 11.3.1 프로바이더 11.3.2 매개변수 문제 11.3.3 팩토리 메서드와 생성 메서드 11.4 정리 11.5 연습 문제 11.6 연습 문제 해답 12장 관측 데이터 복제 _모델과 뷰가 뒤섞여 있는 경우 12.1 리팩토링 12.1.1 관측 데이터 복제 12.2 예제 프로그램 12.2.1 리팩토링 전 12.2.2 리팩토링 실행 12.2.3 리팩토링 후 12.3 한 걸음 더 나아가기 12.3.1 이벤트에 포함된 정보 12.3.2 무엇을 이벤트 리스너로 할 것인가 12.3.3 무한 반복에 주의 12.3.4 다른 이벤트 리스너 추가하기 12.4 정리 12.5 연습 문제 12.6 연습 문제 해답 13장 상속을 위임으로 치환 _IS-A 관계가 아닌데 상속하고 있는 경우 13.1 상속과 위임 13.1.1 상속 13.1.2 위임 13.1.3 상속과 위임 비교 13.2 리팩토링 13.2.1 상속을 위임으로 치환 13.3 예제 프로그램 13.3.1 리팩토링 전 13.3.2 새로운 의문 13.3.3 리팩토링 실행 13.3.4 리팩토링 후 13.4 생성자 연쇄 13.5 한 걸음 더 나아가기 13.5.1 상속은 최후의 무기 13.5.2 리스코프 치환 원칙 13.5.3 IS-A 관계와 HAS-A 관계 13.6 정리 13.7 연습 문제 13.8 연습 문제 해답 14장 대리자 은폐 _위임 대상까지 노출되어 있는 경우 14.1 리팩토링 14.1.1 대리자 은폐 14.2 예제 프로그램 14.2.1 리팩토링 전 14.2.2 1회째 리팩토링 실행 14.2.3 1회째 리팩토링 후 14.2.4 2회째 리팩토링 실행 14.2.5 2회째 리팩토링 후 14.3 한 걸음 더 나아가기 14.3.1 ‘숨기기’의 중요성 14.3.2 다양한 은폐 14.3.3 중개자 제거 14.3.4 클래스 인라인화 14.4 정리 14.5 연습 문제 14.6 연습 문제 해답 15장 상속 구조 정리 _상속이 엉켜 있는 경우 15.1 리팩토링 15.1.1 상속 구조 정리 15.2 예제 프로그램 15.2.1 리팩토링 전 15.2.2 의문점 15.2.3 리팩토링 실행 15.2.4 리팩토링 후 15.3 한 걸음 더 나아가기 15.3.1 직교성 15.3.2 상속과 @Override 15.4 정리 15.5 연습 문제 15.6 연습 문제 해답 부록 부록 A 리팩토링 목록 부록 B JUnit 부록 C 참고 문헌과 웹 사이트
- '자바로 배우는 리팩토링 입문' 서는 근래 본 블로거가 읽었던 수많은 IT 서적중에서 내용의 군더더기가 없고 깔끔한 책에 손꼽힌다. 특히나 출판사의 정성이 가득 담겨있는 본서는 구성부터 디자인까지 정말 본 블로거의 기대치를 만족하고도 남는 책이였다. 각각 챕터마다 확실한 넘버링이 되어있어 나중에 해당 문제에 마주쳤을 때, 언제든 참고할 수 있는 책의 구성 역시 너무나 마음에 들었다. 【'자바로 배우는 리팩토링 입문'을 읽고…….】 요즘은 오픈 소스 프로젝트가 상당히 유행하고 있다. 아니 전부터 많은 관심을 받아왔는데 인공지능과 관련된 프로젝트가 오픈화 되면서 보다 보급화 되고 대중화가 되었다고 보는게 맞는거 같다. 이러한 오픈 프로젝트는 수많은 개발자들의 손을 거치면서 셀수 없을 만큼의 리펙토링 과정을 거쳐서 탄생하고 발전되어간다. 아마도 그 대표 프로젝트로 리눅스를 선택할 수 있을 것이다. 본 블로거도 몇가지 오픈 프로젝트를 만들어 진행하고 있는데, 한국 개발자분들 보다 특히 외국 개발자들이 오픈 프로젝트에 더 많은 관심을 갖는 다는 사실을 알게되었다. 좀 안타까운 현실이다. 이번 위의 도서를 통해 많은 사람들이 리팩토링에 관심을 가지고 공개된 프로젝트에 자신들의 재능을 기부하길 꿈꿔본다. 【점수…….】 구성 : ★★★★☆ 내용:★★★★☆ 디자인: ★★★★☆ 전문성 : ★★★☆☆ #본 리뷰는 리뷰자 김종욱의 저작권에 귀속되므로 참고시 참고 URL과 명시를 저작자에게 알려주시길 바랍니다. #본 리뷰의 점수 및 평가 내용은 김종욱 리뷰자의 한정된 것이므로 확정된 답이 안임을 명시합니다. #학습과 관련된 질문과 문제에 대한 질문은 일절 받지 않습니다. 스스로 찾아서 학습하는 것 그것이야 말로 진정한 학습자입니다. ###### 감사합니다 ###### |