물이 위에서 아래로 흐르는 것 처럼 순차적인 처리가 중요시되며 프로그램 전체가 유기적으로 연결 되도록 만드는 프로그래밍 기법이다. 대표적으로 포트란, 베이직, C언어 등이 있다. 컴퓨터의 작업 처리 방식과 유사해서 객체지향에 비해 빠르다.
- 하나의 큰 기능을 처리하기 위해 작은 단위의 기능들로 나누어 처리하는 Top-Down방식으로 설계된다.
- 비교적 작은 규모의 작업을 수행하는 함수(function)를 생성한다.
- 인수(parameter)와 반환값(value)으로 명령을 전달하고 수행한다.
- 객체지향 프로그래밍과의 가장 큰 차이점으로 데이터와 함수를 별개로 취급한다.
특정 기능을 수행하려면 그 일을 해주는 메소드를 직접 호출해야 한다. (vs 객체지향 프로그래밍에서는 특정 기능을 수행하는 메소드를 가진 객체를 만들어서, 그 인스턴스를 이용해 메소드를 호출한다.)
- 상대적으로 빠르다.
- 유지보수가 어렵다.
- 정해진 순서대로 입력을 해야되므로 순서가 바뀌면 결과값을 도출하기 어렵고 비 효율적이다.
- 프로그램을 분석하기 어렵다.
- 대형 프로젝트에는 부적합하다.
객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로,프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다. OOP를 사용하면 코드의 중복을 어느 정도 줄일 수 있고 입력 코드, 계산 코드와 결과 출력 코드 등 코드의 역할 분담을 좀 더 확실하게 할 수 있어서 가독성이 높아질 수 있다.
객체지향 언어는 Python, Java, C++, C#, Ruby 등이 있다.
1. 추상화(Abstract)
- 객체에서 공통된 속성과 행위를 추출하는 기법
- 코드 상에서 구현(로직)부분을 제외한 오직 선언 부분만을 설계
- 상세한 정보는 무시하고 필요한 정보들만 간추려서 구성
2. 캡슐화(Encapsulation)
- 관련된 필드(속성)와 메소드(기능)를 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 기법(정보은닉)
- 만일의 상황(외부에서 조작)을 대비해서 특정 소성이나 메소드를 사용자가 조작할 수 없도록 숨겨 놓은 것
- 외부에서는 공개된 메소드(기능)의 인터페이스를 통해 접근할 수 있다.
3. 상속(Inheritance)
- 이미 작성된 클래스의 특성을 그대로 이어받아 새로운 클래스(하위클래스)를 생성하는 기법
- 기존 코드를 그대로 재사용하거나 재정의 →재사용 + 확장
4. 다형성(Polymorphism)
- 다양한 형태로 나타날 수 있는 능력
- 같은 기능(메소드)를 호출하더라도 객체에 따라 다르게 동작하는 것
1. 코드 재사용성 : 남이 만든 클래스를 가져와서 이용 할 수 있고 상속을 통해 확장해서 사용 할 수 있다.
2. 유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
3. 대형 프로젝트에 적합 : 클래스 단위로 모듈화시켜서 개발할 수 있으므로 각자 맡은 부분을 개발 할 수 있고 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.
- 속도가 절차지향에 비해 느리다.
- 설계할때 시간과 노력이 많이든다.
- 객체가 많아지면 용량이 커질 수 있다.
요즘 AI, IoT, 빅데이터, 비트코인이 화제가 되면서, 방대한 데이터를 빠르게 계산해서 병렬적, 안정적으로 처리하는 것의 중요성이 부각되면서 다시 주목받기 시작한 했다. 함수형은 프로그래밍 패러다임 중 하나인데, 객체지향보다 더 간결하고, 더 예측 가능하다. 명령형 프로그래밍을 기반으로 개발했던 개발자들은 개발하는 소프트웨어의 크기가 커짐에 따라, 복잡하게 엉켜있는 스파게티 코드를 유지보수하는 것이 매우 힘들다는 것을 깨닫게 되었다. 그리고 이를 해결하기 위해 함수형 프로그래밍이라는 프로그래밍 패러다임에 관심을 갖게 되었다. 함수형 프로그래밍은 거의 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다. 함수형 프로그래밍을 이용해서 프로그램을 만든다는 것은 이런 함수들을 적용하고, 묶어서 프로그램을 구성해 나가는 것이다.
1958년 첫번째 함수형 프로그래밍 언어라고 할 수 있는 LISP가 등장했다. 함수형 프로그래밍 언어는 클로저, 스칼라, 하스켈 등이 있고, 자바스크립트, 코틀린, 파이썬 등도 최근버전에 함수형 프로그래밍 문법이 추가 되었다.**
참고: https://mangkyu.tistory.com/111 [MangKyu's Diary]
1. 순수함수(Pure Functions)
- 동일한 input에는 동일한 output이 나와야 하는것을 의미한다.
- 외부의 상태를 변경하거나 외부의 값을 참조하지 않는다.
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side effct가 없어야 함.
- 함수 자체가 독립적이며 Sife-Effect가 없기때문에 Thread에 안전성을 보장 받을 수있고 병렬 처리를 동기화 없이 진행할 수 있음.
Side Effect란?
다음과 같은 변화 또는 변화가 발생하는 작업을 의미함.
- 변수의 값이 변경됨
- 자료구조를 제자리에서 수정함
- 객체의 필드값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일I/O 발생
let num = 1;
function add(a) {
return a + num;
}
첫 번째 코드에서는 전역변수 num을 참조해서 순수함수라고 볼수 없고,
// 순수함수
function add(a, b) {
return a + b;
}
const result = add(2, 3);
두 번쨰 코드에서는 외부의 참조되는 값이 없어서 프로그램 실행에 영향을
미치지 않아 순수함수이다.
2. 비상태,불변성(Stateless, Immutabiliy)
- 데이터는 변하지 않아야 한다.
- 데이터를 변경하려면 복사본을 만들어서 일부를 변경하고 복사본을 사용해야한다. 원본을 건들면 안된다.
let person = { name: "jongmin", age: "26" };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
//전역으로 선언된 person의 age속성을 변경하므로 불변성 유지를 만족하지 못한다.
const person = { name: "jongmin", age: "26" };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}?
// 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어,
// 그 복사본을 사용해 작업을 진행하고 반환.
3. 선언형 함수(Expressions Only)
선언형 프로그래밍은 무엇을 할 것인가에 주목한다. if와 for와 같은 여러가지 문장(expression)을 사용하는 것은 함수형 프로그래밍이라고 할 수 없다.
4. 1급 객체와 고차함수(First-class, Higher-order functions)
함수형 프로그래밍에서는 함수가 1급 객체가 된다. 1급 객체의 특징은 다음과 같다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
- 함수가 런타임 에도 생성
- 함수의 인자로 전달되고 함수의 반환값(return value)으로 사용할 수 있고, 변수에 할당(파라미터로 전달 가능)
- 함수도 데이터처럼 구성이 가능해짐
자바에서는 메서드가 1급으로 처리되지 않기에, 메서드만 따로 생성하거나, 메서드 자체를 생성자나 변수나 파라미터등에 전달 할 수 없다.
반면 자바스크립트에서는 아래와 같은 코드가 가능하다.
function someFunc(){ ... }
otherFunc(someFunc) //함수 자체를 파라미터로 전달이 가능하다.
var a = someFunc; // 함수를 변수로 할당 해줄 수 있다.
- 사이드이펙트를 미연에 방지한다.
- 객체지향보다 코드가 간결하다.
- 비절차형이라 평가 시점(연산 시점)이 중요하지 않다.
- 테스트가 쉽다. (1회만으로 신뢰성 보장)
- 가독성과 유지 관리 편의성이 향상
- 함수를 사용하기 때문에 반복되는 개발이 쉬워짐
- 버그가 생길 여지가 적다
- 외부 데이터 혹은 내부 데이터의 상태를 조작할 수 없다.
jongminnfire.dev - 함수형프로그래밍이란 ?
까망눈연구소 - 함수형프로그래밍이란?
망나니 개발자 - 함수형 프로그래밍이란?
KENDRICK`S BLOG - 함수형 프로그래밍이란?
태나미 - 함수형 프로그래밍