1. 익명함수
- 이름이 없는 함수
- 변수에 대입하여, 변수를 함수로 이용
- 주로 매개변수/ 반환 값으로 바로 전달할 때 사용
- 람다 함수 형태를 주로사용
{매개변수 -> 함수 본체}
- 함수 본체의 마지막 라인이 표현식인 경우 그 값을 리턴 값으로 처리
2. 문자열에서 특정 글자의 수 카운트하기
val numLetters = "Mississippi".count({letter->letter=='s'})
println(numLetters)
fun check(letter: Char) {
return letter == 's'
}
val numLetters = "Mississippi".count(check)
println(numLetters)
3. 익명 함수 정의하기(매개변수가 없는 익명함수)
fun main(args: Array<String>) {
println({
val currentYear = 2021
"SimVillage 방문을 환영합니다. 촌장님!(copyright $currentYear)"
}())
}
4. 함수 타입
- 함수를 변수에 대입하려면 해당 함수를 나타내는 타입이 필요
val 변수명: (매개변수 목록)-> 리턴타입 = 익명함수(또는 함수 명)
fun main(args: Array<String>) {
val greetingFunction: () -> String = {
val currentYear = 2021
"SimVillage 방문을 환영합니다. 촌장님!(copyright $currentYear)"
}
println(greetingFunction())
}
5. 함수 인자
- 함수 타입 표기시 매개변수명은 생략하고 타입만 기술
- 매개변수명은 익명함수에서 정의
fun main(args: Array<String>) {
val greetingFunction: (String) -> String = {playerName ->
val currentYear = 2021
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
println(greetingFunction("김선달"))
}
6. it 키워드
- 매개변수가 1개인 경우 이름 지정 대신 it 키워드 사용
fun main(args: Array<String>) {
val greetingFunction: (String) -> String = {
val currentYear = 2021
"SimVillage 방문을 환영합니다. $it!(copyright $currentYear)"
}
println(greetingFunction("김선달"))
}
7. 다수의 인자 받기
fun main(args: Array<String>) {
val greetingFunction: (String, Int) -> String = { playerName, numBuildings->
val currentYear = 2021
println("$numBuildings 채의 건물이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
println(greetingFunction("김선달", 2))
}
8. 함수 타입의 타입 추론
val greetingFunction: () -> String = {
val currentYear = 2021
"SimVillage 방문을 환영합니다. 촌장님!(copyright $currentYear)"
}
val greetingFunction = {
val currentYear = 2021
"SimVillage 방문을 환영합니다. 촌장님!(copyright $currentYear)"
}
fun main(args: Array<String>) {
val greetingFunction = { playerName: String, numBuildings: Int ->
val currentYear = 2021
println("$numBuildings 채의 건물이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
println(greetingFunction("김선달", 2))
}
9. 함수를 인자로 받는 함수 정의하기
- 익명함수 -> 람다(lamda)
- 익명함수 정의 -> 람다표현식/ 람다식
- 익명함수의 리턴 값 -> 람다 결과
fun main(args: Array<String>) {
val greetingFunction = { playerName: String, numBuildings: Int ->
val currentYear = 2021
println("$numBuildings 채의 건물이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
runSimulation("김선달", greetingFunction)
}
fun runSimulation(playerName: String,
greetingFunction: (String, Int) -> String) {
val numBuildings = (1..3).shuffled().last()
println(greetingFunction(playerName, numBuildings))
}
10. 단축문법
- 함수에서 마지막 매개변수로 함수 타입을 받을 때
- 람다 인자를 둘러싼 괄호를 생략
val numLetters = "Mississippi".count({ it =='s' })
println(numLetters)
val numLetters = "Mississippi".count { it =='s' }
println(numLetters)
fun main(args: Array<String>) {
runSimulation("김선달") { playerName, numBuildings ->
val currentYear = 2021
println("$numBuildings 채의 건물이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
}
fun runSimulation(playerName: String,
greetingFunction: (String, Int) -> String) {
val numBuildings = (1..3).shuffled().last()
println(greetingFunction(playerName, numBuildings))
}
11. 인라인 함수로만들기
- inlin키워드
- 컴파일 시에, 호출하는 코드에 함수 내용을 삽입해 버림
inline def runSimulation(palyerName: String,
greetingFunction: (String, Int) -> String {
val numBuildings = (1..3).shuffled().last()
println(greetingFunction(playerName, numBuildings))
}
12. 함수 참조
- 이름이 있는 함수에 대한 참조
- 이름이 있는 함수를 매개변수로 전달
fun printConstructionCost(numBuildings: Int) {
val cost = 500
println("건축 비용: ${cost * numBuildings}")
}
inline def runSimulation(palyerName: String,
costPrinter: (Int) -> Unit,
greetingFunction: (String, Int) -> String {
val numBuildings = (1..3).shuffled().last()
costPrinter(numBuildings)
println(greetingFunction(playerName, numBuildings))
}
- 함수의 참조를 전달할 때는 함수명 앞에 ::를 붙임
fun main(args: Array<String>) {
runSimulation("김선달", ::printConstructionCost) {
playerName, numBuildings ->
val currentYear = 2021
println("$numBuildings 채의 건물이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
}
13. 변환 타입으로 함수타입 사용하기
fun main(args: Array<String>) {
runSimulation()
}
fun runSimulation() {
val greetingFunction = configureGreetingFunction()
println(greetingFunction("김선달"))
}
fun configureGreetingFunction(): (String) -> String {
val structureType = "병원"
var numBuildings = 5
return { playerName: String ->
val currentYear = 2021
println("$numBuildings 채의 $structureType이 추가됨")
"SimVillage 방문을 환영합니다. $playerName!(copyright $currentYear)"
}
}