ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Functional Programming
    Android/Kotlin 2021. 8. 11. 22:41
    λ°˜μ‘ν˜•
    • 이 글은 "μœ€μž¬μ„±μ˜ Google 곡식 μ–Έμ–΄ Kotlin" κ°•μ˜λ₯Ό λ“£κ³  κ³΅λΆ€ν•œ λ‚΄μš©μœΌλ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

    • JavaλŠ” 객체지ν–₯ μ–Έμ–΄λ‘œ 클래슀λ₯Ό μ„€κ³„ν•˜κ³  λ©”μŠ€λ“œλ₯Ό μ •μ˜ν•œ ν›„ μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•΄μ„œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • Kotlin은 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°λ„ μ§€μ›ν•˜κ³  ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°λ„ μ§€μ›ν•˜μ—¬ ν΄λž˜μŠ€κΉŒμ§€ 생성할 ν•„μš”μ—†μ΄ ν•¨μˆ˜λ§Œ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜λŠ” 것을 μ§€μ›ν•©λ‹ˆλ‹€.

    • 예λ₯Ό λ“€μ–΄, Javaμ—μ„œ ν•¨μˆ˜ μ •μ˜ μ‹œ λ‚΄λΆ€ νŒŒλΌλ―Έν„°λ‘œ μΈν„°νŽ˜μ΄μŠ€κ°€ ν•„μš”ν•  κ²½μš°μ— μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„μ²΄λ₯Ό μ •μ˜ν•œ ν›„ λŒ€μž…ν•˜μ—¬ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ Kotlin 같은 경우 ν•¨μˆ˜ν˜•μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— νŒŒλΌλ―Έν„°μ— ν•¨μˆ˜κ°€ λ“€μ–΄κ°ˆ 수 있게 λ˜μ–΄ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • 이외에도 Kotlinμ—μ„œλŠ” ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°μ— 보닀 νŽΈλ¦¬ν•œ κ°œλ…λ“€μ΄ μ‘΄μž¬ν•©λ‹ˆλ‹€.


    λžŒλ‹€μ‹

    fun main(){
        var lambda1 = {a1: Int, a2:Int ->
            a1+a2
        }
    
        val lambda2 = {
            print("hello world")
        }
    }
    • λ‹€μŒκ³Ό 같이 λžŒλ‹€μ‹μ„ μ •μ˜ν•  수 있고, Return Type은 λ§ˆμ§€λ§‰μ— ν‘œμ‹œν•˜λ©΄ λ©λ‹ˆλ‹€.
    • lambda1은 두 κ°€μ§€μ˜ Intν˜• λ³€μˆ˜λ₯Ό λ°›μ•„ λ§μ…ˆ ν›„ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ‘œ νƒ€μž…μ€ (Int, Int) -> Int κ°€ λ©λ‹ˆλ‹€.
    • lambda2λŠ” λ§€κ°œλ³€μˆ˜ 없이 좜λ ₯만 ν•˜λŠ” ν•¨μˆ˜λ‘œ νƒ€μž…μ€ () -> Unit μž…λ‹ˆλ‹€.

    Inline ν•¨μˆ˜

    • Kotlin μ½”λ“œκ°€ Java μ½”λ“œλ‘œ λ³€ν™˜λ  λ•Œ ν•¨μˆ˜ ν˜ΈμΆœν•˜λŠ” μ½”λ“œκ°€ ν˜ΈμΆœν•œ 곳에 직접 κ΅¬ν˜„ν•œ μ½”λ“œλ‘œ λ³€κ²½ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

    • ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” μ΄μœ λŠ” 반볡된 μ½”λ“œκ°€ μ‘΄μž¬ν•  μ‹œ μ½”λ“œμ–‘μ„ 쀄이고 생산성을 높이기 μœ„ν•΄ μ‚¬μš©ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ κ΅¬μ‘°μ—μ„œ Code 곡간에 더 적게 μ°¨μ§€ν•˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ 츑면에 이점은 μžˆμ§€λ§Œ, ν•¨μˆ˜ ν˜ΈμΆœν•˜κ³  λ‹€μ‹œ λ°˜ν™˜λ˜λŠ” 과정이 ν¬ν•¨λ˜μ–΄ μž‘μ—…λŸ‰ μžμ²΄λŠ” λŠ˜μ–΄λ‚˜κ²Œ λ©λ‹ˆλ‹€.

    • Inline ν•¨μˆ˜λŠ” ν•¨μˆ˜ 내뢀에 직접 μ½”λ“œκ°€ κ΅¬ν˜„λ˜κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬λŠ” 더 많이 μ‚¬μš©ν•˜μ§€λ§Œ μ½”λ“œ 흐름이 계속 μœ μ§€λ˜κΈ° λ•Œλ¬Έμ— μž‘μ—…λŸ‰μ€ λŠ˜μ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

    • κ²Œμž„μ—…κ³„μ—μ„œλŠ” λ©”λͺ¨λ¦¬μ˜ 증가보단 CPU μ„±λŠ₯이 μ΅œμš°μ„ μ΄κΈ° λ•Œλ¬Έμ— 많이 μ‚¬μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

    fun main(){
        testfunc1()
    }
    
    fun testfunc1(){
        println("testfunc1")
    }
    public final class MainKt {
       public static final void main() {
          testfunc1();
       }
    
       // $FF: synthetic method
       public static void main(String[] var0) {
          main();
       }
    
       public static final void testfunc1() {
          String var0 = "testfunc1";
          boolean var1 = false;
          System.out.println(var0);
       }
    }
    • μœ„μ— μžˆλŠ” kotlin νŒŒμΌμ„ Javaμ½”λ“œλ‘œ Decompileν•œ κ²°κ³Όμž…λ‹ˆλ‹€.
    • testfunc1을 λ‹¨μˆœν•œ ν•¨μˆ˜λ‘œ μ •μ˜ν•˜μ˜€κΈ° λ•Œλ¬Έμ— Java μ½”λ“œμ—μ„œλ„ λ™μΌν•˜κ²Œ 생기고 mainν•¨μˆ˜μ—μ„œ ν˜ΈμΆœν•˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
    fun main(){
        testfunc1()
    }
    
    inline fun testfunc1(){
        println("testfunc1")
    }
    public final class MainKt {
       public static final void main() {
          int $i$f$testfunc1 = false;
          String var1 = "testfunc1";
          boolean var2 = false;
          System.out.println(var1);
       }
    
       // $FF: synthetic method
       public static void main(String[] var0) {
          main();
       }
    
       public static final void testfunc1() {
          int $i$f$testfunc1 = 0;
          String var1 = "testfunc1";
          boolean var2 = false;
          System.out.println(var1);
       }
    }
    • Inline ν•¨μˆ˜λ‘œ λ°”κΎΈλ©΄ κΈ°μ‘΄κ³Ό λ‹€λ₯΄κ²Œ testfun1에 μžˆλŠ” ν•¨μˆ˜κ°€ 직접 mainμ—μ„œ ν˜ΈμΆœλ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

    Extension ν•¨μˆ˜

    • μ•ˆλ“œλ‘œμ΄λ“œ 개발 μ‹œμ— μ•ˆλ“œλ‘œμ΄λ“œ μ»΄ν¬λ„ŒνŠΈμ— Dependencyν•œ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. 이 같은 ν΄λž˜μŠ€λŠ” λ³€κ²½ν•  μˆ˜κ°€ μ—†λŠ”λ° Koltin의 Extension ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ κΈ°μ‘΄ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ ν•¨μˆ˜κ°€ μΆ”κ°€λœ κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • Extension ν•¨μˆ˜κ°€ κΈ°μ‘΄ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ ν•¨μˆ˜κ°€ μΆ”κ°€λœ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ μ •ν™•ν•œ μ›λ¦¬λŠ” 클래슀의 λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§€κ³  κ·Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.

    fun main(){
        var str1 = "abcd"
        println(str1.getUpperString())
    }
    
    fun String.getUpperString(): String{
        return this.getUpperString()
    }
    public final class MainKt {
       public static final void main() {
          String str1 = "abcd";
          String var1 = getUpperString(str1);
          boolean var2 = false;
          System.out.println(var1);
       }
    
       // $FF: synthetic method
       public static void main(String[] var0) {
          main();
       }
    
       @NotNull
       public static final String getUpperString(@NotNull String $this$getUpperString) {
          Intrinsics.checkParameterIsNotNull($this$getUpperString, "$this$getUpperString");
          return getUpperString($this$getUpperString);
       }
    }
    • java둜 Decompile된 κ²°κ³Όλ₯Ό 확인해보면 mainν•¨μˆ˜μ—λŠ” getUpperString을 ν˜ΈμΆœν•˜κ²Œ λ©λ‹ˆλ‹€.

    • getUpperString은 String ν΄λž˜μŠ€μ— μ •μ˜λœ 것이 μ•„λ‹Œ str1을 λ§€κ°œλ³€μˆ˜λ‘œ λ§Œλ“  ν•¨μˆ˜κ°€ μ •μ˜λ˜κ³  ν˜ΈμΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.


    κ³ μ°¨ ν•¨μˆ˜

    • ν•¨μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ°›κ±°λ‚˜, 리턴 νƒ€μž…μ΄ ν•¨μˆ˜μΈ ν•¨μˆ˜λ₯Ό κ³ μ°¨ν•¨μˆ˜λΌκ³  ν•©λ‹ˆλ‹€.

    • ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ‚˜ λ°˜ν™˜ ν•¨μˆ˜λ₯Ό λžŒλ‹€μ‹μœΌλ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

    fun main(){
        var a1 = 10
        var a2 = 20
    
        var r = highfunction(a1, a2, { a1:Int, a2:Int -> a1+a2})
        print(r)
    
        var r2 = highfunction(a1, a2){ m1,m2 ->
            m1+m2
        }
        println(r2)
    }
    
    fun highfunction(a1: Int, a2: Int, func:(Int,Int) -> Int) : Int {
        return func(a1, a2)
    }
    • λ‹€μŒκ³Ό 같이 κ³ μ°¨ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  λžŒλ‹€μ‹μ„ 톡해 ν˜ΈμΆœν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • Kotlinμ—μ„œ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ νŠΉμ§•μ΄ ν•˜λ‚˜ μžˆλŠ”λ° κ³ μ°¨ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜μ—μ„œ λ§ˆμ§€λ§‰μ— ν•¨μˆ˜λ₯Ό λŒ€μž…ν•˜λŠ” κ²ƒμœΌλ‘œ μ •μ˜κ°€ λ˜μ–΄ μžˆλ‹€λ©΄, var r2 λ³€μˆ˜λ₯Ό μ§€μ •ν•˜λ“―μ΄ μ€‘κ΄„ν˜Έλ₯Ό μƒˆλ‘œ μ—΄μ–΄μ„œ λŒ€μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λ ‡κ²Œ ν•œ μ΄μœ κ°€ λžŒλ‹€μ‹μœΌλ‘œ μ •μ˜ν•  λ•Œ λžŒλ‹€μ‹μ΄ 길게 될 경우 μ•„λž˜λ‘œ λ‚΄λ¦¬λŠ” 것을 μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œλΌκ³  ν•©λ‹ˆλ‹€.
    λ°˜μ‘ν˜•

    'Android > Kotlin' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    [Kotlin] String μ‚¬μš©λ²•  (0) 2021.08.12
    [Kotlin] Array μ‚¬μš©λ²•  (0) 2021.08.12
    [Kotlin] Generic, Inner 클래슀  (0) 2021.07.07
    [Kotlin] Companion Object λž€?  (0) 2021.07.05
    [Kotlin] μ ‘κ·Όμ œν•œμž, property, get(), set()  (0) 2021.07.05
Designed by Tistory.