본문 바로가기
CS 기본 지식

프로그래밍 패러다임: 함수형/절차지향/객체지향 프로그래밍

by 0sae 2021. 6. 22.

함수형? 절차지향? 객체지향? 프로그래밍이라는 이야기를 많이 들어보았고 얼핏 알지만 막상 설명하려니 정확히 어떤 장단점이 있는지 어떤 것을 쓰는게 더 좋은지 설명하기 어려워 정리해보고자 이 글을 쓰게 되었습니다.

프로그래밍 패러다임

절차지향/객체지향/함수형 프로그래밍과 같은 것들을 프로그래밍 패러다임이라고 합니다. 프로그램을 만들 때에 원하는 목표에 따라서 적절한 방법과 기법을 활용해서 프로그램을 만들어 나갑니다. 어느 하나가 다른 것을 대체하는 것이 아니라 적절한 것을 잘 선택해 사용하는 것이 중요합니다.

절차지향/객체지향/함수형 프로그래밍 비교

  절차지향 프로그래밍 객체지향 프로그래밍 함수형 프로그래밍
특징
입력한 로직에 따라 순서대로 코드가 실행되는 방식. 컴퓨터의 처리구조와 비슷해 실행속도가 빠르다.

- 명령형 프로그래밍
- 데이터 중심 구현("무엇을 하였는가")
프로그램을 여러개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 접근법.

- *객체지향의 4대 특성: 캡슐화, 추상화, 다향성, 상속 (아래링크 참고)
- 객체 중심 구현 ("누가 무엇을 하였는가" 가 중요)
순수 함수(pure function) 를 조합한 공유 상태(shared state), 변경 가능한 데이터(mutable data)  부작용(side-effects) 을 피하여 소프트웨어를 만드는 프로세스

- 선언형 프로그래밍
- 순수함수: input으로 들어온 값에 함수가 영향을 주지 않으며 외부 변수에 영향을 받지 않고 항상 같은 output 생성
- 비상태, 불변성 유지(Statelsess, Immutability)
- 모든 함수는 객체
- expression only: if, switch, for 과 같은 문장(statements)을 사용하는 것은 함수형 프로그래밍이 아니다.
장점 - 가독성이 좋다
- 실행속도가 빠르다
- 코드의 재사용성
- 유지보수가 편하다
- 코드의 순서가 다르더라도 논리적인 과정상의 차이만 없으면 어느정도 동일한 동작 결과를 보자아할 수 있다
- 코드가 훨씬 간결하고, 객체 지향에 비해 코드 이해도와 가독성이 좋다
- 처리속도가 빠르다
- No Side-effect: 불변성을 유지하므로 멀티쓰레딩 환경에서도 안정적으로 동작한다.
단점 - 코드 순서가 민감하게 연결되어 유지 보수 분석이 어렵다
- 코드의 순서가 바뀌면 동일한 동작 결과를 보장하지 못한다
- 설계하는데 오래 걸린다
- 처리 속도가 다소 느리다
- 상태를 조작할 수 없다
언어 Javascript, C언어, 포트란, 베이직 Java, ruby, python Haskell, F#, OCaml, Erlang
(JavaScript, Kotlin, Go, Python, Rust, Java, C++, Scala)

*객체 지향의 4대 특성은 아래 글을 참고해 주세요.

https://blog.naver.com/whdgml1996/221889374877

 

[디자인 패턴 01]객체지향의 4가지 특성과 SOLID 원칙

객체 지향의 4가지 특성 1. 추상화 추상화는 "어떤 실체의 특징이나 관심있는 특성을 즉 추상적인 특...

blog.naver.com

하나의 패러다임을 사용해 개발해온 개발자보다 여러가지 패러다임을 이해하고 넓은 견해를 가진 개발자가 적절한 패러다임을 찾을 수 있으므로 잘 알아두는게 좋겠습니다.

 


아래는 최근들어 함수형 프로그래밍 언어가 주목받는 이유들을 정리해둔 글입니다.

(드림엘리 유튜브 '함수형프로그램이 대세다?!' 내용을 정리한 글입니다.)

함수형 프로그래밍

프로그래밍 패러다임의 역사

최초의 함수형 프로그래밍 언어는 C언어나 객체지향 언어들보다 일찍이 생겨났습니다.

이렇게 빨리 생겨났음에도 불구하고 이제서야 주목을 받게된 이유는 함수형 프로그래밍은 수학과 밀접한 연관이 있기 때문에 배우는데 시간이 조금 걸리고 어려울 수 있기 때문에, 사람들의 사고방식과 가장 가까운 절차지향/객체지향 프로그래밍이 더 보편적으로 많이 쓰여지고 있습니다. 하지만 요즘 AI, IoT, 빅데이터, 비트코인이 뜨기 시작하면서 방대한 데이터를 빠르게 계산하여 병렬적이고 안정적으로 처리하는 중요성이 부각되면서 함수형 프로그래밍 언어가 다시 주목을 받기 시작한 것입니다.

 

함수형 프로그래밍의 특징:

1. 순수함수

- 함수 외부에서 항태값을 참조하거나, 외부함수를 변경하는 것은 순수함수가 아니다.

- 동일한 인자를 넣었을 때, 동일한 결과를 반환한다.

2. Statelsess, Immutability(비상태, 불변성 유지)

- 함수에 전달된 인자를 변경하는 것은 함수형이 아니다.

- 전달된 데이터를 변경하는 것이 아니라, 새로운 버전의 새로운 오브젝트를 만들어 결과값으로 전달한다.

- No Side-effect : 함수를 호출하면 위부 상태가 변경되거나, 예상하지 못한 에러가 발생하는 등의 부작용이 발생하지 않으므로 멀티쓰레딩 환경에서도 안정적으로 동작한다.

3. Expression Only

- if, switch, for 과 같은 문장(statements)을 사용하는 것은 함수형 프로그래밍이 아니다.

4. First-Class and Higher-Order Functions(일차함수, 고차함수)

- 일급함수: 함수를 변수에 할당하거나, 함수의 인자로 전달하거나 리턴하는 등

- 고차함수: 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴

 

참고 : 드림엘리 유튜브 https://www.youtube.com/watch?v=4ezXhCuT2mw