9장. 다중 표현식에서 단일 표현식 함수
이 작품은 AI를 사용하여 번역되었습니다. 여러분의 피드백과 의견을 환영합니다: translation-feedback@oreilly.com
Nat과 Duncan은 모두 Kotlin의 단일 표현식 함수 정의를 좋아합니다. 이 형식을 언제 사용해야 하는지, 왜 선호하는지, 더 많은 함수를 단일 표현식으로 만들기 위해 어떤 Kotlin 기능을 사용할 수 있는지 궁금합니다.
Java의 경우 와 같이 Kotlin 함수의 코드는 일반적으로 { 중괄호 안에 정의됨 }이며return 를 사용하여 함수의 결과를 정의합니다( Unit, Kotlin의 별칭인 void 가 아닌 경우):
funadd(a:Int,b:Int):Int{returna+b}
코드의 최상위 레벨이 단일 표현식인 경우, 선택적으로 결과 유형을 삭제하고 등호 뒤에 표현식을 사용하여 코드를 정의할 수 있습니다:
funaddToo(a:Int,b:Int):Int=a+b
add 함수의 결과는 와 같다는 식으로 읽을 수 있습니다. 이는 단일 표현식에서는 의미가 있으며, 해당 표현식 자체가 하위 표현식으로 구성된 경우에도 잘 읽을 수 있습니다: a + b
funmax(a:Int,b:Int):Int=when{a>b->aelse->b}
이 해석은 부작용이 있는 함수, 특히 I/O를 수행하거나 변경 가능한 상태에 쓰는 함수에는 적합하지 않습니다:
funprintTwice(s:String):Unit=println("$s\n$s")
println 에는 결과가 없거나 적어도 결과를 반환하지 않기 때문에 printTwice 의 결과가 println(..) 과 같다고 읽을 수 없습니다. 7장에서 살펴본 것처럼 이 함수는 전적으로 부수적인 기능입니다.
계산을 위한 단일 표현식 함수 예약하기
계산("계산")을 위해 단일 표현식 함수를 예약하는 규칙을 채택하면 함수를 사용할 때 의도를 전달할 수 있습니다. 단일 표현식 함수를 보면 액션("액션")이 아니라는 것을 알 수 있으므로 리팩터링하는 것이 훨씬 더 안전합니다.
실제로 이는 단일 표현식 함수가 Unit 을 반환하거나 변경 가능한 상태에서 읽기 또는 쓰기(I/O 수행 포함)를 해서는 안 된다는 의미입니다.
작성자들은 가능한 한 많은 함수를 단일 표현식으로 만들면 소프트웨어가 개선된다는 사실을 발견했습니다. 우선, 계산에 단일 표현식 형식을 사용하면 코드에서 동작이 차지하는 비율이 줄어들어 이해하고 수정하기가 더 쉬워집니다. 또한 단일 표현식은 대안보다 짧은 경향이 있어 각 함수의 복잡성이 제한됩니다. 함수가 너무 커져서 쉽게 이해할 수 없는 경우, 단일 표현식을 사용하면 부작용과 동작 수행 순서에 따라 논리가 깨질 위험이 적어 명확성을 위해 더 쉽게 리팩터링할 수 있습니다.
또한 문 대신 표현식을 선호합니다. 표현식은 선언적입니다. 함수가 계산할 내용을 선언하고 Kotlin 컴파일러와 런타임이 해당 계산을 계산하는 방법을 결정하도록 합니다. ...