본문 바로가기

함수형프로그래밍

(26)
[코틀린] 고차함수 - 함수 참조와 익명 함수 이용 고차 함수에서 매개변수나 반환값으로 람다 함수를 많이 이용하지만, 함수 참조나 익명 함수를 이용해도 된다. 함수 참조를 이용한 함수 전달 고차 함수를 이용할 때 람다 함수 외에 함수 참조 연산자로 콜론 두개(::)를 이용할 수도 있다. 먼저 아래 소스코드는 람다코드로 작성한 코드이다. fun hoFun6(argFun: (x:Int) -> Int){ println("${argFun(10)}") } fun main() { hoFun6 { it * 5 } } [결과값] 50 고차함수를 선언하고, 매개변수로 함수를 받고 있다. 이렇게 선언한 고차 함수를 호출하면서 함수를 전달해야하는데 위의 소스코드에서는 it *5 라는 람다 함수를 넘겨서 10 * 5의 결과값을 출력하고 있다. 이런 소스 코드를 다음과 같이 함..
[코틀린] 고차함수 - 함수 반환 고차 함수는 다른 함수를 매개변수로 이용하거나, 반환하는 함수이다. 앞에서는 매개변수 부분에 함수를 이용하는 방법을 알아보았다. 이번에는 고차 함수에서 함수를 반환하는 방법에 대해 살펴보겠다. fun hoFun5(str: String): (Int, Int) -> Int { return when (str) { "*" -> { x1, x2 -> x1 * x2 } "-" -> { x1, x2 -> x1 - x2 } "/" -> { x1, x2 -> x1 / x2 } else -> { x1, x2 -> x1 + x2 } } } fun main() { val resultFun = hoFun5("*") println("resultFun * : ${resultFun(10,5)}") } [결과값] resultFun *..
[코틀린] 고차함수 - 매개변수 대입 고차함수란, 매개변수로 함수를 전달받거나 함수를 반환하는 함수를 말한다. 아래 소스에서는 fun 예약어와 hoFun이라는 함수명 그리고 ( )안에 매개변수, { } 안에 함수 내용을 선언했다. fun hoFun(x1: Int, argFun: (Int) -> Int){ val result = argFun(x1) println("x1 : $x1, result : $result") } fun main() { hoFun(10, {x -> x * x} ) } [결과값] x1 : 10, result : 100 하지만 일반 함수와는 차이가 있다. 두 번째 매개변수는 argFun: (Int) -> Int로 선언했다. 매개변수로 함수를 받고자 함수 타입을 선언한 것이다. 코틀린에서는 일반적으로 데이터 타입을 선언할 때 ..
[코틀린] 람다 표현식 람다식 또는 람다함수는 프로그래밍 언어에서 사용되는 개념이다. 익명함수라고도 부르며, 함수형 프로그래밍을 목적으로 하지 않더라도 간결함을 주 목적으로 사용된다. 함수형 프로그래밍에서는 람다 함수가 고차 함수의 매개변수나 반환값으로 사용되므로 더욱 중요하다. 코틀린에서 함수의 정의는 fun 예약어를 사용한다. fun 함수이름(매개변수) { 함수내용 } 람다 함수는 fun과 함수이름을 명시하지 않고 축약형으로 선언한다. {매개변수 -> 함수 내용} 람다 함수는 {}안에 매개변수와 함수 내용을 선언하는 함수로 아래와 같은 규칙을 정의한다. 1. 람다 함수는 항상 {}로 감싸서 표현한다. 2. {} 안에 -> 표시가 있으며 -> 왼쪽은 매개변수, 오른쪽은 함수 내용이다. 3. 매개변수 타입을 선언해야 하며 추론..
[코틀린] 일급 객체로서의 함수 코틀린에서 함수가 일급 객체로 활용되는 부분에 대해서 살펴보겠다. 코틀린의 함수 내에는 다양한 구성요소를 포함시킬 수 있다. fun superFun() { val superData = "hello" fun subFun1() { println("subFun1() .. superData : $superData") } fun subFun2(a: Int, b: Int): Int { subFun1() return a + b } class SubClass{ fun classFun(){ println("classFun() .. superData : ${superData}") } } subFun1() SubClass().classFun() } 함수를 클래스에 포함하지 않고, 함수 내부에 변수, 함수, 클래스를 선언했다..
[RxJava] ConnectableObservable 클래스 이전에 Observable의 수많은 변형을 다루었다. 주어진 데이터를 발행하기위해 just()나 fromArray() 함수를 사용할 때도 있었고 PublishSubject, AsyncSubject 클래스 등 처럼 Observable이면서 옵서버도 되는 Subject 클래스도 살펴봤다. 이번에 살펴볼 ConnectableObservable 클래스는 Subject 클래스처럼 차가운 Observable을 뜨거운 Observable로 변환한다. Observable을 여러 구독자에게 공유할 수 있으므로 원 데이터 하나를 여러 구독자에게 동시에 전달할 때 사용한다. 특이한 점은 subscribe() 함수를 호출해도 아무 동작이 일어나지 않는다는 점이다. 그럼 어떻게 발행해?? 바로 connect() 함수를 호출한 ..
[RxJava] 데이터 발행자와 수신자 지금까지 Observable을 살펴보면서 다양한 용어를 새롭게 배웠다. 처음 공부하기 때문에 좀 헷갈려서 간단한 기준으로 분류하려고한다. 크게 데이터를 발행하는 쪽과 데이터를 수신하는 쪽으로 나눌 수 있다. 데이터 발행자(data source) 데이터 수신자 Observable 구독자(Subscriber) Single 옵서버(Observer) Maybe 소비자(Consumer) Subject Completable 데이터 발행자는 클래스의 개념이기에 명확하게 구분된다. 하지만, 데이터 수신자는 몇 가지 용어를 번갈아 가면서 사용하므로 개념이 명확히 구분이 되지 않는다. 1. 구독자 - RxJava에서 Observable을 연결할 때는 subscribe() 함수를 호출한다. 이 과정이 구독이므로 구독자가 된..
[RxJava] Subject 클래스 - ReplaySubject 클래스 마지막으로 소개할 ReplaySubject 클래스는 가장 특이하고, 사용할 때 주의해야하는 클래스이다. Subject 클래스의 목적은 뜨거운 Observable을 활용하는 것인데, ReplaySubject 클래스는 차가운 Observable처럼 동작하기 때문이다. ReplaySubject 클래스는 구독자가 새로 생기면 항상 데이터의 처음부터 끝까지 발행하는 것을 보장한다. 마치 테이프로 전체 내용을 녹음해두었다가 새로운 사람이 들어오면 정해진 음악을 처음부터 들려주는 것 처럼 말이다. 그렇기에 모든 데이터 내용을 저장해두는 과정 중 메모리 누수가 발생할 가능성을 염두해두고 사용할 때 주의해야한다. 아래그림은 ReplaySubject 마블 다이어그램이다. 첫번째 구독자가 subscribe() 함수를 호출하..