[CS] 함수형 프로그래밍

제갈창민·2022년 2월 11일
0

learningbook

목록 보기
28/32
post-custom-banner

프로그래밍 패러다임

  • 프로그래밍을 작성할 때의 관점 및 방법론

  • 프로그래밍 언어별로 지원하는 프로그래밍 패러다임이 다르다.

  • 하지만 최근 대부분의 프로그래밍 언어는 여러개의 패러다임을 갖는데, 이를 "멀티 패러다임 언어"라고 부른다.

  • 파이썬은 세 가지 패러다임(함수형, 명령형, 객체지향 (클래스기반))을 지원하는 언어이다.

다중 패러다임 프로그래밍 언어 - 위키백과
멀티패러다임 언어를 사용해야하는 이유

※ (참고)대표적인 프로그래밍 패러다임과 언어

OOP(Object-Oriented Programming) - 객체지향(파이썬, 자바...)
IP(Imperative Programming) - 명령형(C, C++...)
DP(Declarative Programming) - 선언형(SQL...)
FP(Functional Programming) - 함수형(하스칼, 스칼라...)
RP(Reactive Programming) - 반응형(RxJava...)
※ RP 는 선언형 방식을 지향하고 함수형 언어의 도구들을 활용한다.
등등등


함수형 프로그래밍이란?

함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미한다. 함수형 프로그래밍이란?
함수형 프로그래밍은 프로그래밍 언어나 방식을 배우는것이 아니라 함수로 프로그래밍하는 사고를 배우는것이라고 할 수 있다. 즉, 새로운 계산방법을 배우는 것처럼 사고의 전환을 필요로 한다. 다양한 사고방식으로 프로그래밍을 바라보면 더욱 유연한 문제해결이 가능해진다.


함수형 프로그래밍의 특징


1. 순수함수 (Pure function)
  • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
  • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
  • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것

2. 비상태, 불변성 (Stateless, Immutability)
  • 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
  • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.

3. 선언형 함수(Expressions)(feat. 선언형 프로그래밍)
  • 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언형 프로그래밍은 무엇을 할 것인가에 주목한다.

※ 명령형과 선언형의 프로그래밍 비교

  • 명령형: 알고리즘을 명시하고 목표는 명시 안함.
  • 선언형: 알고리즘 명시하지 않고 목표만 명시.

Q. 여기가 선릉역인데 위코드까지 어떻게 가야할까요?

(명령형)A. 10번 출구로 나와서 직진하세요. 세 번째 코너에서 스타벅스를 끼고 좌회전 하세요. 첫 번째 골목길에서 우회전 하세요. 다음 신호등을 지나 직진하세요.

(선언형)A. 위코드 주소는 강남구 테헤란로 427 입니다.
※ 어떻게(HOW)에 대한 것은 추상화 하고 무엇을(WHAT)에 집중하는 방식
선언형 프로그래밍이란?


4. 1급 객체 및 고차함수(각 개념은 추가 설명 참조)
  • 함수형 프로그래밍에서는 함수가 1급 객체가 된다.
  • 고차 함수는 함수를 인자로 전달 받거나, 함수를 반환 하는 함수를 의미한다.
  • 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 한다.

함수형 프로그래밍의 장단점

  • 장점

    • 높은 수준의 추상화를 제공한다.
    • 함수 단위의 코드 재사용이 수월하다.
    • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다.
  • 단점

    • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다.
    • 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다.
    • 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다.

Ref.

파이썬으로 함수형프로그래밍 하기
파이썬에서 함수형으로 프로그래밍하기(영상) - 하원호


고차 함수

  • 고차 함수는 람다 계산법에서 만들어진 용어로 불변성(Immutability)을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
  • 대표 언어는 Javascript, React

    고차 함수는 1급 함수의 부분 집합(Subset)이다.
    리액트의 고차 컴포넌트(HOC)는 컴포넌트를 사용하여 위의 조건을 만족하는 컴포넌트를 말한다.

  1. 함수를 인자로써 전달 할 수 있어야 한다.
  2. 함수의 반환 값으로 또 다른 함수를 사용 할 수 있다.

1급 객체(1급 함수)란?

  • 1급 객체는 아래의 조건을 충족하는 객체를 말한다.
  1. 변수나 데이터에 할당 할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 반환값으로 반환할 수 있어야 한다.
  4. 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  5. 동적으로 프로퍼티 할당이 가능하다.
# 변수나 데이터에 할당 할 수 있어야 한다.
def print_hello():
    print("hello!")

a = print_hello  # print_hello 함수를 a라는 변수에 저장
a()
# hello!
# 객체의 인자로 넘길 수 있어야 한다.
def introduce(name):
    return "hello, my name is" + name

def goodbye(name):
    return "bye bye, " + name


def who_i_am(func, name):
    return func(name)

who_i_am(introduce, "hanbin")
# hello, my name is hanbin
who_i_am(goodbye, "hanbin")
# bye bye, hanbin
# 객체의 반환값으로 반환할 수 있어야 한다.
def test_hasher(data):
    return "hashed" + data

def get_hasher():
    return test_hasher  # test_hasher함수를 반환한다.

hasher = get_hasher()
hashed_data = hasher("hanbin")
print(hashed_data)
# hashed hanbin

함수의 추상화 & 추상화 수준

클린코드 - 추상화와 추상화 수준

  • 하나의 기능을 하나의 함수로 만드는 작업을 '추상화'라 부른다.
  • 로버트 마틴은 하나의 함수는 한 가지 추상화를 담으므로 한 번의 들여쓰기로 표현하기를 추천한다.
@Override
public void mainButtonAction() throws IOException  {
	if(!isEmptyUserName()) doJoinProcess(duplicateCheck());
	else setUserNameCheck("닉네임이 공백입니다.");	
}

위 코드는 함수로만 코드가 구성되어있다. 추상화 수준이 높다고 할 수 있다.

// 관심사 : Peer의 주소생성
private String getLocalhost() {
	return "localhost:"+ (5500 + (int)(Math.random()*100));
}

위 코드는 '+' 같은 연산기호나 (int) 형변환이나 Math.random() 같은 API 사용을 담고 있다. 구체적인 세부 구현사항을 담은 것이다. 이런 함수는 추상화 수준이 낮다고 말할 수있다.

mainButtonAction() 함수는 추상화 수준이 높다. 반면 getLocalhost() 함수는 추상화 수준이 낮다.

이렇듯, 하나의 함수는 하나의 추상화 수준을 가져야 한다.

하나의 함수 안에 높은 추상화 수준과 낮은 추상화 수준이 공존해서는 안 된다. 추상화 수준이 다른 코드가 같은 함수 안에 사용되면 혼란스러워진다.

또한, 추상화 수준이 높은 함수는 위에, 추상화 수준이 낮은 함수는 아래에 작성해야 한다. 이를 내려가기 규칙이라 부른다.

profile
자기계발 중인 신입 개발자
post-custom-banner

0개의 댓글