TIL

TIL 객체지향(OOP) VS 절차지향(PP) 프로그래밍

sunyong_01 2022. 10. 18. 22:44

우선 그림

🔥 간단 이해 🔥

  • 차식 방법은 프로그램을 위 그림같이 데이터와 기능(함수)으로 나누어서 기능의 목록을 절차적으로 수행.
  • 객체지향 방법은 데이터(변수)와 기능(메소드)을 가진 독립적인 객체를 만들고, 그 객체들의 집합을 프로그램이라고 함. 이 각각의 객체들 간의 유기적인 상호작용을 통해 로직 구성.

객체지향 (OOP: Object-oriented Language) 프로그래밍

컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

프로그래밍 패러타임

  • 프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다.

특징

객체지향언어의 특징은 크게 캡슐화, 상속, 다형성, 추상화 4가지로 나눌 수 있습니다.

  • 1. 캡슐화 (Encapsulation)
    • 데이터와 알고리즘(코드)이 하나의 묶음으로 정리된 것으로써 개발자가 만들었으며, 관련된 코드와 데이터가 묶여있고 오류가 없어 사용이 편리하다. 데이터를 감추고 외부 세계와의 상호작용은 메소드를 통하는 방법인데, 라이브러리로 만들어 업그레이드하면 쉽게 바꿀 수 있다.
      • 메소드: 메시지에 따라 실행시킬 프로시저로서 객체지향 언어에서 사용되는 것. 객체지향 언어에서는 메시지를 보내 메소드를 수행시킴으로써 통신(communication)을 수행
    • 데이터는 외부에서 직접 접근을 하면 안되고 함수를 통해서만 접근해야 한다
  • 2. 은닉화 (Information hiding)
    • 캡슐화의 목표. 내부 구조는 private하게 감춰두고 외부에서 조작할 수 있는 정보만 public으로 공개한다
    • 바깥 간섭으로 인해 발생하는 오류 방지
      • 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지 보수성을 높인다
    • 다른 사람의 클래스 객체를 다 뜯어볼 필요가 없어진다. 제공되는 기능 그대로 사용하면 된다
  • 3. 상속 (Inheritance)
    • 기존 메소드(부모)와 변수를 물려받되, 필요한 기능을 더 추가하거나 나(자식)에게 맞게 재정의하는 방법
    • 다중상속은 불가하다. (클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 했다. 자세한 내용은 이전 포스트에 있음.)
  • 4. 추상화 (Abstraction)
    • 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다
    • 실제로 존재하는 객체들을 프로그램으로 만들기 위한 공통적인 특성을 파악해서 필요 없는 특성을 제거하는 과정을 가리킨다.
  • 5. 다형성 (Polymorphism)
    • 다형성이란 하나의 이름(방법)으로 많은 상황에 대처하는 기법이다. 개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 더 간단해지는 효과가 있다.
      • 일반적으로 오버라이딩 혹은 오버로딩을 의미한다
    • 오버로딩(Overloading) : 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것
    • 오버라이딩(Overriding) : 상속 받은 하위 클래스가 메서드의 내용만 변경(재정의) 하는 것.

장점

  • 코드 재사용이 용이
    • 상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있음.
  • 생산성 향상
    • 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상할 수 있음.
  • 자연적인 모델링
    • 우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현 가능.
  • 유지보수의 우수성
    • 프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬워서 매우 경제적이라 할 수 있음.

단점

  • 느린 개발 속도
    • 모든 객체의 역할과 기능을 이해해야 하기 때문에 프로그래밍에 많은 시간이 소요됩니다.
  • 느린 실행 속도
    • 객체지향언어의 처리 속도는 절차지향언어보다 느립니다.
  • 높은 난이도
    • 객체지향언어는 대체로 난이도가 높습니다. 특히 다중 상속이 지원되는 c++는 악명이 높습니다.

절차지향 (PP: Procedural Programming) 프로그래밍

물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다

  • 대표적인 절차지향 언어에는 C언어가 있다

장점

  • 빠른 실행 속도
    • 초기 프로그래밍 언어로, 컴퓨터 처리구조와 비슷해 실행 속도가 빠름

단점

  • 유지보수가 어려움
  • 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려움
  • 디버깅이 어려움

예상 면접질문

  • 객체 지향 프로그래밍(OOP)이 뭐에요?
  • 객체 지향 프로그래밍을 했을 때 장점이 뭐에요?
  • 객체 지향 프로그래밍의 특징을 말씀해주세요
  • 객체(또는 클래스)가 뭐에요?
    • 클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타정보라고 볼 수 있다.
    • 인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터

정리

  • 절차지향은 데이터 중심, 객체지향은 기능 중심
  • 절차지향의 반대는 객체지향이 아니고 객체지향의 반대는 절차지향이 아님