해당 챕터에서는 선언 및 호출 기능을 코틀린이 어떻게 개선했는지, 자바 라이브러리를 코틀린 스타일로 어떻게 변환하는지 알아보자. 이를 위해서 코틀린 컬렉션, 문자열 및 정규 표현에 초점을 맞추어 보도록 하자.
먼저, 컬렉션을 생성하는 법은 다음과 같다.
val set = hashSetOf(1, 7, 53) //set 생성
val list = arrayListOf(1, 7, 53) //list 생성
val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three") //map 생성
코틀린의 컬렉션과 관련하여 매우 다행인 점은, 자바의 컬랙션 클래스를 그대로 사용한다는 점이다. 따라서 자바 코드와 상호 작용하기 편리하다.
>>> println(set.javaClass)
class java.util.HashSet //kolin의 set은 java의 hashset class과 일치한다.
자바 컬렉션과 같은 클래스를 사용하지만, 코틀린은 더 많은 기능을 사용할 수 있다. 예를 들어, 함수를 통해 list에서 가장 큰 값(max)을 찾아내거나 가장 마지막 원소(last)를 가져올 수 있다. 이러한 함수를 사용하기 전에, 우선 코틀린의 함수 선언이라는 새로운 개념을 배워보자.
리스트에 있는 item을 출력하고 싶은데, 디폴트 형식 [1, 2, 3]이 아니라 (1; 2; 3) 형식으로 출력하고 싶다면 어떻게 할까? 장황한 프로그래밍을 사용해 볼 수도 있다. 예를 들어, 다음과 같은 방식으로 joinToString 함수를 프로그래밍해보자.
위의 함수는 joinToString(list, "; ", "(", ")")
과 같이 파라미터를 넘겨주어야 한다. 그런데 이때 다음과 같은 문제가 발생한다.
가독성 문제
joinToString(collection, " ", " ", ".")
와 같이 호출될 경우, String과 파라미터를 연결 짓기 어려워진다. 그런데 코틀린에서는 다음과 같은 표현이 가능하다.
//각 요소의 이름을 명시
joinToString(collection, separator = " ", prefix = " ", postfix = ".")
따라서 자바에 비해 가독성이 높다. (슬프게도, JDK나 Andriod framework가 포함된 메소드에서는 해당 기능을 사용할 수 없다고 한다🙁)
메소드의 과잉 오버로드
자바에서는 종종 하위 호환성을 위해 오버로드가 발생한다. 예를 들어, java.lang.Thread
에는 8개의 생성자가 존재한다. (이전 버전과의 호환을 위해 계속 생성자가 추가됨)
8개의 생성자 종류
그런데 코틀린에서는 위와 같은 문제가 생기지 않는데, 파라미터를 디폴트 값으로 명시할 수 있기 때문이다.