오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-07 05:42
관리 메뉴

우노

[Software Engineering] 절차적 vs 객체지향 vs 함수형 본문

Etc/CS Term

[Software Engineering] 절차적 vs 객체지향 vs 함수형

운호(Noah) 2021. 3. 31. 13:44

들어가기 앞서,

  • 해당 포스트에서는 현존하는 코딩 패러다임에 대해 간단하게 다뤄보겠습니다.

절차적 프로그래밍(Procedural Programming)

  • 절차적 프로그래밍이란, 프로그램을 재사용 가능한 함수 단위로 나누는 프로그래밍 구조를 의미합니다.
    • 여기서 말하는 '절차'는, 순수한의미의 '절차'가 아닌, Procedual, 즉 함수를 의미합니다.
  • 절차적 프로그래밍의 장단점은 아래와 같습니다.
    • 장점
      • 코드를 단위화할 수 있습니다.
    • 단점
      • 변수나 상수 등의 값들을 관리하는 '자료형'과
      • 해당 자료형을 사용하는 '함수'가 분리되어 사용됩니다.
  • 따라서, 사람들은 위 단점을 해결하기 위해, 자료형과 함수를 묶어서 사용하는 방법을 모색하게 되었습니다.

객체 지향 프로그래밍(Object-Oriented Programming)

  • 객체 지향 프로그래밍은, 모든 데이터를 객체(Object)로 취급하며,
  • 모든 객체가 내부의 자료형(Field)와 함수(Method)로 구성된 프로그래밍 구조를 의미합니다.
    • 만약, 책이라는 자료를 객체 모델로 만든다면
    • 그 책의 쪽수나,이름과 같은 '자료형' 뿐만 아니라
    • 책을 읽기, 책을 만들기 등의 '함수'들 역시 '책'이라는 객체로 묶어 놓는 것입니다.
  • 객체 지향 프로그래밍의 장단점은 아래와 같습니다.
    • 장점
      • 객체와 객체간의 독립성이 확립되므로, 유지보수에 도움이 됩니다.
    • 단점
      • 설계에 많은 시간이 소요됩니다.
      • 처리 속도가 상대적으로 느립니다.

함수형 프로그래밍(Functional Programming)

  • 절차적, 객체지향 기반으로 개발했던 개발자들은, 개발하는 소프트웨어의 크기가 커짐에 따라,

  • 복잡하게 엉켜있는 스파게티 코드를 유지보수하는 것이 매우 힘들다는 것을 깨닫게 되었습니다.

  • 따라서, 함수형 프로그래밍은, 주어진 문제를 작은 문제로 나눈 뒤, 작은 문제를 해결할 수 있는 '순수 함수'를 사용하는 방식이며,

  • 가독성을 높이고 유지보수를 용이하게하는 프로그래밍 구조를 의미합니다.

    • 순수 함수란, 함수의 입력이 주어지면, 항상 일관된 출력이 나오는 함수이며,

    • 프로그램의 실행에 영향을 미치지 않는 함수를 의미합니다. (Side Effect 가 없다.)

    • 예제 코드

        // 순수 함수
        function func(a, b) {
                  return a + b; // 인자로 들어온 값만 참조해, 리턴값을 생성
        }
      
        // 비순수 함수
        int c = ??;
      
        function func(a, b) {
                  return a + b + c; // 외부 요인(c)에 따라 리턴값이 변경됨
        }
  • 함수형 프로그래밍의 장단점은 아래와 같습니다.

    • 장점
      • 코드에서 프로그램의 실행에 영향을 미치는 영역과 순수한 영역을 최대한 분리함으로써,
      • 코드 가독성이 높아지고, 유지보수가 좋아지며, 더 안전한 프로그램을 만들 수 있습니다.
    • 단점
      • 상태를 조작할 수 없습니다.

객체지향 프로그래밍과 함수형 프로그래밍의 차이

  • 객체지향 프로그래밍에서는 '클래스' 가 '일급 객체' 가 되지만,
  • 함수형 프로그래밍에서는 '함수' 가 '일급 객체' 가 됩니다.
    • 일급 객체란?
      • 함수의 인자로 넘겨질 수도 있고, 변수에 대입도 가능한 객체를 '일급 객체'라고 합니다.
      • 명확한 정의는 아래와 같습니다.
        1. 모든 일급 객체는, 함수의 매개변수 또는 인자가 될 수 있다.
        2. 모든 일급 객체는, 함수의 반환값이 될 수 있다.
        3. 모든 일급 객체는, 변수나 데이터에 할당할 수 있다.
        4. 모든 일급 객체는, 비교 연산(==, equal)을 적용할 수 있다.
  • 객체지향 프로그래밍에서는, 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있습니다.
    • 클래스 디자인과 객체들간의 관계를 중심으로 코드 작성이 이루어집니다.
    • 상태, 멤버변수, 메서드 등이 긴밀한 관계를 가지고 있으며
    • 멤버변수가 어떤 상태를 가지고 있는가에 따라 결과가 달라집니다.
  • 함수형 프로그래밍에서는, 프로그램을 상태 값을 지니지 않는 함수들의 연속으로 볼 수 있습니다.
    • 값의 연산 및 결과 도출 중심으로 코드작성이 이루어집니다.
    • 함수는 인자로 받은 값을 별도로 저장하지 않고,
    • 간결한 과정으로 처리하고 매핑하는데에 주 목적을 둡니다.

참고

Comments