개발/개발 공통

[객체 지향] 객체 지향 프로그래밍(OOP)에 대해 알아보자

growing-dev 2023. 1. 14. 22:26
반응형

객체 지향(Object oriented) 이란?

우리가 실생활에서 쓰는 모든 것을 객체라 하며, 객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다.

객체는 클래스라는 틀에서 생겨난 실체이다.

따라서 객체 지향 프로그램은 객체와 객체 간의 연결로 되어 있으며 각각의 객체 안에 자료구조와 알고리즘이 들어있는 것이다.

쉽게 말해서 프로그래밍을 할 때, 이 프로그램 내의 구성요소들을 각각 쪼개고 그 요소들끼리 서로 통신하는 개념으로 프로그래밍을 한다고 생각하면 된다. 이것이 절차 지향과의 큰 차이다.

 

결국 절차지향은 말 그대로, 어떤 순서로 프로그램이 돌아가느냐 의 관점에서 코드를 작성하는 것이고

객체지향은 누가 어떤 일을 하는지 정의하고, 누구에게 전달하는지 의 관점에서 코드를 작성하는 것이다.

일반적으로 간단한 프로그램의 경우 절차지향의 방식이 이해하기 편하고 목적에 부합한다고 볼 수 있다.

하지만 프로그램 내의 코드/파일이 많아지고 여러 프로그램을 묶은 큰 하나의 프로그램을 만드는 등 크고 복잡해지는 프로그램의 경우에는 객체지향 방식이 훨씬 효율적이고 유지보수에 좋다.

 

객체 지향의 특징

객체 지향의 특징은 다음과 같다.

  1. 추상화(abstraction)
    • 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
    • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.(클래스가 없는 객체지향 언어도 존재 ex.JavaScript)
  2. 캡슐화(encapsulation)
    • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
    • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
    • 코드가 묶여있어서 오류가 없어 편리하다.
    • 데이터를 보이지 않고 외부와 상호작용을 할 때는 메서드를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
  3. 상속성(inheritance)
    • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
    • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
    • 기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.
  4. 다형성(polymorphism)
    • 약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
    • 동일한 명령의 해석을 연결된 객체에 의존하는 것
    • 오버라이딩(Overriding), 오버로딩(Overloading)
      • 오버라이딩(Overriding) - 부모클래스의 메서드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
      • 오버로딩(Overloading) - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
  5. 동적바인딩(Dynamic Binding)
    • 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것.
    • 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어난다.
    • 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버라이딩 된 함수가 실행
    • 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)

 

내가 생각하는 가장 중요한 것은 캡슐화와 다형성이다. 이를 통해 객체지향 언어 혹은 프로그램에서 유지보수가 좋아져서 코드의 품질이 올라갈 수 있다고 생각한다.

캡슐화는 대량의 프로그램에서 필요한 부분만을 노출하거나, 관련된 내용들을 묶어서 관리하여 응집도가 높아져서 좋다.

다형성은 객체지향의 핵심적인 특징으로, 이를 통해 모듈화나 더 중요한 것에 집중하고 의존도를 관리하는 의존성 역전이 가능해진다.

 

 

객체 지향의 단점

일단 기본적으로 추상화와 인터페이스 개념들이 들어가게 되어 자칫하면 코드가 복잡해질 수 있다.

복잡해진다는 것은 코드양이 늘어나고 가독성이 좋지 않게 되고 오버헤드가 발생해 성능에 영향을 미칠 수도 있다.

 

 

 

참고

https://namu.wiki/w/%EA% B0% 9D% EC% B2% B4%20% EC% A7%80% ED%96% A5%20% ED%94%84% EB% A1% 9C% EA% B7% B8% EB% 9E%98% EB% B0%8D

 

객체 지향 프로그래밍 - 나무위키

프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨

namu.wiki

 

반응형