처음부터 차근차근

[OOP] 객체 지향 프로그래밍이란? 본문

Architecture pattern/Design Pattern

[OOP] 객체 지향 프로그래밍이란?

HangJu_95 2023. 10. 23. 22:38
728x90

객체 지향 프로그래밍(OOP)란?

컴퓨터 프로그램을 명령어릐 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것
- wikipedia

프로그램 구현에 필요한 객체를 파악하고, 각각의 객체들의 역할이 무엇인지 정의하여 객체들 간의 상호작용을 통해 만드는 것을 의미한다. 

즉, 객체가 중심이 되어, "어떤 객체가 무슨 일을 할 것인가??" 가 핵심이다.

 

우리가 사용하는 언어에서 간단히 표현하자면, 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 사용하는 방식을 의미한다.

왜 객체 지향 프로그래밍이 나왔을까?

Object-Oriented Programming 이전에는 명령어의 목록을 나열(절차 지향)하는 프로그래밍 방식을 사용하였다.

절차 지향 프로그래밍은 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있다.

절차 지향 프로그래밍을 사용하다 보면 코드가 길어지고, 길어지면 매우 알아보기 힘든 복잡한 코드로 형성된다.

이렇게 된다면 유지보수 하기 힘들어진다는 단점이 존재한다.

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

1. 추상화

추상 : 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것

 

OOP에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 뜻한다.

아래 그림과 같이 Vehicle을 추상화하여 Class를 형성했다고 볼 수 있다.

https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징

2. 상속 Inheritance

  • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
  • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것

상속은 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 가능들을 간편하게 사용할 수 있도록 한다.

즉, 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한번만 정의해두고 간편하게 재사용할 수 있다.

반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.

https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징

3. 다형성

다형성(多形性) : 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질

즉, 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성을 의미한다.

간단하게 얘기하면, 하나의 메서드나 클래스가 다양한 방법으로 동작하는 것을 의미하며, 대표적으로 Overriding과 Overloading이 존재한다.

  1. Overloading : 같은 이름을 가진 메서드를 여러 개 두는 것을 의미하며, 매서드의 타입, 매개변수의 유형, 개수 등으로 여러 개 둘 수 있으며 같은 이름을 경우에 따라 호출하여 사용하는 것을 의미한다. '정적' 다형성에 속한다.
  2. Overriding : 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의 하는 것을 의미한다. 이는 '동적' 다형성에 속한다.

4. 캡슐화(encapsulation)

클래스 안에 서로 연관되어 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것

  • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
  • 코드가 묶여있어서 오류가 없어 편리하다.
  • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
  • 데이터를 보이지 않고 외부와 상호작용을 할 때는 Method를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.

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

1. 소프트웨어의 생산성 향상

OOP는 다형성, 객체, 캡슐화 등 소프트웨어의 재사용성을 지향한다.

  • 신뢰성 있는 소프트웨어를 손쉽게 작성할 수 있다.(개발자가 만든 데이터를 사용하기 때문에 신뢰할 수 있다.)
  • 코드를 재사용하기 쉽다.(상속, 캡슐화, 다형성으로 인해 재사용할 수 있다.)
  • 업그레이드가 쉬우며, 디버깅 또한 쉽다.

2. 실세계에 대한 쉬운 모델링

현대 사회에서는 응용 소프트웨어를 하나의 절차로 모델링하기 어렵다.

따라서 OOP를 사용하면 실세계에 대한 모델링을 좀 더 쉽게 해준다.

3. 보안성 향상

캡슐화 특징으로 실제로 구현되는 부분을 외부로 드러나지 않도록 하여 정보를 은닉화 할 수 있다.

이는 보안성을 높여준다.(캡슐화, 데이터 은닉, 다형성으로 인해 필요한 정보를 재정의하거나, getter, setter를 이용하기 때문에 보안성이 매우 높다.)

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

느린 실행 속도

객체 지향 프로그래밍은 캡슐화와 격리구조에 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느리다.

또한, 객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 된다.

  • 절차지향 프로그래밍에 비해 느린 실행 속도
  • 필요한 메모리양의 증가

참조

http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5#h_5a0babb40166257dcefb9b03d29fad6d

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95