티스토리 뷰

함수 선언

  • 중괄호 안의 코드가 한줄이면 중괄호와 return 키워드 생략 가능

  • 잡플래닛 코드 예) MyProfileExperienceActivity.kt - uiEventObserve

     fun convertScreenName(name : String) : String {
           return "HelloWorld $name!"
       }
    
     fun convertScreenName(name : String) : String = "HelloWorld $name!"

반환값이 없는 함수

  • 반환 키워드(Unit)을 생략할 수 있음

  • Unit vs Void : 자바의 void는 아무것도 반환하지 않지만, Unit은 특수한 객체를 반환한다는 차이점이 존재함

       fun onDetailSubItemClick(docUrl: String) : Unit {
           detailViewModelInterface.openWebBrowser(docUrl)  
       }
    
       fun onDetailSubItemClick(docUrl: String) {
           detailViewModelInterface.openWebBrowser(docUrl)
       }

매개변수 함수 활용

  • 매개변수의 기본값 지정 가능

       fun onDetailSubItemClick(docUrl: String = "https://www.naver.com") =
           detailViewModelInterface.openWebBrowser(docUrl)
  • 매개변수 이름과 함께 함수 호출 가능

    fun setMeetingRoom(name: String, address: String) {
           // ...
       }
    
       fun main() {
           setMeetingRoom(
               name = "미팅룸1", 
               address = "지하1층 B01"
           )
       }

인자 갯수가 고정되지 않은 함수

  • vararg 키워드의 argument를 통해 여러개의 인자를 받아서 함수를 생성할 수 있음

       private val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
        private val intArray = intArrayOf(6, 7, 8, 9)
    
        private fun printNumberArray(vararg numbers: IntArray) {
            for (i in numbers) {
                println(i)
            }
        }
    
        fun main() {
            printNumberArray(numbers)
            printNumberArray(intArray)
        }

함수형 프로그래밍

  • 순수함수를 작성하여 프로그램의 부작용을 줄이는 프로그래밍 기법
    • 람다식 / 고차함수 사용

순수 함수

  • 함수 외부의 어떤 상태도 바꾸지 않는다는 의미의 함수를 순수 함수라고 칭한다.

    • 같은 인자에 대하여 항상 같은 값을 반환
    • 함수 외부의 어떤 상태도 바꾸지 않는다.
    // 동일한 인자 a,b를 입력받아 항상 a + b를 출력(부작용 X)
    fun sum(a : Int, b: Int) : Int = a + b

일급 객체

  • 함수형 프로그래미에서는 함수를 일급 객체로 생각
    • 특징
      • 일급 객체는 함수의 인자로 전달할 수 있다.
      • 일급 객체는 함수의 반환값에 사용할 수 있다.
      • 일급 객체는 변수에 담을 수 있다.

고차함수 및 람다식

  • 다른 함수를 인자로 사용하거나 함수를 결과값으로 반환하는 함수

        private fun highOrderFunction(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)
    
        fun main() {
            println(
                highOrderFunction(
                    { x, y -> x + y },
                    20,
                    30
                )
            )
        }
  • 일반함수를 인자나 반환값으로 사용하는 고차함수

        private fun sum(a: Int, b: Int): Int = a + b
    
        private fun sumFunction(): Int = sum(40, 2)
    
        fun main() {
            println("sunFunction result = ${sumFunction()}")
        }
    • 람다식을 인자나 반환값으로 사용하는 고차함수
        fun main() {
            val multiply = { x: Int, y: Int -> x * y }
            println("곱셈 결과 = ${multiply(8, 8)}")
        }
    • 반환 자료형이 아예 없거나 매개변수가 하나만 있을때의 고차함수
        val helloWorld: () -> Unit = { println("Hello World!") }
        val ourSelfSum : (Int) -> Int = { a -> a + a }
  • 람다식 안에 람다식을 넣는 람다식 함수

        val nestedLambda: () -> () -> Unit = { { println("nested 1") } }
        val nestedLambda: () -> () = { { println("nested 2") } }
  • 인자와 반환값이 없는 람다식 함수

        val print: () -> Unit = { println("print") }
        val print = { println("print") }

함수형 프로그래밍의 정의와 특징

  • 순수 함수를 사용해야 한다.
  • 람다식을 사용할 수 있다.
  • 고차함수를 사용할 수 있다.

인라인 함수

  • 해당 함수가 호출되는 곳에 함수 본문의 내용을 모두 복사하여 함수의 분기 없이 처리됨

  • 인라인 함수는 람다식 매개변수를 가지고 있는 함수에서 동작

  • inlineFunc 함수가 두번 호출되는 것처럼 보이겠지만 디컴파일 시 inlineFunc 내용이 복사되어 보여지게 됨

        inline fun inlineFunc(x: Int, out: (Int) -> Unit) = out(x)
    
        fun main() {
            inlineFunc(6) { println("First $it") }
            inlineFunc(1) { println("Second $it") }
        }

아웃라인 함수

  • 인라인 함수의 매개변수 람다식 코드가 너무 길거나 인라인 함수의 본문자체가 길어지면 성능 오버헤드 이슈가 발생함

  • 일부 람다식을 인라인되지 않기 위해 사용

        inline fun sub(out1: () -> Unit, out2: () -> Unit) { }
        inline fun subToNoInline(out1: () -> Unit, noinline out2: () -> Unit) { }

확장 함수

  • 기존 클래스에 내가 원하는 함수를 포함 시켜 확장하고 싶을 때 확장 함수 사용

  • 잡플래닛의 extension에서 잘 사용하고 있음.

    /**
     * 전화번호 하이픈(-) 넣기
     */
    fun String.convertNumberToPhoneNumber(): String {
        return try {
            val regexString = "(\\d{3})(\\d{3,4})(\\d{4})"
            return if (!Pattern.matches(regexString, this)) this else Regex(regexString).replace(
                this,
                "$1-$2-$3"
            )
        } catch (e: ParseException) {
            e.printStackTrace()
            this
        }

중위 함수(infix)

  • 클래스의 멤버를 호출할 때 사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 붙이지 않아 직관적인 이름을 사용할 수 있는 표현법

    • 멤버 메서드 또는 확장함수 여야 한다.
    • 하나의 매개변수를 가져야 한다.
    • infix 키워드를 사용하여 정의한다.
    infix fun Int.multiply(x: Int): Int {
        return this * x
    }
    
    fun main() {
        println("multiply result = ${3 multiply 10}")
    }
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함