본 게시글은 부스트코스의 코틀린 기본프로그래밍을

시청한 후 학습한 정보를 기록하는 목적의 게시글입니다.

부스트코스

 

다 함께 배우고 성장하는 부스트코스

부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.

www.boostcourse.org

코틀린 기본프로그래밍(1/2)

 

코틀린 프로그래밍 기본1/2(함수편)

부스트코스 무료 강의

www.boostcourse.org

본 게시글은 부스트코스 서포터즈 3기 활동 게시글입니다.


#3-3. 함수형 프로그래밍 패러다임! (1)

- 들어가기 전에

코틀린은 함수형 프로그래밍(FP: Functional Programming)과 객체 지향 프로그래밍(OOP: Object-Oriented Programming)을 모두 지원하는 다중 패러다임 언어입니다. 함수형, 객체 지향 프로그래밍 기법의 장점은 코드를 간략하게 만들 수 있다는 것입니다. 먼저 함수형 프로그래밍은 코드가 간략화, 테스트나 재사용성이 더 좋아지면서 개발 생산성이 늘어나게 됩니다. 이제 함수형 프로그래밍의 개념을 차근차근 공부해 봅시다!

 

- 핵심 키워드

  • 함수형 프로그래밍(FP)

  • 순수 함수 (Pure Function)

  • 람다식 (Lambda Expression)

  • 일급 객체 (First-class)

  • 고차 함수 (Higher-Order Function)

 

1) 함수형 프로그래밍이란

코틀린 : 함수형 프로그래밍 + 객체 지향 프로그래밍

함수형 프로그래밍

- 코드를 간략화하여 테스트나 재사용성을 증가

- 람다식, 고차 함수를 사용해 구성할 수 있음

- 순수 함수

 

2) 순수함수의 개념

조건 : 부작용이 없는 함수

> 동일한 입력 인자에 대해서는 같은 결과를 출력 혹은 반환 해야 한다.

즉, 순수 함수를 사용할 때에는 반드시 값이 예측가능하여야 한다.

fun sum(a: Int, b: Int): Int{
    return a + b
}

가령 위와 같은 식은 인자로 2와 3을 대입한다면,

몇 번을 수행하든 5를 반환할 것이기 때문에 순수함수라 할 수 있다.

순수 함수의 조건은 아래와 같다.

  1. 같은 인자에 대하여 항상 같은 값을 반환

  2. 함수 외부의 어떤 상태도 바꾸지 않는다.

fun check(){
    val test = User.grade()
    if (test != null) process(test)
}

위와 같은 함수는 check 함수 내부에 정의되어 있지 않은 외부의 User 객체를 사용할 뿐더러

User.grade에 따라 check 함수의 동작이 달라지게 됨으로 순수함수라 할 수 없다.

fun noPureFunction(a : Int, b: Int): Int{
    return a + b + global
}

위와 같은 경우에도 입력값과 무관하게 외부의 변수인 global을 사용하기 때문에,

global의 값에 따라 동일한 인자를 넣었음에도 수행동작이 달라질 수 있기에 순수함수라 할 수 없다.

 

! 왜 순수함수를 사용할까?

  • 입력과 내용을 분리하고 모듈화 하므로 재사용성이 높아진다.

    여러가지 함수들과 조합해도 부작용이 없다.

  • 특정 상태에 영향을 주지 않으므로 병향 작업 시 안전하다.

  • 함수의 값을 추적하고 예측 할 수 있게 때문에 테스트, 디버깅 등이 유리하다.

 

이를 함수형 프로그래밍에 적용한다면,

함수를 매개변수의 인자 반환값에 적용할 수 있고, (이를 고차함수라 한다)

함수를 변수나 데이터 구조에 저장할 수 있기 때문에 유연한 프로그래밍을 할 수 있게 된다.

 

3) 람다식의 개념

익명 함수의 하나의 형태로 이름 없이 사용 및 실행이 가능한 식을 말한다.

{ x , y -> x + y }

람다식은 ` -> ` 기호로 사용할 수 있고,

화살표를 기준으로 좌항이 인자이고 우항이 결과이다.

람다식 역시 이름이 없는 함수이기 때문에 다른 함수의 인자로 사용될 수 있다.

 

4) 일급 객체란

  • 일급 객체는 함수의 인자로 전달할 수 있다.

  • 일급 객체는 함수의 반환값에 사용할 수 있다.

  • 일급 객체는 변수에 담을 수 있다.

코틀린에서 함수는 일급객체로 취급한다.

 

5) 고차 함수란

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

fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int = sum(a, b)

위 코드에서 highFunc를 살펴보면, 인자로 람다식과 a, b를 요구하고 있다.

그래서 sum(a, b)는 람다식의 표현문에 따라 결국 a+b의 정수값 결과를 반환하게 된다.

이렇게 함수의 인자 혹은 반환값에 또 다른 함수를 사용하여 만들어진 함수를 고차함수라 한다.

 

#3-3. 함수형 프로그래밍 패러다임! (2)

- 들어가기 전에

간단한 실습을 통해서 함수형 프로그래밍의 묘미를 느껴볼까요!

 

- 핵심 키워드

  • 람다식, 익명 함수

  • 고차 함수

 

1) 실습 : 고차함수와 람다식의 간단한 예

 

fun highFunc(sum: (Int, Int) -> Int, a: Int, b: Int): Int {
    return sum(a, b)
}

fun main() {
    val result = highFunc({x, y -> x + y}, 1, 3)
    println(result)
}
fun highFunc(a: Int, b: Int, sum: (Int, Int) -> Int): Int {
    return sum(a, b)
}

fun main() {
    val result = highFunc(1, 3) {x, y ->
        x + y
    }
    println(result)
}

 

2) 함수형 프포그래밍의 개념 요약

함수형 프로그래밍 사용 이유

  • 프로그램을 모듈화해 디버깅하거나 테스트가 쉬움

  • 간략한 표현식을 사용해 생산성이 높음

  • 람다식과 고차함수를 사용하면서 다양한 함수 조합을 사용할 수 있음

함수형 프로그래밍은 순수 함수를 조합해 상태 데이터 변경이나 부작용이 없는 루틴을 만들어 내며

이름 없는 함수 형태의 하나인 람다식을 이용해 함수를 변수처럼 매개변수, 인자, 반환값 등에 활용하는

고차 함수를 구성해 생산성을 높인 프로그래밍 방법이다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기