함수형 프로그래밍

Anna·2024년 5월 28일
0

코틀린

목록 보기
8/28
post-thumbnail

다중 패러다임

코틀린은 함수 프로그래밍과 객체지향 프로그래밍을 모두 지원하는 "다중 패러다임 언어"다.


객체지향 프로그래밍 (Object-Oriented Programming, OOP)

소프트웨어를 유연하고, 재사용 가능하며, 모듈화된 방식으로 설계할 수 있게 해주는 프로그래밍 패러다임이다. 접근 방식은 프로그램을 객체라고 하는 서로 상호작용하는 구성 요소로 구성하는 것을 의미한다. 각 객체는 데이터를 포함하고 있으며(속성이라고 함), 데이터를 조작할 수 있는 일련의 함수(메서드라고 함)를 가지고 있다.

예를 들어
'자동차'를 프로그램으로 표현하고 싶다면, 자동차의 속성으로는 '색상', '브랜드', '속도' 등이 있을 수 있고, 기능으로는 '가속하기', '정지하기', '속도 변경하기' 등이 있을 수 있다. 이렇게 속성과 기능을 가진 '자동차'라는 객체를 만들어 프로그램 내에서 사용하는 것이다.

장점
코드의 재사용이 가능하다.
분석과 설계의 전환이 쉽다.

단점
처리 속도가 상대적으로 다소 느리다.
설계에 많은 시간이 소요된다.


함수형 프로그래밍

순수 함수를 사용해, 상태를 제어하기 보단 빨리 처리하는데 초점을 둔다. 실행 순서를 지정할 필요가 없기 때문에 비절차형 언어라고도 한다.
람다식, 고차 함수를 사용해 구성되어 있다.

장점
코드 간략 > 가독성이 좋아짐
테스트나 재사용성 증가

단점
외부 데이터 혹은 내부 데이터의 상태를 조작할 수 없다.


순수 함수(pure function)란?

부작용(side-effect)이 없는 함수
동인한 입력 인자에 대해서는 항상 같은 결과를 출력 혹은 반환한다.
값이 예측이 가능해 결정적(deterministic)이다.

순수 함수의 조건
-> 같은 인자에 대하여 항상 같은 값을 반환
-> 함수 외부의 어떤 상태도 바꾸지 않는다.

✍️ 순수 함수

fun sum(a: Int, b: Int) : Int
{
	return a + b     //동일한 인자인 a,b를 입력 받아 항상 a+b를 출력
}

✍️ 비순수 함수(1)

fun check()
{
	val test = User.grade()  //check()함수에 없는 외부의 User객체를 사용
    if (test != null) process(test)  //변수 test는 User.grade()의 실행 결과에 따라 달라짐
}

✍️ 비순수 함수(2)

fun sum2(a, b)
{
	return a + b + c; // 외부 요인 c에 따라 리턴값이 변경됨
}

람다식(Lambda Expression)란?

함수형 프로그래밍을 지원하는 중요한 기능 중 하나로, 익명 함수(Anonymous Function)를 간결하게 표현하는 방법이다. 람다식은 주로 코드의 간결성과 가독성을 높이고, 일급 객체로서의 함수를 다루기 위해 사용된다.

✍️ 기본 문법

val lambdaName: (매개변수 타입) -> 반환 타입 = { 매개변수 -> 함수 본문 }

✍️ 람다식 예1

fun main()
{
    println(highFunc({x,y -> x+y}, 10, 20))  //람다식 함수를 인자로 넘김
}

fun highFunc(sum:(Int,Int)->Int, a:Int, b:Int):Int = sum(a, b) //sum 매개변수는 함수


함수형 프로그래밍을 쓰는 이유는

  1. 프로그램을 모듈화 해 디버깅하거나 테스트가 쉽다.
  2. 간략한 표현식을 사용해 생산성이 높다.
  3. 람다식과 고차함수를 사용하면서 다양한 함수 조합을 사용할 수 있다.

0개의 댓글