프로그래밍 패러다임 + 추가

more·2023년 11월 9일

프로그래밍 패러다임

  • 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론

    • 선언형 (Declarative Programming) : 무엇을 풀어내는가에 집중하는 패러다임. "프로그램은 함수로 이루어진 것이다"
      • 프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명
        -> 목표를 명시하고 알고리즘을 명시하지 않음 (WHAT)
        -> 명령형 프로그래밍의 추상화
      • 함수형 (Functional Programming) : 순수 함수들을 블록처럼 쌓아 로직을 구현하고 고차 함수를 통해 재사용성을 높인 프로그래밍 패러다임. 함수가 일급 객체
        • 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리함

        • 순수 함수로 이루어져 있음

        • 순수 함수 : 출력이 입력에만 의존하는 것, 한 함수에 매개변수 a, b가 주어졌을 때에, 출력 결과가 a랑 b로만 영향을 받아야지 다른 전역 변수 c 같은 것에 영향을 받으면 안된다.
          -> 동일한 input(인자 값)에 대해 동일한 output(리턴 값)을 리턴하는 함수
          -> 외부의 상태를 변경하지 않는 함수

        • 고차 함수 : 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것

          • 이때 해당 언어가 일급 객체라는 특징을 가져야 함
            • 변수나 메서드에 함수를 할당 가능
            • 함수 안에 함수를 매개변수로 담기 가능
            • 함수가 함수를 반환 가능
        • 장점

          • 높은 수준의 추상화
          • 높은 함수 단위의 재사용성
          • 프로그램의 동작 예측 수월
        • 단점

          • 코드의 가독성이 좋지 않아 질 수도 있음
          • 재귀문의 잘못된 코드 스타일은 무한 루프에 빠지기도 함
          • 순수 함수 끼리의 조합은 높은 cost를 갖을 수 있음

    • 명령형 (imperative programming)
      • 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임
        -> 알고리즘을 명시하고 목표는 명시하지 않음 (HOW)
      • 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것
      • 객체지향형 : 객체들의 집합으로 프로그램의 상호작용을 표현하며, 데이터를 객체로 취급하여 객체 내부에 선언도니 메서드를 활용하는 방식
        • 설계에 많은 시간이 소요
        • 다른 패러다임에 비해 느리다.
        • 특징
          • 추상화 : 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것
          • 캡슐화 : 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것
          • 상속성 : 상위 클래스의 특성을 하위 클래스가 이어 받아 재사용하거나 추가, 확장하는 것,코드 재사용, 유지보수성이 좋다.
          • 다형성 : 하나의 메서드나 클래스가 다양한 방법으로 동작하는 것
            • 오버로딩 : 같은 이름을 가진 메서드를 여러개 두는 것
              • 메서드 타입, 매개변수 유형, 개수 등으로 여러개 둘 수 있음
              • 컴파일 중에 발생하는 정적 다형성
            • 오버라이딩 : 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의하는 것
              • 런타임 중에 발생하는 동적 다형성
        • 설계 원칙 (SOLID)
          • 단일 책임 원칙 : 모든 클래스는 각각 하나의 책임을 가져야 한다.
          • 개방 폐쇄 원칙 : 유지 보수 사항이 생긴다면 코드를 쉽게 확장할 수 있도록 하고 수정할 때는 닫혀 있어야 한다. 기존의 코드는 잘 변경하지 않으면서 확장은 쉽게 할 수 있어야 함
          • 리스코프 치환 원칙 : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 부모 객체에 자식 객체를 넣어도 시스템이 문제없이 돌아가야 함
          • 인터페이스 분리 법칙 : 하나의 일반적인 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 함
          • 의존 역전 법칙 : 자신보다 변하기 쉬운것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 원칙, 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야함
      • 절차지향형
        • 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있음
        • 코드의 가독성이 좋으며 실행 속도가 빠름
        • 계산이 많은 작업, 대기 과학 관련 연산, 머신 러닝 배치 등에 쓰임
        • 모듈화가 어렵고 유지 보수성이 떨어짐

  • 일급 객체
    - 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
    • 무명의 리터럴로 생성 할 수 있음
    • 변수나 자료구조 (객체, 배열)에 저장할 수 있음
    • 함수의 매개변수에 전달 할 수 있음
    • 함수의 반환값으로 사용할 수 있음

면접 대비

Q: 어떤 패러다임을 사용하는 것이 좋은가?
A: 비즈니스 로직이나 서비스의 특징을 고려하고 여러 패러다임을 조합하여 상황과 맥락에 따라 장점만 취해 개발하는 것이 좋음 -> 정답은 없다.

Q: 함수형 프로그래밍은 무엇인가요?
A: 함수형 프로그래밍은 순수 함수들을 블록처럼 쌓아 로직을 구현하고 불변성을 강조하며, 프로그램의 상태 변경을 최소화하는 것을 목표로 합니다. 수학적 함수의 개념에 기반을 두고 있으며, 이를 통해 코드의 간결성, 모듈성 및 예측 가능성을 높일 수 있습니다. 순수함수로 이루어져 있기 때문에 동일한 입력에 대해 항상 동일한 출력을 반환하며, 외부 상태에 영향을 주고 받지 않아 불변성이 유지되고 이로 인해 함수의 결과를 예측하기 쉬워지고, 테스트와 디버깅이 용이해지는 장점이 있습니다. 하지만 높은 수준의 추상화를 요구하기 때문에 코드가 이해하기 어렵고 복잡해질 수 있으며, 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지기 때문에 재귀적 코드 무한 루프에 빠질 수 있습니다.

Q: 순수 함수와 고차 함수의 차이가 무엇인지 설명 해 주세요.
A: 순수 함수주어진 입력 값에 대해 항상 동일한 출력 값을 반환하는 함수입니다. 다시 말해, 함수의 결과는 입력 값에만 의존하며, 외부 상태를 변경하지 않아 부수 효과(side effect)가 없는 함수입니다. 이러한 특성으로 인해 순수 함수는 예측 가능하고 테스트하기 쉽고 동일한 입력에 대한 동일한 출력을 보장하므로 코드의 안정성을 높이고 디버깅을 용이하게 만듭니다.
반면 고차 함수함수를 다루거나 함수를 다른 함수로 전달할 수 있는 함수입니다. 즉, 함수를 인수로 받거나 함수를 반환할 수 있습니다.
이러한 능력을 통해 고차 함수는 함수를 추상화하고 재사용성을 높이는 데 사용됩니다. 또한 고차 함수를 통해 함수를 합성하거나 변환하는 기능을 제공할 수 있습니다.

출처

면접을 위한 CS 전공지식 노트
명령형 프로그래밍 VS 선언형 프로그래밍
함수형 프로그래밍

0개의 댓글