절차를 지향하고, 객체를 지향하고 함수형으로 프로그래밍을 한다 라는 건 무슨 의미일까?
먼저 프로그래밍 패러다임이 있는 이유, 그래서 프로그래밍 패러다임이 왜 있어야 하는지부터 궁금증이 생겼다.
프로그래밍 패러다임은 프로그램밍의 스타일을 말한다. 쉽게 말해서 프로그래밍 패러다임은 개발자가 프로그램을 만들 때, 어떠한 전략으로 전체적인 프로그램을 만들 것이냐를 보는 것이다. 그리고 대표적으로 절차지향/객체지향/함수형 프로그래밍 패러다임이 존재한다.
어떻게 할 것인지를 컴퓨터에게 명령 내리는 방법의 프로그래밍이다. 무엇을 만들어낼지 보다 그 무엇을 어떻게 만들 것인지에 더 초점을 둔 방법이다.
절차지향
말 그대로, 절차를 중시한다고 보면 된다. 진행되는 순서와 흐름을 중심으로 프로그래밍 하는 방법이다.
✔️ 장점
✔️ 단점
객체지향
절차지향 프로그래밍을 보완하기 위해 나온 개념이다. 모든 데이터를 객체로 본다. 객체 내부에 있는 기능을 사용하여 처리한다.
비슷한 것들을 연관지어 함수와 변수들을 객체로 그룹화하고 이 객체에 들어있는 함수를 호출하여 다른 함수와 구분해준다.
쉽게 얘기해서, 함수나 변수들을 객체로 처리해서 모아두고 필요할 때 객체에서 꺼내어 쓴다고 보면 된다!
특징
추상화 : 공통적인 속성이나 기능을 묶어서 이름을 붙인다.
=> 스스로 이해해보기론, 함수나 변수들이 아직 객체로 합쳐져 있지 않은 상태(추상화 되어 있는 상태)에서 하나의 객체로 이름을 붙여 모아 둔다는 의미
캡슐화 : 데이터를 은닉하고 기능을 노출하지 않는다.
=> 객체 내부에 저장하다보니까 객체 내에 은닉하고 그 기능이 바깥에 드러나지 않는다는 것.
상속성 : 상위 객체 속성의 특징을 하위 객체가 상속할 수 있다.
=> 어떤 객체가 존재하는데, 비슷한 특성을 새로운 객체가 갖는다면 기존 객체를 상속시킬 수 있어 재사용을 높일 수 있다
다형성 : 함수가 같더라도 매개변수에 따라 다른 일을 할 수 있다.
✔️ 장점
✔️ 단점
명령형이 과정을 중시했다면, 선언형은 무엇을 할 것인가에 초점을 둔다. 컴퓨터에게 무엇을 하라고 선언하는 것이다.
객체를 중심으로 사고하고 프로그래밍했던 것이 객체지향이었다면, 함수형 프로그래밍은 데이터를 함수로 연결하는 것을 중심으로 사고하는 것이다.
이때, 함수형 프로그래밍은 일반적인 함수의 조합이 아닌 순수함수의 조합으로 이루어져 있다.
함수형 프로그래밍의 특징은 다음과 같다.
순수함수
동일한 입력에는 항상 같은 값을 반환하는 함수를 순수함수라고 한다.
이게 무슨 말인가..?
풀어서 설명하자면(나도 처음엔 너무 어려워서 여기저기 찾아보고 쉬운 말로 이해하려고 했다.), 함수의 return값은 함수에 입력된 인자 값에만 의존한다는 의미이고, 외부의 어떠한 변수로 인해 부수효과가 발생하지 않는 것을 말한다. 즉, 인자를 통해 나온 그 return 값이 외부 요소에 의해 변화가 없고, 어디서 사용하더라도 언제나 같은 결과값(인자에 의한 결과값)이 나온다는 의미이다.
비상태, 불변성
const me = { name: "kim", age: "80" };
function X (me) {
me.age = me.age + 20;
return me;
}
위는 원본 데이터인 me를 변경했기 때문에 비상태, 불변성을 만족하지 못한다.
이에 따라, 아래와 같이 복사한 값을 사용해야 한다.
const me = { name: "kim", age: "80" };
function X (me) {
return {...me, age:me.age + 20};
}
선언형 함수
선언형 프로그래밍은 과정보단 무엇을 할 것인가를 중시한다. 이에 따라 if/switch/for와 같은 명령문을 사용하지 않고 함수형 코드로 사용한다.
대표적으로, filter/map/take/reduce가 있다.
1급 객체
함수형 프로그래밍에서는 함수가 1급 객체가 된다. 1급 객체의 특징은 다음과 같다.
고차 함수
또한, 함수는 고차 함수의 속성을 갖는다.
✔️ 장점
✔️ 단점