12장. 운영자를 위한 함수
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
대규모 Java 코드베이스가 있는 경우 당분간 Java와 Kotlin이 공존해야 할 것입니다. 시스템을 점차적으로 Kotlin으로 전환하면서 두 언어의 규칙을 지원하기 위해 무엇을 할 수 있을까요?
지금까지 Java에서 Kotlin으로 코드가 한 번에 번역되는 과정을 보여드렸습니다. 자동 리팩터링을 사용하여 안전하게 번역을 수행했지만 마지막에는 영향을 받는 모든 코드가 관용적인 Kotlin으로 변환되었습니다.
대규모 코드베이스에서는 이것이 항상 가능한 것은 아닙니다. Kotlin을 도입하는 동안 Java의 기능을 계속 발전시켜야 합니다. 둘 사이에 경계가 있는 경우 한쪽에서는 기존 Java를 사용하고 다른 한쪽에서는 기존 Kotlin을 사용하고자 합니다. 특히 시스템의 많은 기능을 지원하는 기본 클래스를 변환할 때 더욱 그렇습니다.
기초 수업: 돈
모든 시스템에는 코드베이스의 많은 부분에서 사용하는 몇 가지 기본 클래스가 포함되어 있습니다. Travelator의 예로 3장에서 처음 살펴본 Money 클래스를 들 수 있습니다. 여행자는 여행 예산을 책정해야 합니다. 다양한 여행 옵션의 비용을 비교하고, 해당 비용을 선호하는 통화로 환산한 금액을 확인하고, 물건을 예약하고, 비용을 지불하는 등의 작업을 수행하려고 합니다.
Money 클래스는 너무 널리 사용되기 때문에 이 클래스와 이 클래스에 의존하는 모든 코드를 한 번에 관용적인 Kotlin으로 변환할 수 없습니다. 변환이 진행되는 동안 Java와 Kotlin 모두에서 Money 을 사용하는 기능에 대한 작업을 계속해야 합니다.
이 경우 Scylla와 Charybdis 사이에서 고민하게 됩니다. Money 클래스는 그대로 두고 이에 종속된 코드를 Kotlin으로 변환하되 그 동안 종속 코드에서 사용할 수 있는 Kotlin 기능을 제한할까요, 아니면 Money 클래스를 사용하는 Java 코드를 그대로 두고 Kotlin으로 변환하여 종속 코드에서 Kotlin 기능을 사용할 수 있지만 나머지 Java 코드가 일관되지 않은 채로 남겨둘까요?
이러한 옵션까지 있다는 사실은 Kotlin/Java 상호 운용이 양방향으로 얼마나 잘 작동하는지 보여주는 증거입니다. 실제로는 어느 쪽을 선택할 필요가 없습니다. 몇 가지 교묘한 리팩터링 전술과 몇 가지 주석을 사용하여 Kotlin 컴파일러가 JVM용 코드를 생성하는 방식을 제어하면 두 가지 장점을 모두 활용할 수 있습니다. Kotlin에서 Money 을 정의하여 Kotlin의 기능을 활용하면서도 우리가 유지 관리하는 Java 코드를 위한 관용적 API를 제공할 수 있습니다.
3장에서 Money 클래스를 Kotlin으로 변환했는데, 그 장의 마지막에 남겨두었기 때문에 (죄송하지만) 이 클래스에 의존하는 Java 코드에 영향을 주지 않고 코드를 더 간결하게 만들 수 있었습니다. 대부분의 메서드를 ...