|
바쁘신 분들을 위한 요약은 아래와 같습니다. """ 좋은 소재를, 글은 쓰고 싶지만 자신의 생각을 정리하지 않은 채로 자신감만 넘치는 저자. 독자를 위해서는 커녕, 프로그래밍 관련 지식은 단 1도 가지지 않은, 애시당초 편집 의지가 전혀 없는 편집자. 이런 두 사람이 만나서 만들어낸 대환장의 콜라보. """ 근거 없는 책 비판은 설득력이 없으므로 제가 이 책을 읽으면서 위와 같이 생각한 이유들을 쭉 나열해 보겠습니다. 소감은 제일 하단에 적었습니다. 1. 84p * 이 인터페이스의 이름이 "예언" 혹은 "예측" 이라는 뜻을 가지고 있어서 우리나라 개발자들이 ... (중략) → predicate 는, (사실이라고) 단정하다 혹은 근거를 두가, 입각하다라는 뜻을 가지고 있습니다. 그러므로 boolean 값을 리턴하는 아주 상식적인 이름을 이름입니다. 저자가 말하는 것은 predict 일 겁니다. 완전히 잘 못 알고 있고, 자신감이 넘치니 사전을 확인하는 기본적인 과정조차 무시했습니다. 2. 162p * 만일 위의 데이터를 예제 5.20에 적용하면 정상적으로 컴파일은 되지만 실행 시 NullPointerException이 발생한다. → 주어진 데이터를 예제 5.20 에 적용하면 정상적으로 실행됩니다. 소스 코드 확인도 안하나 봅니다. 3. 174p * 사진으로 대체합니다. 붉은색으로 된 부분은 제가 수정한 것입니다.
4. 175p * 동일한 절차로 최솟값은 1이 출력된다. → 실제로는 0 이 출력됩니다. 예제 검증 따위는 하지 않나 봅니다. 5. 191p * 등록된 3개의 스레드가 순차적으로 그리고 무한 반복하며 실행되는 것을 확인할 수 있다. → 무한 반복되지 않습니다. 애시당초 한번만 호출되는 schedule 메서드를 사용하고 있으면서 설명은 scheduleWithFixedDelay 에 대한 설명을 하고 있습니다. 6. 191p * 예제 6.2에서는 MyTask 객체를 최초 2초 대기한 후 실행하고, 종료하면 다시 2초를 대기했다가 실행시키라는 의미이다. → 예제 6.2 에서는 scheduleWithFixedDelay 메서드는 사용하지도 않았습니다. 실제 예제도 한번만 실행되고 종료됩니다. 7. 194p * 예제 6.4에서는 MyTask 객체를 최초 ... (중략) → 예제 6.4 에서는 MyTask 클래스를 사용하지도 않습니다. 8. 208p * 이 예제에서는 4개의 고정된 스레드 풀을 ... (중략) → 예제에서는 뻔히, Executors.newFixedThreadPool(2) 라고 되어 있습니다. 9. 219p * Iterator 자체가 단어 뜻 그대로 반복문 이라서 ... (중략) → Iterator 의 단어 뜻은 '반복자' 입니다. '반복문'이 아닙니다. 당장 구글 검색만 해봐도 위키에 떡하니 나오는 내용입니다. 반복자가 반복문에 많이 사용될 지언정, Iterator 가 '단어 뜻 그대로' 반복문이다??? 10. 300p → isMatchedFile 이라는 boolean 값을 리턴하는 메서드를 정의해 놓고서는 예제에서는 isMatched(file); 이렇게만 사용하고 있습니다. 리턴 값은 사용하지도 않고, 예제 설명에서는 원하는 파일을 찾아내는 코드라고 말하고 있습니다. 11. 331p * 사진으로 대체합니다. 붉은색으로 된 부분은 제가 수정한 것입니다.
→ 그냥 글로 쓰려다가 하도 어이가 없어서 사진으로 보여드리고 싶었습니다. 처음 볼 때는 plusMonth, minusMonth 는 내가 모르는 연산 방식이 있나 의심했었습니다. 이쯤되니 이 책은 그냥 저자와 편집자가 아무 생각없구나 싶더군요. 12. 358p * LocalDate transferDate = currentDate.with(new CustomAdjusterExample()); → LocalDate transferDate = currentDate.with(new CustomTemporalAdjuster); 저자가 자신이 쓴 소스도 제대로 인용하지 못하고 있습니다. 13. 375p * 예제 9.2, 9.3 → package 선언이 빠져 있어서 unnamed package is not allowed in named modules 오류가 발생하면서 빌드가 실패합니다. 책 내용에 모듈 관련하여 package 선언이 필수 입니다라는 내용은 없습니다. 14. 384p * 예제 9.1에서 만든 모듈에 위의 코드를 추가한 후 ... (중략) → 별도의 dao 디렉터리를 먼저 생성한 후 이곳에 코드를 추가해야 합니다. 이 책은 책 내용만 따라가다는 큰 코 다칩니다. 15. 506p * 첫번째 printCollection 메서드. → 완전히 잘못 인용되어 있습니다. 503p 의 printCollection 메서드가 인용되어야 하지만 본문 두번째에 나오는 printCollection 과 중복 기재되어 있습니다.
위의 실수들은 특히 인상 깊었던 것들이고요. 책의 에제 코드들에도 문제가 심각합니다. - 소스 코드에도 없는 클래스가 갑자기 튀어나오지를 않나 (TravelInfoV0 클래스) - 소스 코드에서 단 한 줄이 변경될 뿐인데 소스 전체 소스 코드를 수록하기도 하고 (예제 5.1, 5.2, 5.3, 4.16, 5.7, 5.9, 5.12 등등) - 예제에서 package 와 import 선언이 있다가도 없고 없다가도 있고... - 아래의 코드가 과연 보기 좋을까요? try (DirectoryStream<Path> entries = Files.newDirectoryStream(path)) { for (Path entry : entries) { 책의 편집상 어쩔 수 없는 부분이라고요? 그러면 256p 의 예제 7.8의, main 함수의 args 검사하는 부분의 System.out.println 라인은 왜 책의 너비를 어겨서라도 한 줄로 표시하고 있나요? - 7장 전체 예제, 제발 args 검사하는 부분 좀 빼세요. 그냥 책 전반에 이 코드가 공통적으로 사용된다라고 한번만 보여주면 됩니다. 토시 하나 안 틀리고 똑같은, 그것도 이 책을 읽을 정도면 누구나 알 정도의 수준의 코드를 참 열심히도 넣으십니다.. - 265p, 인터페이스이며 클래스가 아니다 → 자바에 인터페이스 이면서 클래스인 것이 있던가... - 266p, "파일 열기 옵션" 이었다가 "파일 오픈 옵션" 이었다가... - 예제 7.21, 7.22, "c:\windows" 였다가, "C:\Windows" 였다가, "C:\windows" 였다가... - 예제 7.27, AccessDeniedException 이 발생합니다. - 4장 예제들에서 쓰레드를 사용했으면 완전히 종료를 하세요. 예제들이 실행하면 하나같이 쓰레드를 실행하고 종료가 안되는 코드들임. - IDE 에서 자동 완성으로 생성해주는 수준의 Person 클래스로 얼마나 많은 페이지가 낭비되는지는 말도 못할 수준. 책에서 모든 소스 코드를 보여주기 위함이라고요? 그러면 예제 11.17 의 HouseAttributes.java 파일은 왜 또 기재하지 않았는지? - 예제를 쓸 때는 항상 완성형의 예제를 기재하세요. TravelInfoV0 이따위 작명 코드 사용하지 마시고. - 소스 코드 최적화 및 편집의 힘만 있었다면, 과장 하나도 보태지 않고 책 분량이 100 페이지 이상 줄었을 겁니다.
(어이 없는) 오탈자 (앞의 숫자는 페이지를 의미합니다. 출판사 책 소개 페이지의 공식 정오표에 있는 내용은 뺐습니다.) 52, 133, 134, 필리핀과 태국 스팰링 틀림 134, TravelInfoVO의 국가 코드 값을 비교하기 위해 ... (중략), TravelInfoVO 가 아니라 TravelInfoV0 158, 위의 예제에서 사용한 groupBy 메서드는 ... (중략), groupingBy 임. 170, 여기서 중요한 것은 collect ... 놓았다, 문장을 길게 쓰려고만 하다보니 주어와 동사가 매치가 안됨. 221, 샘플 데이터를 생성하는 메서드를 제공하고 있다. getSampleData 메서드는 없지만 getSampleDate 는 있음. 예제 6.14가 date 와 관련된 예제일까? 전혀. 그래도 이건 계속 꾸준히 getSampleDate 라고 일관되게 쓰고 있음. 339, (전략) ... 이용해서 파싱을 시도하면 될 것 같은 StringBuilder를 이용해서... (후략), → 이용해서 파싱을 시도하면 될 것 같은데 ... 358, (전략) ... TemporalQueires 에서 제공하는 것이다. → TemporalQueries 375, (전략) ... 이유로 필자도 c:\insight_proejct를 프로젝트 ... → insight_proejct 가 아니라 insight_book 으로 해야 함 → proejct 스팰링도 틀렸음 492, 그리고 여기서는 T1, T2와 같은 형태로 정의했는데... (후략) → Type1, Type2 와 같은 형태임. 510, 그리고 코드를 명확하기 위해서... (후략) → 그리고 코드를 명확하게 하기 위해서
* 소감 이 책을 보시려는 분들은 자바 8 이후의 새로운 기능들을 학습하고자 하시는 분들이 많으실 것이라고 생각됩니다. 저도 같은 생각이었고요. 이 주제를 다루는 다른 책을 놔두고 이 책을 선택한 이유는, 가장 "최근에 출간된 책 + 국내 저자" 이 두가지 이유 때문이었습니다. 하지만 결과는 위와 같고요. 독자로서 책을 읽은 것이 아니라 베타 리더가 된 기분이었습니다. 예제가 컴파일이 안되고, 책에서 말하는 내용과 다른 결과가 나오기 시작하면서부터 조금이라도 미심쩍은 부분은 자바 문서를 참고하며 책의 내용을 검증해야만 했습니다. 다행스럽게도 자바 8이후의 기능들을 다루는 책들이 많이 있습니다. 보셔야 한다면 이 책만은 꼭 피해서 보세요. 그래도 이 책을 보고 싶다면 적어도 1판 3쇄 이후에 보세요(2쇄 아닙니다. 최소 3쇄 이후에 보세요). 2판이 나왔다고요? 보지 마세요. 또 다시 예제 코드로 뒷통수 맞고 오탈자가 난무하는 책을 보시게 될 테니까요. 2판 3쇄 이후에 사서 보세요. 이거 다음에 인사이트에서 출간한 다른 책을 보려고 계획중이었는데, 이제는 좀 두렵네요. 번역본이고 워낙 유명한 책이니, 이런 어이 없는 저자를 만나지는 않겠지만...인사이트의 편집은 참 할 말이 없습니다. 제 글을 보고 저자나 편집자중 누구 하나라도 '에이, 똥 밟았네' 라고 생각하신다면 뭐...딱 그 수준이라는 소리일테고, 부디 자신의 이름에 부끄럽지 않은 책을 집필, 편집 하시길 바랍니다.
|
|
이 책은 최신의 자바 버전들(자바 14까지)에 대한 내용들을 소개한 책입니다. 간략하게 새로운 기능들을 소개하면서도 예제 코드도 포함되어 있는 게 장점입니다. 자바는 그저 언어가 아니라 생태계로서 자리를 잡았습니다. 그 위에 새로운 언어가 만들어지기도 하고, 버전 정책도 바뀌었기 때문에 언어 자체로도 진화를 계속 해나갈 겁니다. 혹자는 자바가 죽었다, 문법이 세련되지 못하다 등 자바를 탓하지만 그 내용을 들어보면 대개 자신이 근무하는 환경에 대한 것이거나 아직 스스로도 자바 또는 객체지향을 제대로 이해하지 못하는 경우일 때가 많습니다. 언어마다 장단점이 있는 법이고, 자바의 생태계에 동의하든 안하든 그저 이해한 채 잘 사용할 줄 아는 것이 더 중요하다는 사실을 인지한다면 자바는 충분히 쓸 만한 언어라는 데에 동의할 수 있을 겁니다(사실 언어가 뭐 그리 중요하겠습니까). 전자책으로 구매했는데 가로로 긴 부분들은 내용이 조금 짤려? 있네요. 고쳐졌으면 좋겠습니다. |
|
자바 10년차 개발자입니다. 이제까지 여러 자바 책을 봐왔지만, 이번에 이 책은 저자의 성의가 많이 부족해 보입니다. 미리보기나, 목차만보고 , 책과, ebook을 동시에 구매했는데. 초반에 내용은 그럭저럭 했으나 후반부로 갈수록 너무 내용이 오타도 있고, 구성은 초보자도 알만한 내용으로 구성되어져 있습니다. 책을 산것이 후회가 되네요. |