이름 붙인 인자 : 함수를 호출할 때는 함수에 전달하는 인자 중 일부의(또는 전부)의 이름을 명시할 수 있다.

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 {...}​

 

컴파일 할 경우 아래와 같이 직전에 생성 한 <join.kt> 소스 파일의 이름과 같은 자바의 class가 생성되고 그 안에 static 메서드가 생성고
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 정의 필수

 

 

 

 

 

 

+ Recent posts