파라미터와 자료형은 타입추론 불가능
fun 함수명(파라미터):자료형 {
...
return 반환값 //종료
...
}
fun main(){
함수명(인자)
}
fun 함수명(파라미터) = 반환식
함수를 마치 클래스에서 만들어낸 인스턴스처럼 취급하는 방법
함수를 파라미터로 넘기거나 결과 값을 반환 받을 수도 있음
모든 함수는 고차함수로 이용 가능
fun main() {
b(::a)
}
fun a(str:String){
println("$str 함수 a")
}
fun b(function:(String)->Unit){
function("b가 호출한")
}
//b가 호출한 함수 a
b(::a)
function = a
function("b가 호출한")str = "b가 호출한"
println("b가 호출한 함수 a")
자체가 고차함수
별도의 연산자 없이도 변수에 담을 수 있음
fun main() {
val c: (String) -> Unit = { str: String -> println("$str 람다함수 a") }
val cc: (String) -> Unit = { str -> println("$str 람다함수 a") }
val ccc = { str: String -> println("$str 람다함수 a") }
b(c)
b(cc)
b(ccc)
}
fun b(function: (String) -> Unit) {
function("b가 호출한")
}
//b가 호출한 람다함수 a
//b가 호출한 람다함수 a
//b가 호출한 람다함수 a
a 함수 없이 람다함수로 작성 가능
- '->' 이후 부분에 여러 구문 작성 가능
'->' 이후 부분의 반환 값이 존재하는(Unit이 아닌) 경우, 마지막 구문이 반환됨- 파라미터가 없는 경우, 구문만 작성('->' 없이)
- 파라미터가 1개인 경우, 'it'으로 대체 가능
같은 스코프 안에서 서로 다른 파라미터를 가진 같은 이름의 함수를 사용하는 방법
※ 파라미터의 종류와 갯수가 중요함. 이름이 다른 것은 상관 없음
fun main() {
A(10)
A("문자열")
}
fun A(x: Int) {
println("$x")
}
fun A(x: String) {
println(x)
}
default argument
굳이 입력하지 않아도 기본 값이 있는 파라미터를 가진 함수를 만드는 방법
fun main() {
B("지정 문자열1")
B("지정 문자열1", 88)
B("지정 문자열1", 99, "지정 문자열2")
}
fun B(a: String, b: Int = 1, c: String = "기본 문자열") {
println("$a\t$b\t$c")
}
named argument
순서대로 인자를 입력하지 않고 사이의 값을 기본갑으로 설정하기 위해서
설정할 파라미터의 이름을 지정하여 설정하는 방법
fun main() {
B("지정 문자열1", c = "지정 문자열2")
}
fun B(a: String, b: Int = 1, c: String = "기본 문자열") {
println("$a\t$b\t$c")
}
variable number of argument (vararg)
같은 자료형을 개수에 상관없이 파라미터로 받을 때 사용하는 방법
※ vararg 와 다른 파라미터를 함께 사용하는 경우 마지막에 작성
fun main() {
C("문자열", 1, 1, 1, 1)
}
fun C(str: String, vararg numbers: Int) {
var sum = 0
for (n in numbers) {
sum += n
}
println("$str, $sum")
}
연산자처럼 쓸 수 있는 함수
※ class 안에서 infix 함수를 선언할 때에는 적용할 클래스가 자기 자신이므로 클래스의 이름을 쓰지 않는다
fun main() {
println(6 D 4)
println(6.D(4))
}
infix fun Int.D(x: Int): Int = this * x