본문 바로가기

코틀린53

[Kotlin] @JvmOverloads @JvmOverloadsdefault parameter가 있는 함수를 자바에서 호출할 수 있도록 여러 오버로드를 생성한다. (자바는 기본값을 지원하지 않으므로 자바에서 defulat parameter가 있는 코틀린의 함수를 사용하려면 필수적) @JvmOverloadsfun findMessages(sender: String, type: String = "text", maxResults: Int = 10) {}원하는 함수 위에 @JvmOverloads를 선언만 해두면,public static void findMessages(String sender, String type, int maxResults) {}public static void findMessages(String sender, String type.. 2025. 3. 20.
[Kotlin] @JvmName @JvmName코틀린 선언의 자바 이름을 지정한다. 이름 충돌 해결에 유용.// PrintUtils.kt@file:JvmName("Utils") // PrintUtils.kt -> Utils 로 이름 변경해서 호출하도록 명시@JvmName(name = "printAllInts")fun printAll(list: List) { println(list)}@JvmName(name = "printAllStrings")fun printAll(list: List) { println(list)}는 자바에서public static void main(String[] args) { // PrintUtilsKt 대신 Utils 로 접근 Utils.printAllInts(Arrays.asList(1,.. 2025. 3. 20.
[Kotlin in Action] 5.4 자바 함수형 인터페이스 활용 코틀린에서는 무명 클래스 인스턴스 대신 람다를 넘길 수 있다.button.setOnClickListener { view -> ... } OnClickListener를 구현하기 위해 사용한 람다에는 view라는 파라미터가 있다. view의 타입은 View다. 이는 onClick 메소드의 인자 타입과 같다.public interface OnClickListener { void onClick(View v); // -> { view -> ... }}이런 코드가 동작하는 이유는 OnClickListener에 추상 메소드가 단 하나만 있기 때문이다. 이렇게 추상 메소드가 단 하나만 있는 인터페이스를 함수형 인터페이스(functional interface) 또는 SAM 인터페이스(Single Abstract M.. 2025. 3. 19.
[Kotlin] 무명 객체와 객체 선언 비교 & 람다와 무명 객체 차이 무명 객체와 객체 선언 모두 object 키워드를 사용하는데 어떻게 구별할까? 무명 객체(object expression)식이 실행될 때마다 새로운 객체 인스턴스가 생성fun main() { // 무명 객체를 사용하여 Runnable 인터페이스 구현 (인터페이스나 클래스를 상속 or 구현) val runnable = object : Runnable { override fun run() { println("Runnable is running") } } // 무명 객체의 run 메서드 호출 runnable.run() // 새로운 인스턴스 생성}// 단순한 익명 객체 생성val obj = object { val property = ".. 2025. 3. 19.
[Kotlin in Action] 5.3. 지연 계산(lazy) 컬렉션 연산 map이나 filter 같은 몇가지 컬렉션 함수는 결과 컬렉션을 즉시 생성한다.people.map(Person::name).filter { it. startsWith("A") }위와 같은 예제에서 filter나 map은 리스트를 2개 만들게 된다. 원본 리스트에 원소가 2개 밖에 없다면 리스트가 2개 더 생겨도 큰 문제가 되지 않겠지만, 원소가 수백만 개가 되면 훨씬 더 효율이 떨어진다.이를 더 효율적으로 만들기 위해서는 각 연산이 컬렉션을 직접 사용하는 대신 시퀀스를 사용하게 만들어야 한다.people.asSequence() // 원본 컬렉션을 시퀀스로 변환한다. .map(Person::name) .filter { it.startsWith("A") } .toList() // 결과 시퀀스.. 2025. 3. 19.