본문 바로가기

CS

[면접을 위한 CS 전공지식 노트] 프로그래밍 패러다임

728x90


 

🔑프로그래밍 패러다임

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

 


 

🔑선언형과 함수형 프로그래밍

  • 선언형 프로그래밍
    • "무엇을" 풀어내는가에 집중
    • "프로그램은 함수로 이루어진 것이다"라는 명제가 담겨 있음
  • 함수형 프로그래밍
    • 선언형 패러다임의 하위 카테고리
    • 순수함수를 쌓아 로직을 구현하고 고차 함수를 통해 재사용성을 높임
      • 순수함수 : 출력이 입력에만 의존함
      • 고차함수
        함수를 값채점 매개변수로 받아 로직을 생성할 수 있는 것
        고차함수를 사용하기 위해서 해당 언어는 '일급 객체'라는 특징을 가져야 함
        • 일급 객체
          • 변수나 메소드에 함수가 할당되어야 함
          • 함수 안에 함수를 매개변수로 담을 수 있어야 함
          • 함수가 함수를 반환할 수 있어야 함
    • 자바 스크립트에서 선호하는 방식 : 단순하고 유명한 언어이면서 함수가 일급 객체임

 

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

  • 객체들의 집합으로 프로그램의 상호작용을 표현하고 데이터를 객체로 취급해 객체 내부에 선언된 메소드를 활용하는 방식
  • 설계에 많은 시간이 소요되고 처리 속도가 상대적으로 느림
  • 특징
    • 추상화(abstraction)
      복잡한 시스템으로부터 핵심적인 개념이나 기능을 간추려 냄
    • 캡슐화(encapsulation)
      객체의 속성과 메소드를 하나로 묶고 일부를 외부에 감춰 은닉하는 것
    • 상속성(inheritance)
      상위 클래스의 특성을 하위 클래서가 이어받아 재사용하거나 추가, 확장하는 것
      코드의 재사용, 계층적 관계 생성, 유지 보수 측면에서 중요
    • 다형성(polymorphism) 
      하나의 메소드나 클래스가 다양한 방법으로 동작하는 것. 오버라이딩, 오버로딩 등으로 구현
      • 오버로딩(overloading) : 같은 이름을 가진 메소드를 여러개 두는 것. 컴파일 중 발생하는 정적 다형성
      • 오버라이딩(overwriting)
        상위 클래스로부터 상속받은 메소드를 하위 클래스에서 재정의. 런타임 중 발생하는 동적 다형성
  • 설계원칙 : SOLID원칙
    • 단일책임원칙(Single Responsibility Principle)
      모든 클래스는 각각 하나의 책임만 가져야 한다.
    • 개방-폐쇄 원칙(Open Closed Principle)
      기존 코드는 잘 변형하지 않으면서 확장은 쉽게 할 수 있어야 한다.
    • 리스코프 치환원칙(Liskov Substitution Principle)
      프로그램의 객체는 프로그램의 정확서을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
    • 인터페이스 분리원칙(Interface Secregation Principle)
      하나의 일반적 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 한다.
    • 의존 역전 원칙(Dependenty Inversion Principle)
      상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 한다.

 

🔑절차형 프로그래밍

  • 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있음
  •  코드 가독성이 좋고 실행속도가 빠라 계산이 많은 작업 등에 사용됨
  • 모듈화하기 어렵고 유지 보수성이 떨어짐

🔑패러다임의 혼합

  • 비즈니스 로직이나 서비스의 특징을 고려해 패러다임을 결정
  • 여러 패러다임을 조합해 상황과 맥락에 따라 패러다임의 장점만 취해 개발하는 것이 좋음

 

 

 

 

 


 

 

 

내 생각에 프로그래밍 패러다임은 결론적으로 "어떻게 하면 가장 효율적으로 코드를 짤 수 있을까?"에 대한 대답인 것 같다.

어떤 언어는 객체 지향을 지원하고 어떤 언어는 절차형을 지원하고, 또 어떤 언어는 여러 패러다임을 혼합해 지원한다.

그러니까 결국 어떤 프로그래밍 패러다임이 가장 베스트인가? 에 대한 답은 없고 언어와 개발할 서비스에 맞춰 결정되는 것 이라는 생각이 든다.

때문에 프로그래밍 패러다임이 프로그래머들에게 프로그래밍의 관점을 갖게 해주는 것 이지 않을까?

728x90