Kotlin - FP Kotlin

이동수·2024년 8월 20일

Kotlin

목록 보기
3/33
post-thumbnail

시작하기 전

명령형 프로그래밍

  • 무엇(What)을 할 것인지 보다는 어떻게(How) 할 건지를 설명하는 방식
    • 절차지향 프로그래밍(procedural programming)
      • 알고리즘과 로직 중심의 문제해결이 주목적(c, c++ 등)
    • 객체지향 프로그래밍(object oriented programming)
      • 실세계를 모델링하여 행위와 속성을 연동(side effect)하여 구성하는 프로그래밍 기법 (java, c++, dart, python, swift,kotlin 등)
      • oop는 클래스가 일급객체로 취급

선언적 프로그래밍

  • 어떻게 할 것인지(How) 보다는 무엇(What)을 할 건지를 설명하는 방식
    • 함수형 프로그래밍(functional programming)
      • 함수 선언이 최우선

      • 순수 함수를 조합하고 소프트웨어를 만드는 방식

      • 메소드와 필드의 연동(Side Effect)이 아닌 함수의 선언과 선언된 함수의 흐름을 연결 하여 프로그래밍 하는 기법 (클로저,Haskell, Lisp, Scala sql, jsp, jetpack compose, swift,kotlin 등)

        compose : xml처럼 class, 인스턴스화 하지않고, 코드로 바로 “이거 그려줘” 하는것

      • 일급 객체로서의 함수

        • 함수가 프로그래밍의 최상위 구성요소
        • 클래스를 정의하지 않고도 함수를 정의하고, 그 안에 함수·클래스를 포함 할 수 있어야함
      • 부작용(side effect,부수효과)이 없는 순수함수로 정의되는 함수

절차지향, 선언적 프로그래밍 비교 예시

언어/상황음식점 한명추가홍대 특정장소 가는법
절차지향젓가락1개, 숫가락1개, 국그릇 1개…주세여집나와서 왼쪽으로 100m, 2번출구 들어가서 2호선타고 가다가 홍대입구역에서 내려서, 9번출구로 나외…..
선언적여기 한명 더 왔어요주소 던져놓고 “여기 찾아줘”

프로그래밍 패러다임

Kotlin을 비롯한 몇몇 프로그래밍 언어는 OOP 와 FP를 지원한다. Kotlin은 설계당시 부터 FP 지향을 목적으로 두고 설계되었다

또한 많은 프로그래밍 언어들(Swift, Python등)이 OOP & FP를 지향한다

이러한 프로그래밍 언어를 Multi-Paradigm 또는 Hybrid Language라고 한다.

프로그래밍 패러다임이란 프로젝트에서 문제를 해결하는 프로그램을 작성할 때의 관점 내지 방법론이다. (어떤 프로그래밍이 맞고 아니고 싸울게 아니라 해당 프로젝트의 성격에 맞게 선택하면 되는 것이다.)

Function Programming

프로젝트를 커다란 함수로 보고 순수함수를 조합해 프로그래밍을 하는 방법

설명

  • 프로그램이 복잡해지면 동시성 & 비동기 프로그래밍이 필수적
  • OOP에서 동시성 & 비동기 프로그램은 객체의 상태를 관리하기 어렵고 유지
    보수를 어렵게 함 (총비용 10~15%이 유지보수비용, 그 비용 줄이려고 clean아키텍처를 중요시함)
    - 함수형 언어 스칼라가 등장
    - 하스켈은 언어에 대한 접근성 매우 낮음(특히 한국은 자바 천국)
    - 하스켈은 기본 자바로 구축된 환경을 모두 버려야 하는 문제발생
    - 스칼라는 하이브리드 언어이며 자바와 호환
    - 스칼라는 문법이 복잡하며 러닝 커브가 상대적으로 높음
  • 한국은 자바8에 함수형 기능이 포함되며 본격적인 함수형 프로그래밍의 대중화를 선도하는 계기가 됨

기본 원칙

  • 함수를 변수처럼 사용가능 해야 함
  • 함수에 다른 함수를 인자로 주거나 리턴 할 수 있어야 함 (고차함수)
  • 함수는 자기가 속한 위치의 다른 데이터를 참조할 수는 있지만 변경하면 안됨
  • FP에선 함수도 객체로 본다

장점

  • 코드가 간결(처음 접한 사람은 멘붕~~)
  • 개발 생산성
  • 유지보수
  • Side Effect가 없어 동시성 작업이 수월(개인적으로 OOP 보다 탁월)

특징

  • 함수안에 함수, class가 가능함 (이렇게 코딩은 안함)
    fun functionName(,,,){
    	variables
    	, , , ,
    	function(){, , ,}
    	class OOP{
    		property
    		functions
    	}
    }

순수함수

  • 함수 외부의 다른 값을 변경하지 않는다
  • 함수 내부에서 입/출력(예기치 못한 상황발생 여지가 있는 함수)이 발생하지 않도록 한다 (DB, Network, File Input/Output 등)
  • 함수를 실행하는 중에 부수효과(Side Effect)가 발생하지 않아야 한다
  • ex) 순수함수 O
    fun sum(num1: Int, num2: Int) : Int {
    	return num1 + num2
    }
  • ex) 순수함수 X
    var num3 = 10
    fun sum(num1: Int, num2: Int) : Int {
    	num3 = 25 //side effect
    	return num1 + num2
    }

일급 객체 함수

함수내에 함수, 클래스, 변수 등을 선언가능해야 한다

  • 함수를 변수처럼 사용가능 해야함
    • 람다함수 사용
    • 함수 참조( :: ) 이용 (reflection를 활용한 것)

      reflection : 런타임 중 객체의 Meta-Info(클래스,객체,함수객체 등)를 알아 낼 수 있는 기능세트

      fun functionReference(arg: Int) = arg * arg
      
      fun main(){
      	val funRef = ::functionReference
      	println(funRef(10))
      }
      • 만약 fun functionReference(arg: Int) = arg * arg 가 클래스 안에 있었으면 클래스이름::functionReference 해서 사용하면 된다

      • fun functionReference(arg: Int) = arg * arg 함수를 람다로 표현하려면 밑에처럼 사용

        val functionVariable = { arg: Int -> arg * arg}
        
        fun main(){
        	val result = functionVariable(10)
        	println("""$result""")
        }

참조 함수

  • 함수를 인자로 전달한다.

  • :: 뒤에는 함수만 올 수 있다 (fun만)

  • fun, class{fun}, object{fun}로 참조함수

    package SeSAC_0816_FP
    
    fun pc(salary: Int, month: Int){
        println("$month 월 월급은 ${salary/12}")
    }
    
    class EmpClassFunRef{
        fun pc2(salary: Int, month: Int) = println("$month 월 월급은 ${salary/12}")
    }
    object EmpObjectRef{
        fun pc3(salary: Int, month: Int) = println("$month 월 월급은 ${salary/12}")
    }
    
    fun main(){
        var pcFunRef :(Int,Int) -> Unit //함수 참조 변수 선언
        var a = ::pc
        pc(1000,3)
        var b = pc(1000,4)
    
        pcFunRef= EmpClassFunRef()::pc2
        pcFunRef(10000,3)
    
        pcFunRef = EmpObjectRef::pc3
        pcFunRef(100000,3)
    
    }

0개의 댓글