misoo***
2023-02-22

자바와 코틀린의 결을 비교하면서 자바에서 자주 쓰이는 기능을 어떤 코틀린 기능으로 이식할 수 있는지 차근차근 설명하는 책이다. 코틀린의 결에 맞게 값 중심의 함수형 프로그래밍, 널 가능성, 람다, 확장 함수, 결과 타입 등을 활용해 코드를 작성하면서 코틀린을 자유자재로 다뤄보자.
자바는 알고...있는데 너는 누구냐? 코틀린??
JVM 기반의 언어로 JAVA와 100%의 호환성을 보이는 코틀린.
하지만 이 책의 저자들은 코틀린은 자바와 "결"이 다르다고 말한다.
자바는 가변 객체와 리플렉션을 선호하며 합성성과 타입 안전성을 대가로 지블한다. 자바와 비교해서, 코틀린의 결은 불변 값을 변환하는 것과 독립적인 함수를 선호하며, 비침투적이고 도움이 많이 되는 타입 시스템을 제공한다. (자바에서 코틀린으로 p.530)
객체지향언어 JAVA의 세상에서 지내던 나에게 함수형 언어는 접근하기 쉬운 부분은 아니었다.
클래스, 인스턴스, 다형성, 상속성 이렇게 다양한 개념을 내가 얼마나 머리를 쥐어 뜯어가면서 공부를 했는데...'
자바와 완벽한 호환을 보이지만 결이 다르다는 코틀린.
이 책은 코틀린의 기초 설명, 문법등은 나오지 않는다.
그러므로 자바 8 이후 변경사항에 대해 알고 있고 코틀린에 대해 잘 알고 있다는 가정에서 시작한다.
이 책은 기존 자바로 개발되어 있는 가상의 프로그램 '트래블레이터'의 코드를 코틀린으로 변환하고 동시에 리팩터링 하는 과정을 보여준다. 이 과정을 통해서 왜! 코틀린인지, 코틀린은 언제 어떻게 사용할 수 있는지 알 수 있다. 그리고 함수형 프로그래밍의 사상을 엿볼 수 있다.
자바 개발자로 일하고 있지만 너무 많은 파일 들이 생성되고 수많은 클래스들이 있다.
스프링, 스프링 부트 프로젝트에는 의존성 주입 등 서로서로 너무 엉겨 붙어 있어서 실제 프로젝트에 들어가면 제대로 된 테스트 및 리팩터링은 정말 꿈도 꾸기 어려운 부분도 있다.
마틴 파울러의 리패터링 벽돌 책을 보며 한숨만 쉬고는 했다.
이 책을 보고 코틀린으로 변환하는 과정을 보면서
진짜 실무에서 바로 적용할 수 있는 방법들이 나와 있는 것이 좋았다.
그 예를 몇가지 소개해 보겠다.
자바 프로그래머들을 늘 괴롭히는 NULL에 대해 코틀린은 널으 포용하여 없음을 뜻하는 값을 일관성 있게 다를 수 있다는 것은 정말 매력적이었다. 코틀린의 안전한 호출 연산자를 사용하여 널이 될 가능성이 있는 참조를 확장함수를 사용하여 더 편리하게 호출 할 수 있다.
자바 프로젝트에서 자바빈과 POJO를 사용하여 데이터를 표현하는 것은 너무도 당연한 것이었다. 하지만 이렇게 변수로 값을 표현하게 하면 가변적이 되고 이는 복잡성을 야기한다. 하지만 값은 불변이다. 코틀린은 불변객체를 선호한다. 가변적이라고 하는 것은 상태가 변한다는 것이고 이는 어떤 장소의 상태가 다른 장소에서 예상하는 상태와 일치하지 않을 수 있으므로 생기는 여러 문제의 근원이다. 이는 에일리어싱(aliasing error)를 발생시킬 수 있다.
이는 '7장 동작에서 계산으로' 에서도 연관되어 나오는데 함수를 계산과 동작으로 나누어 보는 것이다. 동작은 언제, 얼마나 많이 호출되는냐에 따라 결과가 달라지는 함수라면 계산은 호출된 시간과 관계없이 항상 같은 결과를 내놓는다. 자바에서 우리가 작성하는 대부분의 메서드는 동작이다. 실행시점에 의존하기 때문이다. 프로그램에 어떤 함수가 있을 때 이 함수를 호출한 모든 부분에서 함수 호출을 그 함수 호출의 결괏값으로 치환해도 프로그램이 똑간이 작동할 때 이런 함수를 참조 투명한 함수라고 한다. 나는 이 부분이 가장 인상깊었다. 호출되는 시점! 그 보이지도 찾기도 어려운 그 시점 때문에 내가 얼마나 많은 삽질을 했던가! 이런 부분을 계산함수로 리펙터링 한다. 객체의 상태를 변경하는 대신 일부분이 변경된 새 객체를 반환하도록 하고 동작을 계산으로 변환하는 방법, 가변성을 불변성으로 바꾸어 코드를 더 잘 이해할 수 있도록하고 테스트하기 좋게 만드는 과정을 배울 수 있었다.
16장에서 소개되는 "인터페이스에서 함수로" 부분도 객체지향으로 프로그래밍하는 벙법과 함수로 접근하는 방법을 다각도로 비교 해본다. 코틀린 함수로 자바의 인터페이스를 대체하게되면 결합을 더 줄일 수 있다. 이어서 17장에서는 테스트를 위한 목(Mock)에 대해 나오는데 저자는 목 프레임워크가 인터페이스 구현뿐만 아니라, 예상되는 메서드 호출과 호출시 반환해야 하는 대용을 기술하게 해주는데, 이것이 메서드 호출과 예상 반환값을 이해하기 어렵게 만든다는 것이었다. 이 내용에 크게 공감이 되었다. 코틀린 코드 기반에서는 목을 사용하지 않는 것이 더 낫다고 한다.
코틀린은 정적 타입 지정언어로 모든 프로그램 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마나 컴파일러가 타입을 검증해 준다. 그래서 안전하다. 또한 함수형 프로그래밍의 특징인 불변성으로 일단 만들어지고 나면 내부 상태가 바뀌지 않는 불볍 객체를 사용한다. 그래서 Side Effect가 없다. 코틀린의 사용으로 프로그램의 복잡도를 줄이고 마이그레이션이 쉽다.
이 책은 손수 하나하나 찾아가며 고치는 리팩터링을 알려주기보다 인텔리J에서 제공하는 리팩터링 기능을 잘 사용하도록 해준다. 이러한 실용적인 방법을 알려주는 부분은 코틀린을 코틀린답게 설명하고 있다는 생각을 해보았다.
나는 코틀린에 대해 잘 몰랐다.
이 책의 코틀린 소스 한 줄 한줄 이해하기는 어려웠지만 코틀린이 어떤 언어인지, 어떠한 경우에 사용하는지 배울 수 있었다. 또한 함수형 프로그래밍 언어에대한 매력을 충분히 느낄 수 있었다.
자바 개발자라고는 하지만 이 책에서 자바코드를 코틀린으로 변환하는 과정에서 저자의 자바에 대해 깊은 지식 역시 함께 배웠다. (부부가 함께 이 책을 저술했다는데 중간중간 그들의 티키타카도 재미있었다.)
이 책은 자바 프로그래머로서 자바를 어떻게 더 잘 쓸 수 있는지 알 수 있게 해주었다.
그리고 코틀린을 통한 함수형 프로그래밍의 사상과 장점을 엿볼 수 있었다.
오늘 바로 서점에서 코틀린 프로그래밍에 대한 책을 구입했다.
자바에서의 생활이 조금은 회의감이 들기 시작했다면 코틀린으로 여행을 떠나보면 어떨까?
'트래블레이터' 앱으로 경로를 찾아보자!
그리고 저는 그 여행 강력하게 추천합니다!
"이 책은 한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성한 서평입니다 "