찾아본 내용
1. 코틀린에서 확장함수 사용 시 객체가 null이어도 메서드 호출을 할 수 있는 이유는? 자바에서의 static 메서드와 같이 동작해서 그런가? (p. 265)
코틀린의 확장 함수는 실제로 자바의 static 메서드로 컴파일됩니다. 즉, 확장 함수는 호출되는 대상 객체를 첫 번째 매개변수로 받는 자바의 정적 메서드와 유사하게 동작합니다. 이러한 구현 방식 덕분에, 확장 함수는 클래스의 일부가 아니기 때문에, 객체가 null일지라도 함수를 호출할 수 있습니다.
fun String?.isNullOrBlank(): Boolean {
return this == null || this.isBlank()
}
public class StringExtensions {
public static boolean isNullOrBlank(String string) {
return string == null || string.isBlank();
}
}
위의 kotlin 확장함수는 아래 자바의 정적 메서드로 변환된다.
2. 스프레드 연산자 *
(p.298)
코틀린에서 스프레드 연산자(*)는 주로 vararg (가변 인자) 매개변수를 다룰 때 사용됩니다. vararg 키워드는 함수가 임의의 수의 인자를 받을 수 있도록 해줍니다. 스프레드 연산자는 배열이나 리스트와 같은 집합적 데이터를 개별 인자로 펼쳐서 가변 인자로 받는 함수에 전달할 때 사용됩니다.
스프레드 연산자의 역할
함수가 여러 개의 인자를 받도록 설계되었지만, 인자들이 배열이나 리스트의 형태로 이미 존재하는 경우, 이 배열이나 리스트를 개별 인자로 하나씩 넘겨주어야 할 때 스프레드 연산자를 사용합니다. 예를 들어, 함수가 vararg 형식으로 여러 개의 String 인자를 받는다면, String 배열을 직접 인자로 넘기기 위해 스프레드 연산자를 사용할 수 있습니다.
사용 예제
예를 들어, 다음과 같은 vararg 매개변수를 받는 함수가 있다고 가정해보겠습니다:
fun printAll(vararg messages: String) {
for (m in messages) println(m)
}
이 함수는 여러 개의 문자열을 받아 출력할 수 있습니다. 만약 이미 String 배열이나 리스트가 있고 이를 함수에 전달하고 싶다면, 스프레드 연산자를 사용할 수 있습니다:
val words = arrayOf("Hello", "World", "Kotlin")
printAll(*words)
위 코드에서 *words
는 words
배열의 모든 요소를 printAll
함수의 vararg
인자로 전달합니다. words
배열의 각 요소는 printAll
함수에게 별도의 인자로 처리됩니다.
궁금한 내용
1. 자바와의 상호 운용성을 너무 신경써야하는 코틀린을 함수형 프로그래밍이라고 할 수 있을까?
Kotlin 공식 문서에 따르면 두가지 특성을 모두 가지고 있는 언어이므로, 두가지를 섞어서도 사용할 수 있다고 한다.
Stackoverflow나 Quora에서도 pure하지 않고 섞인 잡종 느낌이라고 한다.
'독서' 카테고리의 다른 글
[코틀린 인 액션] 9장. 제네릭스 (0) | 2024.05.19 |
---|---|
[코틀린 인 액션] 8장. 고차 함수: 파라미터와 반환 값으로 람다 사용 (0) | 2024.05.13 |
[코틀린 인 액션] 5장. 람다로 프로그래밍 (0) | 2024.04.14 |
[코틀린 인 액션] 4장. 클래스, 객체, 인터페이스 (1) | 2024.04.07 |
[코틀린 인 액션] 3장. 함수 정의와 호출 (0) | 2024.03.30 |