본문 바로가기
Kotlin

Kotlin - 함수 다루기

by WangTak 2022. 8. 31.
반응형

최근 인프런에 좋은 코틀린 강의가 올라와서 다시 코틀린 공부를 하고 있는데 배운 내용과 예전에 정리한 내용을 토대로 블로그에 정리하면 좋을 거 같아서 글을 써보려고 합니다. 

 

자바 코드를 코틀린 코드로 변환하고 둘의 차이점을 비교하면서 글을 정리해보도록 하겠습니다.

먼저, 자바에서 두 정수를 인자로 하고 매개변수로 받은 두 정수를 합한 결과를 리턴하는 함수를 만들어보도록 하겠습니다.

 

public int sum(int leftPort, int rightPort) {
    return leftPort + rightPort;
}

위와 같은 코드를 코틀린으로 바꿔서 사용하면 다음과 같습니다.

fun sum(leftPort: Int, rightPort: Int): Int {
    return leftPort + rightPort
}

 

코틀린에서는 함수를 선언할 때 다음과 같이 선언합니다.

fun 함수이름(변수이름: 변수타입 ...): 함수의리턴타입 {
  // body, business logic
}

 

차이점을 설명드리면 다음과 같습니다.

  • 코틀린에서는 함수를 선언할 때 fun 키워드를 사용합니다.
  • 코틀린에서는 자바와 달리 접근 지정자를 생략하면 public으로 간주합니다. (자바는 protected)
  • 코틀린에서는 body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환 타입을 없앨 수도 있습니다.

 

여기서 3번째 내용은 뭐지? 싶을 수 있는데 다음 코드를 참조해주시면 좋을 거 같습니다.

// block 을 생략했으며, 함수의 리턴 값을 알려주기 위해 return 대신 = 를 사용
fun sum1(leftPort: Int, rightPort: Int): Int = leftPort + rightPort
// 함수의 리턴 타입을 생략할 수도 있다.
fun sum2(leftPort: Int, rightPort: Int) = leftPort + rightPort

먼저 sum1에 대해서 설명드리면 위에서 만들어준 자바 코드의 sum 메서드와 코틀린 코드의 sum과 동일한 기능을 수행하고 있습니다. 그에 더해 block (중괄호 { })을 생략하였고, block을 생략함과 동시에 어떤 값을 리턴해줄 것인지 알려주기 위해 = 를 사용하였습니다.

sum2는 sum1을 좀 더 축약시킨 형태입니다. 이전에 "Kotlin - 시작하기"에 정리를 해뒀지만 코틀린은 컴파일될 때 자료형을 검사하는 정적 언어라고 정리했습니다. sum 메서드를 살펴보면 매개변수로 넘어온 정수형 leftPort, rightPort의 합을 리턴하는 메서드입니다. 그렇다면 리턴하는 결과 역시 정수형 + 정수형은 정수형임을 알 수 있기 때문에 위와 같이 함수의 리턴 타입을 생략할 수 있습니다!

 

여기서 몇 가지 특징을 더 설명드리면 다음과 같습니다.

 

코틀린은 인자에 default 값을 추가할 수 있습니다.

fun main() {
    signup("왕탁이1", "admin@gmail.com")
    signup("왕탁이2")
}

fun signup(name: String, email: String = "default") {
    println("이름: ${name}, 이메일: ${email}")
}

/**
 * result
 * 이름: 왕탁이1, 이메일: admin@gmail.com
 * 이름: 왕탁이2, 이메일: default
 */

위처럼 변수 email에 값이 들어오지 않으면 저희가 미리 지정해둔 default로 설정되는 것을 알 수 있습니다.

 

코틀린은 매개변수에 이름을 부여하여 이름과 함께 함수 호출도 가능합니다.

저희가 default 값을 지정할 수 있음을 위에서 알아봤습니다. 근데, 여기서 매개변수 이름과 함께 함수 호출도 가능합니다! 코드로 확인해보시죠!

fun main() {
    signup(age = 26, name = "왕탁이")
    signup(email = "admin@gmail.com")
    signup()
}

fun signup(name: String = "anonymous", email: String = "default", age: Int = 0) {
    println("이름 : ${name}, 이메일: ${email}, 나이: ${age}")
}

/**
 * 이름 : 왕탁이, 이메일: default, 나이: 26
 * 이름 : anonymous, 이메일: admin@gmail.com, 나이: 0
 * 이름 : anonymous, 이메일: default, 나이: 0
 */

이런 식으로 변수 이름을 통해서 함수를 호출하고 있기 때문에 함수에서 정의되어 있는 인자의 순서와 상관없이 호출할 수 있습니다. 또한, default parameter를 사용했기 때문에 매개변수로 넘기지 않은 인자에 대해서는 값이 default로 할당되어 있는 것을 확인할 수 있습니다.

 

가변 인자를 사용하여 매개변수의 개수가 고정되지 않은 함수를 사용할 수 있습니다.

자바에서의 가변 인자는 ... 을 통해서 구현할 수 있는데, 다음처럼 자바 코드를 코틀린 코드로 변경할 수 있습니다.

public void main(String[] args) {
    printNumbers(1, 2, 3);
    printNumbers(1, 2, 3, 4);
}

public void printNumbers(int ... numbers) {
    for (int number : numbers) {
        System.out.print(number + " ");
    }
    System.out.println();
}
fun main() {
    printNumbers(1, 2, 3)
    printNumbers(1, 2, 3, 4)

    val array = intArrayOf(1, 2, 3, 4)
    printNumbers(*array)
}

fun printNumbers(vararg numbers: Int) {
    for (number in numbers) {
        print("${number} ")
    }
    println()
}

 

또한, 이 가변 인자를 코틀린에서 사용하기 위해서는 배열을 바로 넣는 대신 스프레드 연산자 (*)을 붙여주어야 합니다. 

 

 

 

오늘은 코틀린에서 함수를 통해 다룰 수 있는 다양한 방법을 정리해봤는데 요약하자면 다음과 같습니다!

  • 코틀린에서 함수를 사용하는 문법은 자바와 다릅니다! - fun 함수이름(매개변수이름: 타입..): 리턴타입
  • 코틀린의 함수에 body가 하나의 값으로 간주될 경우 block을 없앨 수 있고 = 를 사용하여 어떤 값을 리턴할지 명시해야 하며, block이 없다면 반환 타입을 없앨 수도 있습니다.
  • 함수 파라미터에 기본 값을 설정해줄 수 있습니다.
  • 함수를 호출할 때 특정 파라미터의 이름을 지정하여 호출할 수 있습니다.
  • 가변 인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 *를 붙여주어야 합니다.

 

출처: 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) - 인프런 | 강의

이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

출처: Do it! 코틀린 프로그래밍

 

Do it! 코틀린 프로그래밍 - 교보문고

기초 문법부터 안드로이드 활용까지 | “휩쓸릴 것인가? 올라탈 것인가?”10년간 실무와 교육을 병행한 안드로이드 전문 개발자 ‘황영덕’의 코틀린 입문서!휩쓸리느냐 올라타느냐. 코틀린을

www.kyobobook.co.kr

 

반응형

'Kotlin' 카테고리의 다른 글

Kotlin - 변수와 자료형, 연산자  (1) 2022.04.06
Kotlin - 시작하기  (0) 2022.04.02