[Kotlin] 함수

강승구·2022년 5월 2일
0

함수의 기본 구조

코틀린에서는 fun이라는 키워드로 함수를 정의한다. 그리고 함수명, () 파라미터 값을 설정하며 ':' 뒤에는 반환 타입을 설정한다.

fun greeting(): Unit{
    println("hello world")
}

Unit은 자바에서 사용되는 void와 동일하다.

코틀린에서는 자료형 추론이 가능하기 때문에 아래 코드와 같이 반환 타입을 명시하지 않아도 컴파일 시 자동으로 타입을 추론해준다.

fun greeting(){
    println("hello world")
}

함수의 파라미터는 변수를 선언하는 방법과 동일하게 '인자명': '자료형'의 형태로 적어준다.

fun greeting(name: String){
    println("hello, my name is $name")
}

기본 파라미터

함수의 파라미터는 기본값을 가질 수 있다. 기본값이란 파라미터에 입력되지 않은 값에 대해서 기본적으로 함수를 실행하면 그 값을 할당해 함수를 호출한다는 의미이다.

fun greeting(name: String = "kang"){
    println("hello, my name is $name")
}

fun main(){
	//기본 파라미터로 호출
	greeting() //hello, my name is kang
    //개발자 정의 파라미터로 호출
    greeting("kim") //hello, my name is kim
}

이름명시 파라미터

이름명시 파라미터란 함수를 호출할 때 파라미터의 이름을 선언하고 거기에 값을 매핑하는 방식이다.
함수를 호출하면서 파라미터를 입력하면 파라미터가 정의된 순서대로 값을 매핑한다.
코틀린에서는 파라미터의 순서에 구애받지 않고 값을 전달할 수 있도록 이름명시 파라미터를 제공한다.

fun multiply(a: Int, b: Int,): Int{
	return a*b
}

fun main(){
	//multiply(2, 5)와 동일
	println(multiply(b=5, a=2))
}

vararg(가변인자)

vararg 키워드를 사용해 가변인자를 사용하면 함수를 호출할 때 파라미터 개수를 동적으로 지정할 수 있다.

fun sum(vararg num: Int) = num.sum()

fun main() {
    val n1 = sum(1)
    val n2 = sum(1, 2, 3, 4, 5)
    println(n1) // 1
    println(n2) // 15
}

배열을 가변인자로 넘길 때에는 배열명 앞에 * 를 붙여주면 된다. * 은 spread operator라고 부른다. C/C++의 포인터와 헷갈릴 수 있지만 코틀린에는 포인터 개념이 없다.

fun showAll(vararg s: String) {
    println(s.joinToString())
}

fun main() {
    val test = arrayOf("A", "B")
    showAll(test) // error
    showAll(*test) // OK
}

Single expression function

Single expression functon은 함수를 한줄로 정의하는 방법을 말한다.

fun greeting() = println("hello world")

파라미터를 받는 함수도 한줄로 정의가 가능하다.

fun greeting(name: String): String = "hello, my name is $name"

지역함수(Local function)

지역함수는 함수안에 함수를 정의하는 방법이다. 함수안에 정의된 함수는 외부에서 사용할 수 없고 함수 내부에서만 사용할 수 있다.
함수 내부에서 동일한 코드를 반복적으로 사용할 때 중복 코드를 줄이기 위해서 많이 사용된다.


Trailling Coomma

Trailling Coomma는 함수의 마지막 파라미터에 ,를 붙이는 방법이다.

fun multiply(a: Int, b: Int,): Int{
	return a*b
}

코틀린 공식문서에서는 Trailling Coomma의 장점을 다음과 같이 언급하고 있다.

  • 소스 비교 명확히 가능 : git 등을 사용하여 코드를 비교할 때 , 는 변화로 잡지 않기 때문에 값의 변화에 집중할 수 있다.
  • 순서 재정렬이 편함 : 함수, enum 등에서 재정렬할때 , 를 신경쓰지 않아도 됩니다.
  • 코드 자동생성 만들 시 편함 : 마지막 파라미터일 때는 ,를 뺀다라는 로직이 필요없으므로 코드 자동생성을 만들때 좋습니다.

오버로딩 (OverLoading)

오버로딩(overloading)은 이름은 동일하지만 매개 변수의 개수가 다르거나 매개 변수의 자료형이 다른 함수를 여러개 만드는 방법이다.
오버로딩을 통해 같은 이름의 함수로 다른 기능을 할 수 있게 한다.

fun multiply(a: Int, b: Int): Int{
	return a*b
}

fun multiply(a: Int, b: Int, c: Int): Int{
	return a*b*c
}

fun multiply(a: Int, b: Int, c: Int, d: Int): Int{
	return a*b*c*d
}

fun main(){
	printlnt(multiply(1, 2))
    printlnt(multiply(1, 2, 3))
    printlnt(multiply(1, 2, 3, 4))
}
profile
강승구

0개의 댓글