Kotlin, 5. 익명 함수와 함수 타입

이도현·2023년 8월 10일
0

Kotlin 공부

목록 보기
5/20

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() // 1, 2, 3 중 무작위로 선택
    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() // 1, 2, 3 중 무작위로 선택
  println(greetingFunction(playerName, numBuildings))
}

11. 인라인 함수로만들기

  • inlin키워드
    • 함수를 객체화하지 않음
  • 컴파일 시에, 호출하는 코드에 함수 내용을 삽입해 버림
inline def runSimulation(palyerName: String, 
  					greetingFunction: (String, Int) -> String {
  val numBuildings = (1..3).shuffled().last() // 1, 2, 3 중 무작위로 선택
  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() // 1, 2, 3 중 무작위로 선택
  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)"
   }
}
profile
좋은 지식 나누어요

0개의 댓글