본문 바로가기

TIL

[TIL] 0817 람다

[오늘 배운 내용]

-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

 

 

이미지 출처 : https://medium.com/depayse

  • 람다를 인자로 사용한 함수 호출 시 규칙 적용 이미지이다 이미지 한장으로 쉽게 이해되는 것 같아서 퍼왔다.

 

 

  •  

-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://medium.com/depayse/

 

dEpayse_publication – Medium

더 나은 개발자가 되기 위해 공부한 것을 언제봐도 이해할 수 있도록 기록하는 공간.

medium.com

https://velog.io/@dambyworld/%EC%BB%A4%EB%A7%81currying..-%EC%A2%8B%EC%95%84%ED%95%98%EC%84%B8%EC%98%81

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