[서평] 자료구조와 함께 배우는 알고리즘 입문 자바편

By | 2018/05/22

자료구조와 함께 배우는 알고리즘 입문 자바편

처음 자료구조를 배운 것은 대학교 3학년 1학기 전공수업이다. 2학년 1학기에 C++과 JAVA를 배웠고, 2학년 2학기 때 C#으로 혼자 개인프로젝트 삼아 GUI 프로그래밍을 해 본 직후라 뭔가 코딩에 대한 초보의 열정이 솟구치던 때다. 자료구조를 배우지 않은 상태에서도 내가 필요한 윈도우 프로그램을 뚝딱뚝닥 만들어낼 수 있었기에, 처음 자료구조를 배우면서 이런걸 왜 배워야하나 싶은 생각을 했었다. 스택과 값 삽입/삭제/검색 등... 응? 이건 다 ArrayList에 이미 다 구현되어있는데? 왜 배워야하지? 이런 안일함에 파묻혀 있었다.

스택이나 큐, 정렬, 트리 등의 기본 자료구조는 이미 모든 언어에서 매우 잘 구현되어 있기 때문에 굳이 내가 새로 구현할 필요는 없지만, 시간이 지나면서 자료구조를 잘 이해하고 활용하는 능력, 그리고 이것에 기반하여 내가 필요한 알고리즘을 잘 구현해내는 그 능력이 부족함을 느끼기 시작했다. 뭔가 개발을 하면서도 더 좋은 방법이 있을 텐데라는 생각이 드는 것이다. 지금 내가 구현한 것이 최선인가? 더 좋은 알고리즘을 생각하는 능력은 어떻게 기를 수 있을까? 어디서부터 다시 공부해야하는 것일까? 라는 의문을 갖게 된 것이다.

10년이 지난 지금, 개발자는 아니지만 웹이든 앱이든 개발은 계속해왔음에도 불구하고, 누군가 내게 연습장과 펜을 주고 스택/큐 구현해봐, 또는 퀵소트 구현해보라고 하면 쉽게 슥삭슥삭 구현해낼 수 자신이 없다. 이런 불안감 탓인지, 항상 자료구조 다시 한번 공부해야지 마음만 먹으면서 옛날에 공부할 때 쓰던 자료구조 책은 내 책장 눈에 잘 띄는 곳에 항상 꽂아두었다.

마침 [자료구조와 함께 배우는 알고리즘 입문 자바편] 책이 나왔고, 이 책으로 다시 한번 자료구조/알고리즘을 공부해보기로 했다. 일본 공학교육협회에서 저작상을 수상한 프로그래밍 교육서라니. 일단 일본에서 쓰여진 책이라는 점이 크게 마음에 들었다. 다른 건 몰라도 IT관련 책들은 그림등을 곁들여서 (심지어 만화를 동원하기도!) 일본 서적이 초보가 이해하기 쉽게 쓰여진 책들이 많기 때문이다. 이 책도 그렇다. 책 표지에도 자신있게 적혀있다. "220개의 그림과 표로 쉽게 배우자!" 라고.

일단, 이 책의 제목이 [자료구조와 함께 배우는 알고리즘 입문]인데, 내 생각엔 알고리즘 입문이라기보다는 알고리즘을 곁들인 자료구조 입문이라는 제목이 더 어울리는 것 같다. 이 책에서는 크게 기본 자료구조인 스택/큐, 연결리스트, 트리, 그리고 여러 정렬 알고리즘 정도를 다루고 있다. 각 자료구조에 대한 상세한 설명과 이를 구현한 JAVA 소스코드 및 코드. 일본 번역서 답게, 각 자료구조들의 원리를 그림으로 한단계 한단계씩 아주 상세하게 설명하고 있어서 이해하기가 매우 쉬웠다. 사실 자료구조나 알고리즘등이 궁금할 때는 블로그를 찾아보는 편인데, 열정적인 블로거분들이 자료구조나 알고리즘의 동작 원리를 한땀한땀 그림을 그려가며 매우 친절하게 설명해놨기 때문이다. 이 책은 이미 그런 그림 설명을 매우 잘 포함하고 있어서 굳이 블로그를 찾아볼 필요 없이 책 하나로 쉽게 이해할 수 있었다. 당연히 풀소스코드를 제공하고 있지만, 설명된 자료구조/알고리즘을 더 나은 방향으로 직접 개선해볼 수 있도록 연습문제 제공하고 있다. 연습문제를 다 풀어보지는 못했지만, 해당 자료구조/알고리즘을 확실히 이해했는지 스스로 테스트 해 볼수 있는 적절한 수준의 난이도였다.

한가지 아쉬운 점으로는, 책 중반부부터 (연결리스트, 트리, 해시 등) 예제소스에 제네릭을 쓰고 있다. 그냥 스택/큐 예제에서 처럼 int형 값들을 가지고 설명하고 예제 소스코드를 작성해도 충분히 자료구조를 이해하는데 지장이 없는데, 굳이 제네릭을 사용했어야 했나 싶은 생각이 들었다. 이 책을 보는 정도의 독자는 JAVA에 능숙하기보다는 이제 막 JAVA 문법을 익히고 다음 단계로 나아가는 수준이 대부분일 것 같은데, 제네릭을 사용하고... 그냥 Integer 값들만 갖고 데이터 삽입/삭제를 설명해도 될텐데 로 데이터를 더 복잡하게 만든 부분이 좀 아쉬웠다. 갑자기 뒤로 갈 수록 예제코드 수준이 처음보다 확 복잡해지는 느낌. 괜히 막 Comparable 인터페이스 구현하고... 그래도 뭐 제네릭을 잘 이해하고 있는 독자라면 전혀 문제될 게 없다.

이제 막 JAVA 문법서(?)를 하나 떼고, 그 다음 단계 도약을 생각하고 있는 독자라면 이 책을 추천하고 싶다. JAVA와 함께 알고리즘과 자료구조의 기초를 한번에!

PS. 몇몇 오타를 찾았는데 책 내용을 이해하는데 크게 지장있는 것은 아니었다. 내용만 잘 이해했다면, 엇 요부분 잘못되었네! 하고 찾을 수 있는 정도? 이지스퍼블리싱 홈페이지에 수정 요청을 보내놨으니 곧 정오표가 나오지 않을까 기대한다.

PS2. 정렬 파트에서 도수 정렬이라는 말이 있어서 이건 뭐지 싶었는데, 알고보니 계수 정렬(count sort)이다. 일본어를 번역하면서 이렇게 번역한건지...

Category: