Home Kotlin - 기본적인 함수
Post
Cancel

Kotlin - 기본적인 함수

람다같은 것이 아닌 기본적으로 코틀린에서 함수를 어떻게 다루는 지 알아보자.

  • 함수 선언 문법
  • default parameter
  • named argument (parameter)
  • 같은 타입의 여러 파라미터를 받는 방법

함수

함수의 선언

정수 a, b를 받아 더 큰 수를 return하는 함수를 만들어보자.

1
2
3
4
5
6
fun max(a: Int, b: Int): Int {
	return if (a > b) {
		a
	} else {
		b
	}
  • public 생략 가능
  • fun으로 함수를 만들 수 있다.
  • 매개변수 및 반환 타입은 : 를 활용한다.
    • 반환타입이 Unit인 경우는 반환타입 생략이 가능하다.
  • if-else는 Expression이기 때문에 위와 같이 표현할 수 있다.

여기에 더해 또 다른 방식이 존재한다.

1
2
3
4
5
6
fun max(a: Int, b: Int): Int = 
	if (a > b) {
		a
	} else {
		b
	}
  • 함수가 하나의 결과값이라면 block 대신 = 을 사용하는 방법을 사용할 수 있다.
  • if-else 구문을 한 줄에 표현 가능하다.
  • a와 b모두 Int임을 추론할 수 있기 때문에 이런 경우 반환타입 생략이 가능하다.
    • =을 사용했기 때문에 가능하다.
    • block을 사용하는 경우에는 반환 타입이 Unit이 아니라면 반환타입을 명시적으로 작성해주어야 한다.
1
fun max(a: Int, b: Int) = if (a > b) a else b
  • 위와 같이 생략이 가능한 부분이 많다.
    • 중괄호, 반환타입

함수는 자바와 마찬가지로 클래스 안에 있을 수 있고, 파일 최상단에 존재할 수 있다. 한 파일 안에 여러 함수들이 존재하는 것도 마찬가지이다.

default parameter

주어진 문자열을 N번 출력하는 예제를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
fun repeat(str: String,
	 num: Int = 3,
	 useNewLine: Boolean = true
) {
	for (i in 1..num) {
		if (useNewLine) {
			System.out.println(str)
		} else {
			System.out.print(str)
		}
	}
}
1
2
3
fun main() {
	repeat("Hello World")
}
  • 코틀린에서는 밖에서 파라미터를 넣어주지 않았을 경우에도 동작할 수 있게 할 수 있는 기능이 존재한다.
    • 기본값 부여
  • 자바에서는 이를 표현하려면 오버로딩을 해 동작하도록 한다.
1
2
3
public void repeat(...) {
	repeat("Hello World", 3, true);
}

named argument

1
2
repeat("Hello World", 3, false) // O
repeat("Hello World", false) // X
1
repeat("Hello World", useNewLine = false)
  • 위에서 기본값을 사용하고 싶고 true -> false로 바꾸고 싶은 경우를 예시로 들었다.
  • 하지만 만약 3을 생략하고 false만 사용한다면 에러가 발생한다.
    • 어떤 파라미터에 false가 들어가는 지 모르기 때문이다.
  • 기본값을 포함하여 직접 입력해주어도 되지만 매개변수 이름을 통해 직접 지정하고 지정되지 않은 매개변수는 기본값을 사용하도록 할 수 있다.

이러한 방법이 갖는 장점은 builder를 직접 만들지 않고 builder의 장점을 가질 수 있다는 점이다.

1
2
3
4
fun printNameAndGender(name: String, gender: String) {
	println(name)
	println(gender)
}

위와 같은 메서드를 호출한다고 가정해보자.

1
2
3
fun main() {
	printNameAndGender("MALE", "Lee")
}

타입이 같기 때문에 매개변수가 많은 경우 위와 같이 헷갈릴 수 있다. builder를 사용하게 되면 .name(), .gender()를 사용하여 이런 실수를 방지할 수 있다.

1
2
3
fun main() {
	printNameAndGender(gender = "MALE", name = "Lee")
}
  • named argument를 사용하여 위와 같이 실수를 방지할 수 있다.
  • 단 주의할 점은 코틀린에서 자바 함수를 가져다 사용할 때는 named Argument를 사용할 수 없다.

같은 타입의 여러 파라미터 받기 (가변 인자)

문자열을 N개 받아 출력하는 예제를 보자. 아래는 자바 코드이다.

1
2
3
4
5
public static void printAll(String... strings) {
	for (String str : strings) {
		System.out.println(str);
	}
}
  • 타입 …을 사용하면 가변인자를 사용한다.
  • 호출하는 부분에서는 배열을 직접 넣거나, 콤마를 이용해 파라미터를 넣는 방식등을 이용했었다.

코틀린의 경우를 보자.

1
2
3
4
5
fun printAll(vararg strings: String) {
	for (str in strings) {
		println(str)
	}
}
  • …을 타입 뒤에 쓰는 방대신 vararg 키워드를 사용한다.

호출하는 부분을 보자.

1
2
3
4
5
6
fun main() { 
	printAll("A", "B", "C")
	
	val array = arrayOf("A", "B", "C")
	printAll(*array)
}
  • 콤마를 이용해 넣는 것은 자바와 동일하다.
  • 하지만 배열을 이용할 때는 * (스프레드 연산자)을 붙여주어 사용한다.
    • 스프레드 연산자는 배열에 있는 것들을 마치 콤마를 사용하여 넣듯이 사용하도록 해준다.

정리

  • 함수의 문법은 자바와 다르다. (fun 등)
  • 함수 바디가 하나의 값으로 간주되는 경우 블럭을 없앨 수도 있다.
    • =
  • 함수 파라미터에 기본값을 설정해줄 수 있다.
  • 함수를 호출할 때 특정 파라미터를 지정해 넣어줄 수 있다. (named argument)
  • 가변인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 함께 호출하고 싶다면 * (스프레드 연산자)을 사용해주어야 한다.
This post is licensed under CC BY 4.0 by the author.