이름 붙인 인자 : 함수를 호출할 때는 함수에 전달하는 인자 중 일부의(또는 전부)의 이름을 명시할 수 있다.
1
|
joinToString(list, separator = "; ", prefix = "(", postfix = ")")
|
cs |
디폴트 파라미터 값
1
2
3
4
5
6
|
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ",
prefix: String = "",
postfix: String = ""
)
|
cs |
설정 시
1
2
3
|
joinToString(list, ", ", "", "")
joinToString(list)
joinToString(list, ", ")
|
cs |
그러나 java에서 코틀린의 디폴트 파라미터 값을 가진 함수를 호출 할 때는 적용이 안된다
이를 해결하기 위해
1
2
3
4
5
6
7
|
@JvmOverloads
fun <T> joinToString(
collection: Collection<T>,
separator: String = ", ",
prefix: String = "",
postfix: String = ""
)
|
cs |
해당 함수에 @JvmOverloads를 붙이면
1
2
3
|
String joinToString(Collection collection, String separator, String prefix, String postfix)
String joinToString(Collection collection, String separator, String prefix)
String joinToString(Collection collection, String separator)
|
cs |
위같은 형태로 생성자가 자동으로 생성되어 자바에서도 코틀린의 디폴트 파라미터와 비슷한 형태로 사용할 수 있다.
최상위 함수
다음과 같이 join.kt라는 소스파일을 만들고 최상위 함수를 만들면 (class가 있는 경우 class 밖에 작성)
package strings
fun joinToString(...): String {...}
package strings;
public class JoinKt {
public static String joinToString(...) {...}
}
이를 사용하기 위해서는 코틀린에서는 패키지만 import 시키면 되고 자바에서는 패키지.클래스를 import 시켜줘야함
만약 클래스 이름을 바꾸고 싶다면
@file:JvmName("StringFunctions")
package strings
fun joinToString(...): String {...}
이와 같이 패키지 선언 전에 @file:JvmName 어노테이션에 변경하고 싶은 클래스의 이름을 지정하면 된다.
다음과 같이 최상위단에 프로퍼티를 선언할 수 도 있다.
val AA = "aa"
var bb = "bb"
이렇게 선언 시
public final class JoinKt {
private static final String AA = "aa";
private static String bb = "bb";
public static final String getAA() {
return AA;
}
public static final String getBb() { return BB; }
public static final void setBb(String bb) { this.BB = bb }
}
이렇게 private static final 로 멤버변수가 생성되고 만약 아래와 같이 const val을 붙이면
const val AA = "aa"
public final class JoinKt {
public static final String AA = "aa";
}
getter 없이 public static final 로 생성된다.
확장함수
다음과 같이 선언할 수 있고 확장한 수신객체에 마치 멤버변수가 추가된 것처럼 사용할 수 있다.
package strings
fun String.lastChar() : Char = this.get(length - 1)
println("kotlin".lastChar())
여기서 String은 수신객체타입, this를 수신객체라고 명칭한다.
확장함수를 사용할 때 import를 해야한다
import strings.lastChar 메서드명 까지 하거나 import strings.* 이렇게 전체도 가능하다.
한 파일안에서 다른 여러 패키지에 속해있는 이름이 같은 함수를 가져와야 할 경우
import strings.lastChar as last
val c = "Kotlin".last()
이렇게 as 키워드를 통해 확장함수 명칭을 다르게 사용해야한다.
이렇게 생성된 확장함수는 결국 자바의 static변수로 컴파일된다.
/* 자바 */
char c = StringUtilKt.lastChar("Java");
import strings.lastChar는 오버라이드할 수 없다.
정적 메서드 이기 때문에 오버라이드 불가
note! : 어떤 수신객체의 멤버 함수와 확장함수의 이름과 시그니처가 같다면 멤버변수가 우선적으로 호출
그래서 어떤 멤버변수를 추가 할 때 기존에 같은 이름과 시그니처를 가지고 있던 확장함수를 쓰던 부분이 전부 멤버변수를 호출하도록 바뀌기 때문에 주의해야 한다.
확장 프로퍼티
var StringBuilder.lastChar: Char
get() = get(length - 1)
set(value: Char) {
this.setCharAt(length - 1, value)
}
get 정의 필수