절차지향, 객체지향, 함수형 프로그래밍

김철회·2022년 8월 6일
1

프로그래밍 패러다임?

절차를 지향하고, 객체를 지향하고 함수형으로 프로그래밍을 한다 라는 건 무슨 의미일까?
먼저 프로그래밍 패러다임이 있는 이유, 그래서 프로그래밍 패러다임이 왜 있어야 하는지부터 궁금증이 생겼다.

프로그래밍 패러다임은 프로그램밍의 스타일을 말한다. 쉽게 말해서 프로그래밍 패러다임은 개발자가 프로그램을 만들 때, 어떠한 전략으로 전체적인 프로그램을 만들 것이냐를 보는 것이다. 그리고 대표적으로 절차지향/객체지향/함수형 프로그래밍 패러다임이 존재한다.

명령형

어떻게 할 것인지를 컴퓨터에게 명령 내리는 방법의 프로그래밍이다. 무엇을 만들어낼지 보다 그 무엇을 어떻게 만들 것인지에 더 초점을 둔 방법이다.

절차지향

말 그대로, 절차를 중시한다고 보면 된다. 진행되는 순서와 흐름을 중심으로 프로그래밍 하는 방법이다.

✔️ 장점

  • 코드를 순서대로 짰기 때문에 가독성이 좋다.
  • 컴퓨터와 처리 구조가 비슷하여 실행 속도가 빠르다.

✔️ 단점

  • 코드를 순서대로 짰기 때문에, 유연성이 떨어진다. 즉, 유지 보수가 어렵고 하나를 바꾸기 위해서 다른 것도 같이 바꾸어야 한다.

객체지향

절차지향 프로그래밍을 보완하기 위해 나온 개념이다. 모든 데이터를 객체로 본다. 객체 내부에 있는 기능을 사용하여 처리한다.

비슷한 것들을 연관지어 함수와 변수들을 객체로 그룹화하고 이 객체에 들어있는 함수를 호출하여 다른 함수와 구분해준다.
쉽게 얘기해서, 함수나 변수들을 객체로 처리해서 모아두고 필요할 때 객체에서 꺼내어 쓴다고 보면 된다!

특징

  • 추상화 : 공통적인 속성이나 기능을 묶어서 이름을 붙인다.
    => 스스로 이해해보기론, 함수나 변수들이 아직 객체로 합쳐져 있지 않은 상태(추상화 되어 있는 상태)에서 하나의 객체로 이름을 붙여 모아 둔다는 의미

  • 캡슐화 : 데이터를 은닉하고 기능을 노출하지 않는다.
    => 객체 내부에 저장하다보니까 객체 내에 은닉하고 그 기능이 바깥에 드러나지 않는다는 것.

  • 상속성 : 상위 객체 속성의 특징을 하위 객체가 상속할 수 있다.
    => 어떤 객체가 존재하는데, 비슷한 특성을 새로운 객체가 갖는다면 기존 객체를 상속시킬 수 있어 재사용을 높일 수 있다

  • 다형성 : 함수가 같더라도 매개변수에 따라 다른 일을 할 수 있다.

✔️ 장점

  • 코드의 재사용이 좋다
  • 분석과 설계의 전환이 쉽다.

✔️ 단점

  • 처리 속도가 느리다.
  • 설계에 많은 시간이 필요하다.

선언형 프로그래밍

명령형이 과정을 중시했다면, 선언형은 무엇을 할 것인가에 초점을 둔다. 컴퓨터에게 무엇을 하라고 선언하는 것이다.

함수형 프로그래밍

객체를 중심으로 사고하고 프로그래밍했던 것이 객체지향이었다면, 함수형 프로그래밍은 데이터를 함수로 연결하는 것을 중심으로 사고하는 것이다.
이때, 함수형 프로그래밍은 일반적인 함수의 조합이 아닌 순수함수의 조합으로 이루어져 있다.

함수형 프로그래밍의 특징은 다음과 같다.

순수함수
동일한 입력에는 항상 같은 값을 반환하는 함수를 순수함수라고 한다.

이게 무슨 말인가..?
풀어서 설명하자면(나도 처음엔 너무 어려워서 여기저기 찾아보고 쉬운 말로 이해하려고 했다.), 함수의 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급 객체의 특징은 다음과 같다.

  • 변수나 데이터에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

고차 함수
또한, 함수는 고차 함수의 속성을 갖는다.

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

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

✔️ 장점

  • 높은 수준의 추상화를 제공한다.
  • 함수 단위로 코드가 짜여져 있기 때문에 재사용이 쉽다.
  • 변하지 않기 때문에 동작을 예측할 수 있다.

✔️ 단점

  • 순수함수만의 조합으로 이루어져 있기 때문에 가독성이 좋지 못하다.
  • 순수함수의 조합이 어려울 수 있다.
profile
안녕하세요!

0개의 댓글