프로그래밍 패러다임

U_Uracil·2024년 4월 15일
0

CS

목록 보기
5/9

프로그래밍 패러다임이란?

  • 프로그래밍이나 소프트웨어 개발에 접근하는 특정한 방식, 철학 또는 관점
  • 프로그래밍 언어는 하나 이상의 프로그래밍 패러다임을 지원

선언형 프로그래밍


  • 프로그램이 “어떻게” 해야 하는지를 나타내기보다 “무엇”과 같은지가 중점
  • “프로그램은 함수로 이루어진 것이다.” 라는 명제가 담겨 있음
  • 선언형 프로그래밍의 한 종류로 함수형 프로그래밍이 있음

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


  • 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
  • 순수한 함수를 작성하고 공유된 상태와 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 작성하는 프로세스
  • 대입문이 없는 프로그래밍 - Clean Code의 저자 Robert C.Martin

함수형 프로그래밍의 특징

부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.

부수 효과(Side Effect)

  • 다음과 같은 변화 또는 변화가 발생하는 작업
    • 변수의 값 변경
    • 자료 구조를 제자리에서 수정
    • 객체의 필드값을 설정
    • 예외나 오류가 발생하며 실행이 중단
    • 콘솔 또는 파일 I/O가 발생

순수 함수(Pure Function)

  • 부수 효과가 없는 함수
  • 함수의 실행이 외부에 영향을 끼치지 않는 함수

참조 투명성(Referential Transparency)

  • 프로그램의 변경 없이 어떤 표현식을 값으로 대체할 수 있다는 의미
  • 같은 입력에 있어서 항상 동일한 출력을 냄

불변성(Immutable)

  • 함수 외부에서 데이터를 수정하지 않음
  • 함수의 계산을 수행하는 동안 변수에 할당된 값들이 절대 변하지 않음

일급 객체(First-Class Object, First-Class Citizen)

  • 다음과 같은 것들이 가능한 객체를 의미
    • 변수나 데이터 구조 안에 담을 수 있음
    • 파라미터로 전달 가능
    • 반환값으로 사용 가능
    • 할당에 사용된 이름과 무관하게 고유한 구별이 가능
  • 함수형 프로그래밍에서 함수는 1급 객체로 취급

고차 함수(High Order Function)

  • 함수를 다루는 함수
  • 함수의 인자로 함수 전달 가능
  • 함수의 리턴 값으로 함수 사용 가능

익명 함수(Anonymous Function)

  • 이름이 없는 함수
  • 람다식으로 표현되는 함수 구현

함수형 프로그래밍의 장점

  • 높은 수준의 추상화 제공
  • 함수 단위의 코드 재사용성이 높음
  • 사용하는 모든 데이터가 변경 불가능(immutable)하고 함수는 부수 효과를 가지고 있지 않기 때문에 동시성과 관련된 문제를 원천적으로 차단
  • 테스트가 쉽고 가독성이 좋아 유지보수가 용이함

함수형 프로그래밍의 단점

  • 높은 수준의 추상화로 코드의 이해가 어려울 수 있음
  • 불변성과 순수 함수를 사용해 상태 변경을 최소화하기 때문에 성능 면에서 좋지 않을 수 있음
  • 명령형 프로그래밍과 상당히 다른 개념과 접근 방식이므로 러닝 커브가 존재


명령형 프로그래밍


  • 프로그램이 “무엇을” 해야 하는지를 나타내기보다 “어떻게” 해야 하는지가 중점
  • 선언형 프로그래밍에는 객체 지향 프로그래밍, 절차적 프로그래밍이 있음

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


  • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 “객체”의 모임으로 파악하는 패러다임
  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태(변수)와 행위(메소드)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

객체 지향 프로그래밍의 특징

추상화

  • 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
  • Java에서는 추상 클래스인터페이스를 통해 추상화를 구현할 수 있음

캡슐화

  • 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
  • 캡슐화의 목적
    • 데이터 보호 - 외부로부터 클래스에 정의된 속성과 기능을 보호
    • 데이터 은닉 - 내부의 동작을 감추고 외부에는 필요한 부분만 노출
  • Java에서는 Class의 접근 제어자Getter/Setter 등으로 캡슐화를 구현할 수 있음

상속

  • 기존의 객체의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고, 기능의 일부분을 변경 및 확장하는 것
  • 코드의 재사용성, 유지보수성이 증가하고 중복이 줄어듦
  • Java에서는 extends 키워드를 통해 상속이 가능

다형성

  • 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
  • Java에서는 오버라이딩오버로딩이 다형성을 구현하는 대표적인 방식
  • 오버라이딩(Overriding) : 부모클래스의 메소드와 같은 이름, 매개변수를 재정의하는 것
  • 오버로딩(Overloading) : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것

객체 지향 프로그래밍의 5가지 설계 원칙

SOLID

  • SRP(Single Responsibility Principle, 단일 책임 원칙) : 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
  • OCP(Open-Closed Principle, 개방-폐쇄 원칙) : 클래스는 확장에는 열려 있고, 변경헤는 닫혀 있어야 한다.
  • LSP(Liskov’s Substitution Principle, 리스코프 치환 원칙) : 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
  • ISP(Interface Segregation Principle, 인터페이스 분리 원칙) : 클라이언트는 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
  • DIP(Dependency Inversion Principle, 의존관계 역전 법칙) : 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현 클래스)에 의존하면 안된다.

객체 지향 프로그래밍의 장점

  • 코드의 재사용성이 높음
  • 유지보수가 용이함
  • 테스트가 쉬움

객체 지향 프로그래밍의 단점

  • 속도가 느림
  • 코드를 나누고 설계하는 것이 어려움

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


  • 프로시저(함수)를 호출함으로서, 추상화와 코드의 재사용성을 목표로 하는 패러다임
  • 일련의 처리 절차를 정해진 문법에 따라 순서대로 수행하는 것을 중요시함

절차적 프로그래밍의 장점

  • 컴퓨터의 처리 구조와 유사하여 실행 속도가 빠름
  • 코드의 재사용성이 높음
  • 모듈 구성이 용이하고 구조적인 프로그래밍이 가능함

절차적 프로그래밍의 단점

  • 프로그램을 분석하기 어려움
  • 코드의 수정이 어려움
  • 유지보수가 어려움

References
선언형 프로그래밍과 함수형 프로그래밍
https://mangkyu.tistory.com/111
https://boxfoxs.tistory.com/430
https://yoondii.tistory.com/124
https://cocoon1787.tistory.com/739
객체 지향 프로그래밍
https://ko.wikipedia.org/wiki/객체지향프로그래밍
https://jeong-pro.tistory.com/95
https://mangkyu.tistory.com/88
https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징
https://sanghyuk.dev/development/2/
절차적 프로그래밍
https://iosdevlime.tistory.com/entry/CSBasic-객체지향-프로그래밍OOP-Object-oriented-Language
https://m.blog.naver.com/wook2124/222108810433

profile
기억은 유한, 기록은 무한

0개의 댓글

관련 채용 정보