함수형 프로그래밍

jjin·2024년 3월 21일
0

개요

OOP의 대안, 외부 상태를 갖지 않는 순수 함수들의 연속으로 프로그래밍.
대표 언어: Scala
다른 언어도 API 사용해서 함수형 프로그래밍 가능

  • 함수형 프로그래밍

    • 외부 상태를 갖지 않는다
      = 같은 입력에 대해 항상 같은 출력을 내보낸다
      = 함수의 입출력에 영향을 주는 외부 요인이 없다
      = 사이드 이펙트가 없다
    • 불변성: 한 번 초기화한 변수는 변하지 않는다 - 안정적
  • OOP 약점

    • 함수의 비일관성: 객체의 멤버 변수가 변경될 경우 함수(메소드)가 다른 결과를 반환할 수 있음
    • 객체 간 의존성: 객체 간 상호작용을 위해 다른 객체 함수들을 호출, 복잡도 증가
    • 객체 내 상태 제어의 어려움: 외부에서 객체 상태 변경하는 메소드 호출 시, 추적 어려움

기본 개념

c = 1

def func(a: int, b: int) -> int: # 순수 함수 아님
	return a + b + c # 외부 상태 포함
    
def func(a: int, b: int, c: int) -> int # 순수 함수
	return a + b + c

예시

  • 문제 해결 순서
  1. 문제를 작게 쪼갠다
  2. 작은 문제 중 하나를 해결하는 순수 함수를 만든다
  3. 순수 함수들을 조합해 문제를 해결해나간다.
  • 조합법: Pipelining, Partial Application, Currying
# Pipelining
def main():
	pipe_func = pipe(read_input_file, parse_input_data, save_data)
    return pipe_func("input_file.txt")
    
# Partial Application
def power(base, exp):
	return base ** exp
    
def main():
	square = partial(power, exp=2)
    cube = partial(power, exp=3)
    square(2)
    cube(2)

장점

  • 안정적이므로 동시성 프로그래밍에 적합
  • 대용량 데이터 병렬 처리 시 안정성이 중요한데, 최근 데이터 처리 기술 발전으로 부상 중

단점

  • 상태를 허용하지 않으므로 같은 기능을 위해 여러 함수의 조합 필요
  • 비친숙성으로 인한 러닝 커브

프로그래밍 패러다임 정리

  • 절차 지향
    • 탑다운: 이해 쉬움
    • 수정 시 변경 많아 어려움
  • 객체 지향
    • 객체들의 책임과 협력.
    • 다형성, 의존성 주입: 확장성, 다양한 입력에 대응
    • 런타임 전에 예측 어려움, 디버깅 어려움
  • 함수형:
    • 사이드 이펙트가 없음
    • 코드 작성 어려움
profile
진짜

0개의 댓글

관련 채용 정보