[오늘 배운 내용]
-1- 람다(Lambda)
- 람다 대수 또는 람다 계산법은 추상화와 함수 적용 등의 논리 연산을 다루는 형식 체계이다
- 람다식의 특성 .
- 1. 람다 대수는 이름을 가질 필요가 없다. (익명 함수)
- 2. 두개 이상의 입력이 있는 함수는 최종적으로 1개의 입력만 받는 람다 대수로 단순화 될 수 있다.
(커링? 밑에서 추가로 작성.)
- 람다식은 주로 함수를 간단하게 정의할 때 이용하는데 kotlin에서 지원하는 고차함수를 이용하기 위해서는 람다식이 굉장히 중요하다고 한다.
(고차함수란? 함수를 인자로 받거나 함수를 받환하는 함수.) - 위의 람다식의 특성중 익명함수에 대해서 알아보자
// 일반적인 함수의 작성법
fun sum(num1: Int, num2: Int):Int {
return num1 + num2
{
// 위의 함수의 람다식
val sum = {num1 : Int, num2: Int -> num1+num2}
print(sum(1,5)) // 출력 : 6
// 익명 함수이므로 함수명으로 호출할 수 없기 때문에 보통 변수에 대입해 사용함.
- 람다 함수를 변수에 대입하지 않고 해당 함수를 선언하자마자 호출하고자 한다면 아래코드로 가능하다
{num1: Int, num2: Int -> num1 + num2} (1,5)
- 람다 정의 시 규칙
- 위에 작성한 예제들 처럼 람다는 항상 중괄호와 함께 정의된다. 화살표를 기준으로 전은 입력 변수, 화살표가 가리키는 쪽은 본문이며, 본문의 마지막 줄에는 반환 값이 위치한다.
- 반환하는 값이 있으니, 출력 변수 타입이 반드시 존재해야 한다.
- 람다를 정의할 떄는 파라미터의 타입을 추론할 문맥이 없기 때문에 파라미터 타입 또한 명시해야 한다.
- 함수를 인자로 사용한 함수 호출시 람다 정의 규칙
- 매개변수의 타입을 유추할 수 있다면 타입 선언을 생략할 수 있다
typealias SumFunType = (Int,Int) -> Int
val sum:SumFunType={num1,num2 -> num1+num2}
fun main() {
println(sum(2,3))
}
// 출력 5
-
- 함수 호출 시 람다의 파라미터가 하나뿐이고 그 타입을 컴파일러가 추론할 수 있는 경우 it을 바로 쓸 수 있다.
- 함수호출 시 맨 뒤에 있는 인자가 람다 식이라면, 그 람다를 괄호 밖으로 빼낼 수 있다.
- 함수 호출 시 람다가 그 함수의 유일한 인자이고 빈 괄호 뒤에 람다를 썼다면 빈 괄호를 생략할 수 있다.
val lambdaReturnNum : (number : Int) ->Unit = {
println("${it}")
}
fun main() {
lambdaReturnNum(3)
}
// 출력 3
// String을 Int로 변환
fun main(){
fun extendInt(discount: String, faceValue: Int): Int {
val price: Int.(String) -> Int = { this - it.toInt() }
return faceValue.price(discount)
}
// this는 확장함수가 불러줄 오브젝트, it은 int.(String)의 String이 it으로 바뀐 것
// it이 사용된 이유는 파라미터가 Int 하나이기 때문에 input 파라미터 대신 it을 사용한 것
// this가 가리키는 것은 확장함수가 콜하는 오브젝트, it은 파라미터가 1개일 때 대신해서 쓸 수 있다.
print(extendInt(200,2000))
}
// 출력 : 1800
- 람다를 인자로 사용한 함수 호출 시 규칙 적용 이미지이다 이미지 한장으로 쉽게 이해되는 것 같아서 퍼왔다.
-2- 커링(Currying)
- 람다를 배우는데 커링이라는 게 나와서 간단하게 알아보았다.
- 커링(currying)이란 함수를 1급 객체로 인정하면서 함수를 리턴한다. 이때 함수를 연속적으로 리턴하는 경우가 있는데 여러 개의 인자를 받는 함수를 단 하나의 인자만 받는 함수로 만드는 과정을 커링이라고 한다.
fun sum(a: Int): (Int) -> Int {
val g = { b: Int -> a + b }
return g
}
sum(1)(2)
최종값 : 3
fun main() {
fun shipping(address : String, item : String){
println("${address},${item}")
}
fun curryingShipping(address : String):(String) -> (String){
return { item:String -> address + item }
}
shipping("오사카","humanMade") // 출력 오사카,humanMade
println("${curryingShipping("런던")("palace")}") // 출력 런던palace
}
- 가독성이 더 안좋아졌다?
- 이러이러한 기능이 있구나 정도로만 알고 넘어가야겠다...
[오늘 복습한 내용]
1. 소숫점 올림, 버림, 반올림
// ceil - 천장 = 올림
// floor - 바닥 = 내림
// round - 반올림
fun main() {
// 소숫점을 다 버리거나 다 올려 버린다.
var doubleData = 10.55555
var doubleCeilData = Math.ceil(doubleData)
var doubleFloorData = Math.floor(doubleData)
var doubleRoundData = Math.round(doubleData)
// 소숫점 3자리 남기기
var doubleCeilDataWithDecimal = Math.ceil(doubleData*1000)/1000
println(doubleCeilData) // 출력 : 11.0
println(doubleFloorData) // 출력 : 10.0
println(doubleRoundData) // 출력 : 11
println(doubleCeilDataWithDecimal) // 출력 10.556
}
2.날짜 데이터 문자열으로 변환
fun main() {
val longNow = System.currentTimeMillis()
val todayDate = Date(longNow)
val todayDateFormat = SimpleDateFormat("yyyyMMdd kk:mm:ss")
val strDate = todayDateFormat.format(todayDate)
println(strDate) // 출력 : 20230817 20:52:37
}
- Date, SimpleDateFormat 이 빨간글씨도 보여지는데, Art + Enter로 Import 해주면 해결된다.
[오류,에러 등등]
1. 람다에 대해서 간단하게 공부해서 직접 써먹어보고 싶었다.
fun main() {
var doubleData = 10.55555
// 소숫점 남기기
var doubleCeilDataWithDecimal: (Double) -> (Double) = {doubleData*1000
Math.ceil(doubleData)/1000
}
// 소숫점 3자리 남기기
var doubleCeilDataWithDecimal = Math.ceil(doubleData*1000)/1000
어떤 부분이 문제인지 조금 더 찾아보고 싶었으나, 일반식으로 더 쉽게 해결할 수 있기 때문에 직접 시도한 것에 의의를 두고 람다를 더 공부 해보아야겠다.
[느낀 점]
1. depasyse << 해당 블로그에서 많은 정보를 얻는데 docs, android developer 등 에서 찾아본 자료들보다 이해하기 쉽게 자세히 설명이 되어 있어서 많은 도움을 받고있다. 자세한 내용을 알고 그 토대로 글을 작성하기, 가독성 좋은 글을 쓰기 등 여러 의미로 동기부여가 되는 것 같다.
2. 같은 기능에 관해서도 최대한 많은 자료를 통해 깊게 알아보는 시간을 갖는 것이 중요한 것 같다. 그러려면 시간 배분을 더 잘해야겠다
3. 알고리즘 문제를 꾸준히 풀어봐야겠다. 알고리즘을 풀어봐야 다양한 함수의 필요성을 느끼고 공부할 것 같다. 아직 모르는 함수들이 너무 많아서 알고리즘 문제 풀기가 어렵지만, 풀지 못하더라도 새로운 사고를 할 수 있는 기회가 생기는 것 같아서 꾸준히 시도해봐야겠다.
[Reference]
https://kkh0977.tistory.com/639
https://kotlinlang.org/docs/home.html?q=lambda&s=full
'TIL' 카테고리의 다른 글
[TIL] Android Studio 글꼴변경, UI폰트 설정, edittext 비밀번호 확인 (0) | 2023.08.21 |
---|---|
[TIL] 0818 strings.xml, 언어변경 (0) | 2023.08.18 |
[TIL] 0816 Enum Class (0) | 2023.08.16 |
[TIL] 20230809 (0) | 2023.08.09 |
[TIL] 20230808 5일차 (0) | 2023.08.08 |