코틀린에서는 함수가 매우 간결하게 선언되며, 이는 언어의 강점 중 하나입니다. 역사적으로 자바에서는 함수가 클래스(메소드)에 강하게 결합되어 있으며, 이름 있는 파라미터와 기본 파라미터를 지원하지 않아 자주 중복된 메소드를 만들어야 합니다. 반면, 코틀린에서는 함수를 최상위 수준(top-level)에서 선언할 수 있으며, 파라미터가 훨씬 유연합니다.
문제: 자바에서는 다양한 인자 조합에 대해 별도의 중복을 만들어야 하는 경우가 많습니다. 이는 불필요한 코드와 유지보수를 복잡하게 만듭니다.
해결책:
코드 예시:
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, User! greet("Alex") // Hello, Alex! greet(greeting = "Hi", name = "Olga") // Hi, Olga!
주요 특징:
기본 인자는 바이트코드에서 함수 시그니처의 일부입니까?
아니요, 코틀린은 자바와의 호환성을 보장하기 위해 별도의 synthetic overload 메소드를 컴파일하지만, JVM 수준에서 함수 시그니처는 변경되지 않습니다.
이름 있는 인자와 위치 인자의 순서를 바꾸면 어떻게 됩니까?
위치 인자는 이름 있는 인자보다 먼저 와야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.
잘못된 사용 예:
greet(greeting = "Hey", "Ivan") // 컴파일 오류
자바에서 코틀린처럼 클래스를 벗어난 함수 선언이 가능합니까?
아니요, 자바에서는 각 함수가 반드시 어떤 클래스의 메소드여야 합니다. 코틀린에서는 top-level 함수가 허용되어 코드가 더 깔끔하고 테스트하기 쉬워집니다.
부정적인 케이스
큰 안드로이드 프로젝트에서 개발자는 5-6개의 위치 인자와 중복을 가진 API 클라이언트 메소드를 구현하였고, 이는 호출 시 자주 오류를 발생시키고 큰 중복 코드를 초래했습니다.
장점:
단점:
긍정적인 케이스
기본 파라미터와 이름 있는 파라미터가 있는 함수를 사용하여 컴팩트한 시그니처를 얻고 중복의 필요성을 없애고 오류 위험을 줄이며 API의 유지 관리 편의성을 높였습니다.
장점:
단점: