파이썬 python

OOP(Object Oriented Programming) - python

Aytekin 2021. 9. 13. 18:04
728x90
  • 객체지향프로그램(Object-Oriented Programming, OOP)이란?

먼저 세계에서 가장 유명한 사전인 위키백과에서 말하는 정의를 살펴보자.

 

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.

(출처 :위키백과https://ko.wikipedia.org/wiki/%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)

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러

ko.wikipedia.org

하나하나 문장들을 뜯어서 음미해보자.

 

"컴퓨터 프로그래밍의 패러다임 중 하나이다."

객체지향 프로그래밍의 시대적인 특징을 설명하고 있다.

패러다임이란 한 시대를 풍미하고 있는 보편적인 사고의 틀, 쉽게 말해서 현재 가장 영향력있는 사고방식이라고 이라고 이해해도 괜찮을 것 같다.

즉, 현재 프로그래밍에서의 패러다임은 OOP라는 소리이다.

한번씩 들어봤을 '패러다임의 전환'이 컴퓨터 프로그래밍이라는 세계에서 일어난 것 같다.

그렇다면 이전에는 무엇이 패러다임이었을까? 그리고 어떤 패러다임들이 있었을까?

 

프로그래밍 종류에는 크게 3가지가 있다.

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

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

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

이 세가지 방법중 어떤 방법이 가장 좋을까?

여기에 대한 답은 없다. 

어떤 프로젝트를 하느냐에 따라 가장 효율적이고 적합한 프로그래밍 방법을 정하는 것이 더 중요하다.

각각의 프로그래밍에 대해서 이해하기 보다 이런 것들이 있구나 하고 넘어간다 우선..

 

"컴퓨터 프로그램을 객체들의 모임으로 파악하고자 하는 것이다."

객체지향 프로그래밍의 가장 큰 특징을 이야기하고 있다.

말 그대로 객체들의 모임으로 컴퓨터 프로그래밍을 파악한다는 것이다.

그렇다면 여기서 말하는 객체(object)란 무엇일까?

 

일반적으로 객체는 말 그대로 어떠한 하나의 '대상'을 나타내는 단어이다.

예를들어 사람에도 개개인이 모두 성격과 외모가 다르므로 서로 다른 객체라고 할 수 있고

같은 내용을 가진 책이라도 책의 홈집이 있는지 없는지, 인쇄된 날짜가 언제인지에 따라서 다른 객체로 볼 수 있다.

 

그렇다면 OOP에서 말하는 '객체(=instance)'는 무엇일까?

클래스에 정의된 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터이다.

이를 이해하려면 먼저 클래스(class)에 대해서도 알아야 한다.

많은 책들이 이를 설명하기 위해서 붕어빵과 붕어빵을 찍는 기계에 비유를 하는데 붕어빵을 찍는 기계가 클래스라면 이 기계로부터 나오는 붕어빵들은 객체(instance)라는 것이다.

붕어빵기계에 있는 정해진 틀(클래스)을 통해서 객체에 해당하는 붕어빵들을 찍어낸다고 생각하면 된다.

 

우선 붕어빵 예시를 머리속에 넣어두고 oop에 대해서 조금만 더 자세하게 알아보자

OOP에는 4가지 중요한 특성이 있다. 

1. 캡슐화

2. 추상화

3. 상속

4. 다형성

 

1) 캡슐화

앞서 언급했었던 클래스를 캡슐이라고 다르게 표현했다고 이해해도 좋을 것 같다.

데이터 구조와 데이터를 다루는 방법들을 결합시겨 묶는 것이다.

캡슐화의 목적은 코드를 재수정 없이 재활용하기 위함이고

또 객체 내용중 숨기고 싶은 부분은 외부에서 접근이 불가능하도록 할 수도 있다.(정보은닉이 가능하다)

이 캡슐 안에는 생성될 인스턴스의 내용을 구성하는 변수(속성,attribute)와 함수(메서드,method)들이 있다.

 

코드를 재수정 없이 재활용한다는 측면에서 캡슐화는 변수와 함수들이 여기저기 분산이 되어있었을 때에는 해당 함수와 변수를 재활용하기에 어려웠으나 캡슐화를 통해서 기능과 특성들이 한곳에 모여있으므로 재활용이 원활해졌다.

정보은닉이 가능하다는 측면은 프로그램의 유지보수와 보안과 관련이 있다.

사용자가 클래스의 정해진 기능들만 사용하면 문제가 없는데 그 이외의 부분들도 건드리게 되서 프로그램 전체가 멈춰버릴 수 도 있기 때문이다.

예를 들어 사용자가 리모컨을 채널을 돌리고 볼륨을 조절할 때 잘 사용하기만 하면 문제가 없다. 사용자가 그 리모컨이 어떻게 작동되는지 매커니즘을 전부 이해할 필요는 없다.

 

2) 추상화

추상화는 목적과 관련이 없는 부분을 제거하여 필요학, 핵심적인 부분만을 표현하기 위한 개념이다.

예를 들어 등고선 지도와 일기를 나타내는 일기도는 둘다 모두 지도이지만 핵심적으로 표현해야 하는 부분은 다르다

등고선은 지형의 높낮이를 나타내야 한다면 일기도는 지형,지역의 날씨를 잘 나타내야 한다. 

이때 일기도에는 등고선이 필요 없으며, 반대로 등고선에는 강수량을 나타내는 부분이 필요 없다.

이와같이 추상화는 각 객체들의 핵심적 기능 혹은 개념을 파악해 정의해 놓은 것이라고 이해하면 된다.

 

3) 상속

말 그대로 상속받는 것, 부모로부터 물려받는 것을 의미한다.

부모클래스(상위클래스)로부터 자식클래스(하위클래스)에 함수나 속성들을 그대로 물려줄 수 있다.

예를 들어 고양이클래스, 강아지클래스 두개의 서로다른 클래스가 있다고 하자.

그리고 이들의 상위클래스(부모클래스)로 포유류클래스가 있다고 하자.

이 때 포유류클래스에 알을 낳지 않고 새끼를 낳는다는 특성이 있다면 이 특성은 그대로 자식클래스에게 물려주어(상속) 자식클래스에서는 직접 말하지 않아도 이 특성이 그대로 적용이 된다.

상속의 가장 큰 이유는 코드의 중복을 제거하기 때문이다.

 

4) 다형성

바로 앞서 얘기했던 상속에서 조금 더 생각해보자

고양이클래스에 '울음'이라는 속성이 정의되어있다고 하고, 사자는 고양이과에 속하기 때문에 고양이클래스를 상속받는다고 해보자.

고양이클래스에서 울음 속성을 "야옹~"이라고 정의했는데 그 자식클래스인 사자클래스에 "울음"속성을 그대로 "야옹~"이라고 해서는 않되지 않겠는가?

이때 필요한 것이 바로 다형성이다.

부모로부터 상속받은 속성에 대해서 자식 클래스에서 물려받은 속성을 재정의 할 수 있다.

이를 오버라이딩이라고도 하며 자식클래스에 상황에 맞게 속성,매서드를 커스터마이징 한다고 생각해도 된다

 

각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.

 

마지막으로 이 부분은 객체지향 프로그래밍의 장단점을 말하고 있다. 이를 정리해보자.

장점

- 유연성

- 유지보수에 좋다.

- 직관적 

단점

- 어렵다.

728x90