객체지향 프로그래밍 (Object-Oriented Programming)
객체 지향 프로그래밍 (OOP) 는 프로그램 설계 방법론이자 개념의 일종으로. 특징은 다음과 같습니다.
프로그램을 수많은 ‘객체’ 라는 기본 단위로 나누고, 이 객체들의 상호작용으로 서술하는 방식으로.
객체 - 하나의 역할을 수행하는 메소드와 변수(데이터)의 묶음으로 봅니다.
즉, 개념적으로, 객체 = 메소드 + 변수 (데이터)
형태를 가집니다.
파이썬에서는 모든것이 객체로, 파이썬은 객체지향 언어의 대표적인 언어중 하나입니다.
절차적 프로그래밍
초기에 나온 프로그래밍 방식은, 절차 지향 혹은 절차적 프로그래밍으로. 명시된 순서대로 입력을 처리한다음, 결과를 내어주는 식으로 프로그램이 짜여 졌었습니다.
프로그램을 명령어들의 모음으로 인식하는것이 지배적이었으며. 프로그램의 기능에 더 치중하였고.
어떤 데이터를 취급할지에 대한 고민은 상대적으로 적게 하였습니다.
이 절차적 프로그래밍의 단점은 시간이 지나면서 부각되어 오기 시작하였는데.. 특히, 프로그램이 복잡해지면 질수록 드러나는 대표적인 단점은 아래와 같습니다.
- 프로그램이 복잡해 지면, 너무 많은 절차와 명령어들로 인해서 코드가 엉망이 될수가 있다
- 코드가 엉망이 되면, 유지보수가 힘들어 진다
- 프로그램 흐름을 파악하기가 힘들어 진다
- 네임스페이스 (이름공간) 구분이 어려워 진다
- 중복된 코드를 사용하게 될수 있다
- 함수를 통해 구조화는 가능하지만, 이는 데이터를 구조화 시킬수는 없다
이러한 단점들을 보안하기 위해서 나타난것이 바로 객체 지향 프로그래밍으로. 객체라는 작은 단위들로 쪼갠다음, 이 객체들을 조합하여 큰 문제도 해결할수 있는 방식으로 생각하여 만들어 졌습니다.
만들어진 객체는, 작은 문제들을 효과적으로 그리고 확실하게 해결할수 있는 단위들로. 한번 잘 만들어지면. 재사용할수 있다는점이 가장 큰 장점 입니다.
주요 특징
1. Encapulation (캡슐화)
변수와 함수를 하나의 단위로 묶는것을 의미. 데이터의 번들링으로. 보통 객체 지향 프로그래밍을 지원하는 언어들에서 class 라는 형태로 제공됩니다.
해당 클래스에 대한 인스턴스를 생성하고, 클래스에 포함된 변수와 메서드에 쉽게 접근할수 있습니다.
파이썬에서도, class 를 통해 인스턴스를 생성하고, 해당 클래스에 포함된 변수와 메서드에 접근할수 있습니다.
2. inheritance (상속)
상속은 자식 클래스가 부모 클래스의 특성과 기능을 물려받는 것을 의미합니다.
자식 클래스에서, 부모에게서 물려받은 기능을 약간 수정하여 다시 정의할수 있는데. 이를 override
, overriding
이라고 부릅니다.
장점과 단점
장점
- 아주 복잡한 프로그램일 경우, 절차 지향 프로그래밍 보다는 상대적으로 코드가 간결할수 있습니다
- 상속 개념을 너무 남발하는 경우가 아니고, 간결하고 명확하게 코드를 작성할 경우, 유지 보수가 용이해 질수 있습니다
- 네임스페이스 (이름공간) 구분이 용이해 질수 있습니다
- 코드의 재사용성을 높이고, 중복된 코드를 피할수 있습니다
단점
- 데이터 클래스의 상속이라는 개념은 뛰어나지만, 복잡한 특성을 지니게 해줍니다. 코드의 난이도가 어려워지는 함정이 존재합니다. 다중 상속을 할 경우, 코드 흐름을 파악하기 어려워지고, 복잡한 상속은 코드 분석을 매우 어렵게 합니다
- 캡슐화와 객체 구조 설계로 인해서 프로그램 성능이 하락할수 있습니다. 객체들간 상호 작용을 하기 위한 호출, 계산식 중간에 포인터 연산들이 더 들어가야 하고, 상호 작용을 위해서 어느 객체의 함수인지 지정해야 하기 때문에, 절차적 프로그래밍 보다는 프로그램이 무거워 질수 있습니다
- 이해하기가 어렵습니다. 특히 프로그래밍을 처음 접하는 상황에서는, 클래스와 객체 등, OOP 개념 이해조차 하기 힘듭니다. 클래스를 보통 붕어빵 틀로 설명을 하는데.. 학습을 어느정도 해도 이해하기 힘든 개념으로, 많은 프로그래머를 지향하는 사람들이 부딪히는 난관이 될수 있습니다.