함수

LEEHEES·2022년 7월 10일
0

Kotlin

목록 보기
4/13
post-thumbnail

기본형태

파라미터와 자료형은 타입추론 불가능

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 함수 없이 람다함수로 작성 가능

  1. '->' 이후 부분에 여러 구문 작성 가능
    '->' 이후 부분의 반환 값이 존재하는(Unit이 아닌) 경우, 마지막 구문이 반환됨
  2. 파라미터가 없는 경우, 구문만 작성('->' 없이)
  3. 파라미터가 1개인 경우, 'it'으로 대체 가능

오버로딩

같은 스코프 안에서 서로 다른 파라미터를 가진 같은 이름의 함수를 사용하는 방법

※ 파라미터의 종류와 갯수가 중요함. 이름이 다른 것은 상관 없음

fun main() {

    A(10)
    A("문자열")

}

fun A(x: Int) {
    println("$x")
}

fun A(x: String) {
    println(x)
}

Argument (인자)

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")
}

infix 함수

연산자처럼 쓸 수 있는 함수

※ class 안에서 infix 함수를 선언할 때에는 적용할 클래스가 자기 자신이므로 클래스의 이름을 쓰지 않는다

fun main() {

    println(6 D 4)
    println(6.D(4))

}

infix fun Int.D(x: Int): Int = this * x
profile
iOS 개발 공부

0개의 댓글