객제지향 vs 반응형 vs 함수형 프로그래밍

이하연·2021년 9월 16일
1

[oop] 객체지향

목록 보기
7/7

프로그래밍 패러다임

  • 프로그래밍을 작성할 때의 관점 및 방법론

  • 프로그래밍 언어별로 지원하는 프로그래밍 패러다임이 다르다.

  • 하지만 최근 대부분의 프로그래밍 언어는 여러개의 패러다임을 갖는다. 이를 "멀티 패러다임 언어"이라고 부른다.

  • 종류

  • OOP(Object-Oriented Programming) - 객체지향

  • FP(Functional Programming) - 함수형

  • RP(Reactive Programming) - 반응형

  • 비교

    객체지향 프로그래밍은 프로그램을 상호작용하는 객체들로 본다
    함수형 프로그래밍은 프로그래밍을 자체 값을 가지지 않는 순수함수들의 연속으로 본다


프로그래밍 패러다임의 종류

굉장히 많은 패러다임 종류가 있는데 그 중에서 대표적이고 범용적인 패러다임만 소개하려한다.

명령형 프로그래밍

  • 시간 순서대로 명령해서 문제를 해결하는 방식
  • 선언형 프로그래밍과 반대 개념
  • 알고리즘을 명시하지만 목표는 명시하지 않는다.

절차지향 프로그래밍

정의

  • 순차적인 처리가 중요하고 프로그램 전체가 유기적으로 연결되도록하는 프로그래밍 패러다임

예시

  • 대표적인 절차지향 언어 : C언어

장점 및 단점

  • 장점

    컴퓨터의 작업 처리 방식과 유사 → 다른 패러다임에 비해 빨리 처리되어 시간적으로 유리

  • 단점

  • 유지보수가 어렵다

  • 실행순서가 정해져 있어 코드의 순서가 바뀌면 동일한 결과 보장이 어렵다.

객체지향 프로그래밍

정의

  • 실제 세계를 모델링하여 프로그램을 객체들의 모임으로 표현하는 프로그래밍 패러다임
  • 데이터와 그 데이터를 처리할 메소드를 한데 묶어 객체를 만들고 객체를 조립하는 것을 목표

특징

  • 각 객체들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있다.
  • 현대 프로그래밍 언어들은 대부분 객체지향 프로그래밍 패러다임을 가지고 있다.
  • 대표적인 4가지 특징
    • 추상화
      외부 인터페이스만 제공하고 객체 내부를 숨겨서 어떻게 일을 하는지 모르게 결과를 내보낸다.
    • 캡슐화
      객체 내부에 필요한 데이터를 묶어서 한번에 관리한다.
    • 상속성
      모객체를 상속 받아 추가 기능을 더 붙이거나 약간의 수정을 가한 객체를 만들 수 있다.
    • 다형성
      메소드 이름이 같아도 타입에 따라 다른 메소드를 실행할 수 있다.

장점 및 단점

  • 장점
  • 코드 재사용이 용이
  • 유지보수가 쉬움 → 대형 프로젝트에 적합
  • 단점
  • 객체가 많아지면 용량이 커짐
  • 설계가 어려워짐

예시

  • 대표적인 객체지향 언어 : Java언어

선언형 프로그래밍

  • 목표는 명시하지만 알고리즘은 명시하지 않습니다.
  • 내가 원하는 것을 선언 후 이제 어떻게 할 것인가를 정하는 것
  • 함수형, 논리형 프로그래밍이 대표적

함수형 프로그래밍

정의

  • 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변데이터를 멀리하는 프로그래밍 패러다임
  • 사이드 이펙트를 최대한 제거하여 가능한 코드의 대부분이 입력과 출력의 관계를 기술하게끔 하는 프로그래밍 패러다임
    • 입력이 같으면 출력도 같다.

특징

  • destructive update(한번 정의한 변수 값 변경) 불허용 = immutable data(불변하는 데이터) 사용

  • 함수형 언어로 별도로 설계되지 않은 언어에서도 가능

  • 최근, 처리해야 할 데이터나 트래픽이 기하급수적으로 증가하면서 주목 받고 있다.

  • 명령형과의 차이점 예시 : a=a+1 의미

    • 명령형 언어 : 변수 a의 값이 변경되어 저장됨을 의미
    • 함수형 언어 : 자기 자신보다 1만큼 더한 수라는 의미
  • 순수함수

    • 함수 내부에서 프로그램 상태를 변경하여 사이트 이펙트를 발생시키지 않는 함수

    • 함수의 실행이 외부에 영향을 주지 않는다.

    • 닫힌 함수

    • 부작용이 없다.

    • 예시

      • 순수함수가 아닐 경우

        / 외부에 영향을 주는 함수
        int a = 10, b = 20;
        public int plus(int value){
          a = a + value;
          return a;
        }
        plus(15); //  = 25
        plus(15); //  = 40
        // a = 40; 외부 변수 a의 값을 계속 바꾼다.
      • 순수함수일 경우

        // 순수함수
        int a = 10, b = 20;
        public int plus(int a, int b){
            return a+b;
        }
        plus(a, b); // = 30
        plus(a, b); // = 30
        // 외부 변수 값 바꾸지 않음 + 입력이 같으면 출력도 같다.

예시

  • 함수형 프로그래밍 언어: 스칼라

장점 및 단점

  • 장점
    • 함수가 사이드 이펙트를 가지지 않기에 동시성과 관련된 문제를 원천적으로 봉쇄하고, 테스트하기 용이
    • 메모이제이션 가능
    • 함수 호출 시 파라미터 x를 알고 수행할 결과를 한 번 알면 다음엔 그냥 메모해 둔 결과값 리턴 가능(캐싱)
    • 피보나치 재귀함수 구현 등에 적용하면 극단적으로 속도 빨라짐
    • 멀티스레드 병렬화 쉽게 가능
      멀티스레드 버그 발생 원인이 스레드 간 공유되는 메모리를 변경하는 것인ㄴ데, 언어 차원에서 메모리 불변을 보장해 멀티스레드 안정성을 보장한다.
    • 함수 자체가 first-class datatype으로 분류해서 함수를 보통 변수 다루듯 할 수 있다.
    • 함수를 다른 함수에 인수로 넘겨주거나, 함수를 반환하는 함수를 정의할 수 있으며 생산성이 뛰어나다.
    • 코드가 간결해지고 버그가 잘 생기지 않는 견고한 코드가 나온다.
  • 단점
    • 함수가 사이드 이팩트를 가지지 않아서 상태가 없기 때문에 함수형 프로그래밍 패러다임만 사용하여 프로그램을 작성할 수는 없다.

반응형 프로그래밍

정의

  • 비동기 데이터 흐름에 기반을 둔 프로그래밍 패러다임
  • 데이터 중심 사고 방식인 프로그래밍
  • 이벤트나 변화에 반응하기 위한 비동기적 데이터 처리 및 흐름 기반 프로그래밍 패러다임

특징

  • OOP와 다르게 데이터의 흐름에 더 집중
    • 이 데이터 흐름은 관찰할 수 있거나 필터링하거나 다룰 수 있으며 새로운 흐름을 만들기 위해 다른 흐름과 병합할 수도 있다.
  • 함수형 프로그래밍을 기반으로 불변식 개념에 기초한다.
    • 함수형 프로그래밍 패러다임의 도구들을 자유자재로 활용하여 데이터 흐름을 제어
  • 직접 재계산명령 필요없다
    변수 값을 바꾸면 해당 변수를 참조하는 모든 식들이 연쇄적으로 재평가되면서 스스로의 값을 갱신한다.
  • 데이터 흐름을 처리하는 여러 함수
    • merge(): 말 그대로 두 흐름을 하나로 합친다.
    • filter(): 데이터 흐름에서 내가 관심있는 이벤트들만 추출한 다른 흐름 제작 가능
    • map(): 데이터 흐름의 값에 따라 다른 값을 가지는 새로운 데이터 흐름 제작 가능 (예시: click이벤트 있을 때마다 숫자 1 반환하는 흐름 등) / immutable 한 특성살려 기존 흐름 값이 영향 주지 않음

예시

  • 트위터 피드도 하나의 데이터 흐름으로 만들어 그에 따라 반응하는 프로그램 생성 가능

  • 엑셀

    명령형 프로그래밍은 변수 a에 계산식을 할당하면 결과값이 저장

    // 명령형 프로그래밍
    int a=10, b=20;
    int c = a+b;
    System.out.println(c)); // c = 30;
    a = 20;
    System.out.println(c)); // c = 30; c에 계산식의 결과값 30만 저장됨

    반응형 프로그래밍은 계산식이 저장된다.

    // 반응형 프로그래밍
    int a=10, b=20;
    int c = a+b;
    System.out.println(c)); // c = 30;
    a = 20;
    System.out.println(c)); // c = 40; c에 계산식 자체가 저장되어 사용하는 변수 a의 값이 바뀐 것이 반영됨

장점 & 단점

  • 장점
    • 동기식 비효율적 처리로 인한 병목현상 해결 → 생산성 증대
    • 다수의 비동기 이벤트를 효과적으로 처리할 수 있기에 사용자 경험을 개선가능
  • 단점
    • 언제 변할지 모르는 수많은 데이터를 일일히 추적하다보면 성능을 저하시켜 고속처리 사용에는 부적합
      • 속도 느린 사용자 입력 반응 UI 등에서 사용

1개의 댓글

comment-user-thumbnail
2022년 2월 18일

기똥차네요!!

답글 달기