절차지향 vs 객체지향 vs 함수형

권태형·2023년 3월 16일
0

지식정리

목록 보기
32/72
post-thumbnail

😀의존성 주입(DI)에 대한 포스팅은 준비하면서 의존성 주입의 등장배경에 대해서 정리하다보니 객체 지향 프로그래밍(OOP)을 먼저 알아야 할 필요성이 생겨 포스팅을 정리하게 되었다. OOP에 대해 알아보기 전에 객체지향과 관련된 다른 프로그래밍 패러다임에 대해서 먼저 알아보자.

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

  1. 구조적 프로그래밍 (Structured Programming)
  2. 절차 지향 프로그래밍 (Procedural oriented Programming)
  3. 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
  4. 함수형 프로그래밍 (Functional Programming)
  • 구조적 프로그래밍제어 흐름직접적인 전환에 대한 규칙을 제시한다.

    • 구조적 프로그래밍기능을 중심적으로 개발을 진행한다.
    • 구조적 프로그래밍은 프로그래밍이라는 기술이 시작되면서 가장 처음으로 적용된 패러다임이다.
  • 절차 지향 프로그래밍은 제어흐름의 직접적인 전환에 대한 규칙을 제시한다.

    • 절차지향 프로그래밍은 "문제를 순서대로 해결"하는 프로그래밍 패러다임이다.
  • 객체 지향 프로그래밍제어흐름간접적인 전환에 대한 규칙을 제시한다.

    • 객체 지향 프로그래밍은 프로그램의 처리단위가 객체인 프로그래밍 방법이다.
    • 객체 지향 프로그래밍은 “현실 세계를 모델링”하는 대표적인 프로그래밍 패러다임이다.
  • 함수형 프로그래밍할당문에 대한 규칙을 제시한다.

    • 함수형 프로그래밍함수를 중심적으로 개발을 진행한다.
    • 함수형 프로그래밍은 3가지의 패러다임 중 가장 처음 만들어졌지만 최근들어 겨우 도입되기 시작하는 패러다임이다.

😀네가지 패러다임에 대해 간단하게 알아보았다. 그 중에 절차지향, 객체지향, 함수형에 대해서 알아보자


절차지향, 객체지향, 함수형

절자치향(Procedural oriented)

절차 지향은 프로그램을 기능중심으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다. 즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춘다.

  • 말 그대로 '절차'를 중심으로 하는 프로그래밍 방법으로 일이 진행되는 순서대로 코드를 작성하는 방식이다.

  • 소형 프로그래밍의 경우 작은 기능을 수반하기 때문에 객체 지향보다는 절차 지향이 적합할 수 있다. 작은 기능을 객체별로 나눌 경우, 오히려 복잡해질 수 있기 때문이다.

절자치향의 특징

  • ⬆ 높은 처리속도
    컴퓨터의 처리구조와 비슷하기 때문에 실행 속도가 빠르다.

  • ⬆ 높은 가독성
    코드가 읽히는대로 실행되기 때문에 가독성이 좋을 수 있다.

  • 코드끼리의 높은 의존성
    의존성이 높으면 앞 순서가 일어나면 뒷 순서가 반드시 발생한다.
    앞쪽 내용이 변경되면 뒷쪽 내용이 민감하게 반응하여 쉬워 유지보수가 어렵다.

  • 엄격하게 순서가 정해져 있어 비효율적

객체지향(Object-Oriented)

객체 지향은 소프트웨어의 핵심을 기능이 아닌 객체로 삼으며 “누가 어떠한 일을 할 것인가?”에 초점을 맞춘다. 즉, 객체를 도출하고 각각의 역할을 정의하는 것에 초점을 맞춘다.

  • 책임권한을 가진 객체들이 서로 메시지를 주고받으며 협력해서 필요한 기능을 수행하도록 시스템을 개발하는 것을 객체 지향이라고 한다.

  • 크고 복잡한 시스템을 효과적으로 분해하고 구성할 수 있고, 손쉽게 이해하고 효율적으로 다룰 수 있게 도와주는 방법으로 인정받아 많은 프로그래밍 언어에 적용되어 왔고 지금은 가장 인기 있는 프로그래밍 패러다임으로 자리 잡았다.

객체지향이 가지는 특징

😀객체지향을 실현할 때 아래의 대표적인 4가지 특징들을 만족해야 객체지향적인 프로그램이나 코드를 만들었다고 할 수 있다.

1. 캡슐화 (Encapsulation)

개념적이나 물리적으로 객체 내부의 세부적인 사항감추는 것캡슐화라고 부른다.
즉, 캡슐화를 사용하는 가장 큰 이유는 정보은닉을 목적으로 한다.

  • 객체의 구현 내용을 외부에서 알 수 없게 하여, 객체의 사용자는 객체가 제공하는 인터페이스만 이용할 수 있다.

  • 캡슐화의 목적은 변경하기 쉬운 객체를 만드는 것이다. 캡슐화를 통해 객체 내부의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있게 된다.

2. 상속성 (Inheritance)

이미 정의된 상위 클래스의 특징을 하위 클래스에서 물려받아 코드의 중복을 제거하고 코드 재사용성을 증대시킨다.
즉, 하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려 받는 것을 말한다.

  • 개별 클래스를 상속 관계로 묶음으로써 클래스 간의 체계화된 구조를 파악하기 쉬워진다.

  • 데이터와 메소드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지할 수 있다.

3. 추상화 (Abstraction)

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 한다.
즉, 불필요한 부분을 생략하고 객체 속성 중 공통적이고 중요한 것에만 중점을 두어 모델화 하는 것이다.

  • 추상화는 객체들의 공통적인 특성을 파악하여 필요 없는 특성제거하는 과정이다.

  • 시스템을 구축하기 전에 시스템 구조 및 구성을 가시적으로 볼 수 있고, 해당 시스템과 유사한 모델을 만들어 여러가지 테스트를 할 수 있다.

  • 복잡한 내부 구현에 신경쓰지 않고, 외부에 노출되어 있는 인터페이스만을 이용하여 코드를 작성할 수 있다.

4. 다형성 (Polymorphism)

다형성이란 객체(클래스)연산을 수행하게 될 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성으로 다른 여러 형태로 재구성 되는 것을 말한다.
즉, 동일한 메소드의 이름을 사용하지만 메소드에 대해 클래스마다 다르게 구현되는 개념이 다형성이다.

  • 다형성을 통해 역할(인터페이스)과 구현을 분리해서 오버라이딩(Overriding)을 통해 서비스의 구현기능을 유연하게 변경, 확장이 가능하다.

😀오버로딩과 오버라이딩에 대한 개념이 궁금하면 클릭👈 TCP School 참조

😀 위의 4가지 외에도 아래와 같은 특징들을 더 가질 수 있다.

5. 의존성 (Dependency)

  • 의존성이란 객체(모듈 및 클래스)들이 협력하는 과정 속에서 해당 객체들이 다른 객체를 의존하게 되는 정도를 나타낸다.

  • 의존성이라는 말속에는 어떤 객체가 변경될 때 그 객체에 의존하는 다른 객체도 함께 변경될 수 있다는 사실이 내포되어 있다.

  • 만약 하나의 객체가 변경될 경우 의존하고 있는 다른 객체 또한 변경이 이루어지게 됩다.

6. 결합도 (Coupling)

  • 결합도는 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 의존성을 가지고 있는지를 나타냅니다.

  • 객체 사이의 의존성이 과한 경우를 가리켜 결합도가 높다고 말한다.

  • 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다.

  • 두 객체 사이의 결합도가 높으면 높을수록 함께 변경될 확률도 높아지기 때문에 변경하기 어려워진다.

  • 따라서 설계의 목표는 객체 사이결합도를 낮춰 변경이 용이한 설계를 만드는 것이어야 한다.

7. 응집도 (Cohesion)

  • 응집도는 모듈에 포함된 내부 요소들이 각각 연관되어 있는 관계의 정도를 나타낸다.

  • 밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에 위임하는 객체를 가리켜 응집도가 높다고 말한다.

  • 1개의 메소드가 내부에서 변수를 많이 사용할 수록 해당 메소드클래스응집도가 높아지게 된다.

  • 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.

  • 객체의 응집도를 높이기 위해서는 객체는 스스로 자신의 데이터를 책임져야 한다.


함수형(Functional)

순수 함수를 사용하여 상태 제어보다 처리 속도에 초점을 둔 방식으로실행 순서를 정의하지 않기 때문에 비절차형 언어라고 하기도 한다.

🙄❓순수함수란?
동일한 입력값에 항상 동일한 반환값을 내는 함수로 외부에 영향을 받지 않고, 함수 실행이 프로그램에 영향을 주지 않는 특징을 갖는다.

함수형의 특징

  • 불변성
    데이터의 값을 변경하는 것이 아니라 새로운 값을 만들어내는 것으로 작업을 처리한다.
    상태를 변화시키는 부작용(side effect)을 방지하고 안정적인 코드를 작성할 수 있다.
    불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다.

  • 무상태성
    함수형 프로그래밍에서는 상태를 갖지 않는 것을 권장한다. 상태를 갖지 않는 함수들로 구성된 프로그램은 동시성과 분산처리를 훨씬 쉽게 처리할 수 있다.

  • 재귀적인 접근
    함수형 프로그래밍에서는 반복문 대신 재귀 함수를 이용하여 반복적인 처리를 수행한다.
    for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다.

  • 함수의 순수성
    함수의 입력 값만으로 결과가 결정되도록 하여, 동일한 입력이 주어지면 항상 동일한 출력을 반환하는 순수한 함수를 사용한다.
    이로 인해 데이터의 불변성을 지키데 큰 도움이 되지만, 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다.


절차지향, 객체지향, 함수형 한눈에 비교

구분절차지향 프로그래밍객체지향 프로그래밍함수형 프로그래밍
주요 특징프로세스 중심객체 중심함수 중심
데이터 처리 방법일반적으로 변수를 사용한 계산클래스와 객체를 사용한 데이터 처리데이
데이터와 함수의 분리분리하지 않음분리하지 않음분리됨
상속지원하지 않음지원함지원하지 않음
다형성지원하지 않음지원함지원함
정보 은닉지원하지 않음지원함지원하지 않음
코드 재사용함수를 호출하여 사용클래스를 상속하거나 객체를 재사용함수를 호출하여 사용
프로그램의 설계프로그램을 데이터와 절차로 구성프로그램을 객체와 클래스로 구성프로그램을 함수로 구성

😀이번 포스팅에 이어서 다음포스팅(객체 지향 프로그래밍 (OOP)에 대해서 알아보자)에 객체지향 설계와 객체지향 프로그래밍에 대해서 알아보자.


참고자료(출처)
노마더 코더 유튜브 동영상 [개발자 전공필수? 객체지향 개념정리 10분컷.]
스파르타 코딩클럽 Node.js 심화학습 강의
INCODOM 객체 지향 포스팅
면접을 위한 CS 전공지식 노트 (도서)
위키백과 검색결과 [절차적 프로그래밍]
Jongminfire.dev 블로그 포스팅 함수형 프로그래밍이란?

profile
22년 12월 개발을 시작한 신입 개발자 ‘권태형’입니다. 포스팅 하나하나 내가 다시보기 위해 쓰는 것이지만, 다른 분들에게도 도움이 되었으면 좋겠습니다. 💯컬러폰트가 잘 안보이실 경우 🌙다크모드를 이용해주세요.😀 지적과 참견은 언제나 환영합니다. 많은 댓글 부탁드립니다.

0개의 댓글