일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 공약수
- 업캐스팅
- 재정의함수
- PICO4
- 우송대 라즈베리파이 피코
- 유클리드 호제법
- ESP32_S2
- 라즈베리파이 피코
- ATmega328p
- 아두이노
- 우송대
- 안드로이드스튜디오
- 개발 보드
- 우송대학교
- 카이캐드 설치
- 7세그먼트
- 아두이노 모터 드라이버
- 약수 구하기
- kotlin
- 카이캐드 다운로드
- 추상화함수
- GCD
- string함수
- L293D
- 카이캐드
- 코틀린
- Arduoin
- androidstudio
- ESP32_S2_WROVER
- KiCad
- Today
- Total
개발자의 생활
고차함수, 람다함수 본문
고차함수는 함수를 변수처럼 다른함수에 인자로 넘기거나 반환할 수 있는 타입의 함수입니다. 그리고
람다함수는 함수를 간결하고 익명함수로 이름을 정의하지 않고 간단한 로직을 작성할 때 사용하는 함수입니다.
이 함수들을 이용하면 간결하고 유연한 코드작성이 가능해집니다.
예시와 함께 사용방법을 알아보겠습니다.
고차함수
fun main() {
higherFun(::testFun)
}
fun testFun(str: String){
println("이 함수는 $str")
}
fun higherFun(a: (String) -> Unit){
a("고차함수 입니다.")
}
메인 함수를 제외하고 함수 2개가 있습니다. 위에 두 함수 모두 일반적인 함수의 형태이지만 higherFun 함수의 매개변수 타입은 일반적이지 않습니다. (String) -> Unit 이것은 함수형태의 데이터 타입입니다.
([매개변수 타입]) -> [반환 타입] 위 코트에는 매개변수 타입이 String 이고 반환타입이 Unit 입니다. Unit는 반환값이 없을때 사용하는 키워드 입니다. 위와 동일한 타입의 함수를 testFun 이름으로 정의를 하였습니다.
즉 testFun 함수를 인자값으로 넘겨줄 수가 있습니다.
main함수에서 higherFun 의 매개변수로 testFun 함수를 넘겨주고 있는데요 일반함수를 넘겨주기 위해서는 고차함수 형태로 넘겨주어야 하기 때문에 :: 참조 연산자를 이용해 고차함수 형태바꿔서 넣어주어야 합니다.
그럼 좀더 나아가서 반환타입을 가지는 고차함수를 보겠습니다.
fun main() {
higherFun(::testFun)
}
fun testFun(str: String): Int{
println("이 함수는 $str")
return 10
}
fun higherFun(a: (String) -> Int){
println("반환값: " + a("고차함수 입니다."))
}
조금전의 코드에서는 반환값이 없었기 때문에 Unit 이라는 키워드를 사용했지만 이번에는 Int타입의 정수 10을 반환시켜 보겠습니다.
testFun 함수를 반환타입으로 수정하고 Unit 가 있는 자리에 그대로 반환타입을 적어주시면 됩니다.
람다함수
람다함수는 이름이 없는 익명함수 입니다. 일반적인 함수는 이름이 존재하고 그 이름을 통해 호출하기도 하여 사용하였지만 람다함수는 이름을 가지지 않고 변수타입처럼 사용이 됩니다.
fun main() {
val a: (String, Int) -> String = {str: String, i: Int ->
var strCount = ""
for(count in 0..< i){
strCount += count.toString() + str + "\n"
}
strCount
}
println(a("text", 3))
}
위 코드는 람다함수를 정의하고 a 라는 변수에 넣은것입니다.
가장 먼저 함수타입은 String와 Int를 매개변수로 두고 반환타입을 String 로 정의하였습니다. 그리고 이 타입을 가지는 a변수에 람다함수를 넣고 있는 형태인데요 중괄호 시작하고 -> 가 나오기 전까지가 파라미터로 받을 데이터 타입입니다.
일반 함수로 보면 fun [이름없음](str: String, i: Int) 이것과 동일한것입니다.
그리고 -> 다음부분이 함수 내용입니다. 일반적인 함수와 동일하게 작성하시면 됩니다. 다만 한가지 다른점은 return 값이 있는 함수인 경우에 마지막에 오는 값이 리턴값이 되는것입니다. 저 코드에서는 strCount 를 리턴하고 있습니다.
사실 이 코드에서도 (String, Int) -> String 가 없어도 타입추론을 해서 동작을 할 수 있습니다.
또한 (String, Int) -> String 가 있다면 여기서 매개변수 타입을 정의하고 있기 때문에 str: String, i: Int -> 에서 타입을 생략해도 됩니다.
fun main() {
val a: (String, Int) -> String = {str: String, i: Int ->
var strCount = ""
for(count in 0..< i){
strCount += count.toString() + str + "\n"
}
strCount
}
higherFun(a)
}
fun higherFun(hFun: (String, Int) -> String){
println(hFun("고차함수", 5))
}
고차함수에 파라미터로 람다함수를 넣어도 동일하게 동작을 할 수 있습니다.
오늘도 끝까지 봐주셔서 감사합니다.
'kotlin(코틀린) 강좌' 카테고리의 다른 글
유용한 String 함수 (0) | 2024.10.30 |
---|---|
제네릭 (0) | 2024.10.30 |
업, 다운 캐스팅 (다형성) (0) | 2024.10.22 |
스코프, 접근제한자 + 프로젝트 구조 (0) | 2024.10.04 |
class 사용 (4) | 2024.09.16 |