본문 바로가기

CS

함수형 프로그래밍

함수형 프로그래밍이란?

자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

객체 지향 프로그래밍에서 객체가 1급 시민으로 분류된다면, 함수형 프로그래밍은 함수가 1급 시민으로 분류된다.

1급 시민

  • 변수에 담을 수 있다.
  • 함수의 인자로 전달할 수 있다.
  • 함수의 반환값으로 전달할 수 있다.

1급 함수

  • 1급 시민의 조건을 만족하면서 아래의 조건을 추가로 만족해야 한다.
  • 런타임에 생성이 가능하다.
  • 익명으로 생성이 가능하다

.참고로 코틀린은 1급 함수이다.


참조 투명성

참조 투명성은 순수 함수의 개념과 비슷하다.

순수 함수란 주어진 값에 대한 결과 값이 제공되는 함수다.

 

참조 투명성이란 동일한 입력 값에 대해 항상 동일한 출력 값을 보장하는 특성을 참조 투명성이라고 한다.

함수가 외부 상태에 의존하지 않고 전달 받은 인자에만 의존해야 함을 의미하며, 참조 투명성이 보장되면 코드의 예측 가능성과 안정성이 높아진다.

이는 코드의 유지보수성과 테스트 용이성을 크게 향상시킨다.

함수형 프로그래밍에서는 전역변수 사용을 지양하는 것이 좋다.

불변 영속 데이터 구조

함수형 프로그래밍은 순수 함수로 구현되어 참조 투명성 원칙을 지켜야 한다.

그러나 데이터가 가변이고, 알게 모르게 데이터를 변경하는 로직이 어딘가에 존재한다면 해당 함수는 부수 효과를 일으키게 된다.

때문에 함수형 프로그래밍은 불변으로 데이터를 관리하기로 약속했다.

 

불변 데이터

한 번 데이터를 생성하면 프로그램 생성 주기가 끝날 때까지 바뀌지 않는다는 약속

  • 장점: 여러 스레드가 안전하게 읽고 사용할 수 있다.
  • 단점: 데이터가 조금 바뀐다면 이를 Copy하여 만들어야 한다.
    • 데이터 중복 발생
    • 메모리 또는 시간 복잡도의 효율성이 낮아진다.

이러한 단점을 보완하기 위해 영속 데이터 구조가 있다

 

영속 데이터

불변 속성을 가진 자료구조에서 데이터를 추가하면 다음과 같이 작업이 이루어진다.

val A = LinkedList(1,2,3,4,5)
val B = A.append(6) // A를 Copy하여 6을 추가 후 새로운 객체 반환

만약 새로운 객체를 반환하지 않고 6을 붙인다면 A의 리스트에 6이 추가되기 때문에 불변성에 위반된다.

 

불변 영속 데이터

그러나 새로운 데이터를 앞에 붙이면 달라진다.

출처 인프콘

리스트 B가 만들어졌지만 리스트 A의 값이 변하지 않았기 때문에 리스트 A의 불변성 또한 깨지지 않은 것을 볼 수 있다.

 

중간 삽입 또한 다음과 같이 이루어진다.

출처 인프콘

이렇게 사용하면 불변성을 유지한 채 데이터를 추가&수정할 수 있는 영속성도 생기며, 이를 불변 영속 자료구조라고 한다.

 

 

'CS' 카테고리의 다른 글

운영체제의 메모리 관리  (0) 2024.08.13
[Java] 객체 지향  (0) 2024.01.24