with ChatGPT 시리즈는 ChatGPT의 내용과 개인의 생각을 토대로 학습해 보는 컨텐츠입니다.
코틀린은 객체지향과 함수형 프로그래밍의 장점을 모두 살린 언어입니다. 특히 함수 선언이 간결하며, 함수형 프로그래밍 스타일을 적극 지원하는 것이 특징입니다. 이번 글에서는 코틀린의 함수 선언 방식과 주요 예제, 그리고 코틀린이 제공하는 함수형 프로그래밍의 장점을 살펴보겠습니다.
1️⃣ 코틀린의 함수 선언 방식
코틀린에서 함수를 선언하는 방식은 불필요한 보일러플레이트 코드를 줄이는 방향으로 설계되었습니다.
✅ 기본적인 함수 선언 방식
fun sum(a: Int, b: Int): Int {
return a + b
}
- fun 키워드를 사용하여 함수 선언
- 매개변수의 타입을 명시 (a: Int, b: Int)
- 반환 타입을 : 뒤에 명시 (: Int)
✅ 식 본문 (Expression Body) 함수
코틀린에서는 return 키워드 없이 식(Expression)으로 함수를 작성할 수 있습니다.
fun sum(a: Int, b: Int) = a + b
- { } 없이 = 를 사용하여 결과를 반환
- 반환 타입 생략 가능 (컴파일러가 자동 추론)
이러한 문법 덕분에 자바보다 훨씬 간결한 코드 작성이 가능합니다.
2️⃣ 기본값(Default Parameter)과 명명된 인자(Named Argument)
✅ 기본값(Default Parameter) 설정하기
fun greet(name: String = "Guest") {
println("Hello, $name")
}
fun main() {
greet() // 기본값 사용 -> "Hello, Guest"
greet("Alice") // "Hello, Alice"
}
- 매개변수에 기본값을 설정할 수 있어 오버로딩이 줄어듦
- 호출 시 greet(name = "Alice") 처럼 명명된 인자 (Named Argument) 사용 가능
✅ 자바와의 차이 및 @JvmOverloads 활용
자바에서는 기본값을 지원하지 않기 때문에, Kotlin에서 기본값을 활용한 함수를 Java에서 호출할 때 문제가 발생할 수 있습니다.
// Kotlin
class User {
@JvmOverloads
fun sayHello(name: String = "Guest") {
println("Hello, $name")
}
}
// Java
User user = new User();
user.sayHello(); // 기본값 사용 가능
user.sayHello("Alice");
- @JvmOverloads 어노테이션을 사용하면, Java에서도 기본값을 활용한 메서드 호출이 가능
3️⃣ 가변 인자(Vararg)와 스프레드 연산자(*)
✅ 가변 인자 (Vararg) 활용하기
fun printNumbers(vararg numbers: Int) {
for (num in numbers) {
println(num)
}
}
fun main() {
printNumbers(1, 2, 3, 4, 5) // 여러 개의 인자를 전달 가능
}
- vararg를 사용하면 여러 개의 인자를 받을 수 있음
- Java의 varargs와 유사한 기능
✅ List vs vararg 차이
- vararg는 함수 호출 시 여러 개의 개별 인자를 넘길 때 유용
- 하지만 이미 리스트 (List)를 가지고 있다면, vararg 보다는 리스트를 그대로 사용하는 것이 좋음
fun sumList(numbers: List<Int>): Int = numbers.sum()
fun sumVararg(vararg numbers: Int): Int = numbers.sum()
val numbers = listOf(1, 2, 3, 4, 5)
// sumList는 리스트를 그대로 전달
sumList(numbers)
// sumVararg는 리스트를 '*'로 풀어서 전달해야 함
sumVararg(*numbers.toIntArray())
- 리스트를 vararg에 전달할 때는 *(Spread Operator)를 사용해야 함
- sumList(numbers)는 더 직관적이므로 이미 리스트가 있다면 List를 사용하는 것이 좋음
4️⃣ 함수형 프로그래밍과 코틀린의 특징
코틀린은 함수형 프로그래밍(Functional Programming)을 지원합니다. 즉, 함수를 변수처럼 다루고, 람다(Lambda)를 적극 활용하며, 불변성(Immutability)을 강조합니다.
✅ 고차 함수 (Higher-Order Function)
함수를 매개변수로 전달하거나 반환할 수 있습니다.
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
return op(a, b)
}
fun main() {
val sum = operate(3, 5) { x, y -> x + y }
println(sum) // 8
}
- op: (Int, Int) -> Int: 함수 타입의 매개변수 선언
- { x, y -> x + y }: 람다 표현식을 이용한 연산
🚀 결론
코틀린은 객체지향과 함수형 프로그래밍의 강점을 모두 결합한 언어입니다.
- 함수 선언 방식이 간결하며, 불필요한 보일러플레이트 코드가 적음
- 기본값(Default Parameter)과 vararg를 활용하여 유연한 함수 선언 가능
- Java와의 호환성을 위해 @JvmOverloads를 활용할 수 있음
- 고차 함수와 람다를 적극 활용하여 선언형 스타일로 코드 작성 가능
이러한 특성 덕분에 코틀린은 Java보다 더 효율적인 컬렉션 처리, 코드 간결화, 병렬 프로그래밍을 쉽게 구현할 수 있습니다.
🤔 추가로 생각해 볼 질문들
- Java에서는 기본값을 지원하지 않는데, Kotlin에서는 어떻게 Java와 상호 운용할 수 있을까? (@JvmOverloads의 역할은?)
- vararg와 List<T>는 어떤 차이가 있으며, 언제 vararg를 사용하고 언제 List를 사용해야 할까?
- 기본값을 가진 매개변수와 vararg를 함께 사용할 때 주의해야 할 점은?
- 스프레드 연산자(*)는 언제 필요하며, 어떤 제약이 있는가?
- Kotlin의 vararg는 Java의 varargs보다 어떤 점에서 더 유연한가?