OOP
- Object-Oriented Programming의 약자로 객체를 기반으로 프로그램을 만드는 방법론이다
- OOP는 실제 세상을 표현하고 이쓴ㄴ, 여러가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 컨샙의 프로그래밍 패러다임이다.
- 객체라는 개념은 실제 사물 하나하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스 (Class)라고 한다.
- 기존 방식은 데이터(변수)와 데이터를 처리하는 기능(함수)이 독립적이었다면, OOP는 이를 하나의 개념으로 묶어서 생각하기 때문에 그 객체가 처리되는 기능을 자연스럽게 정의 가능
- Class에는 Class를 기술하는 정보를 나타내는 변수인 Class variable과 Class의 특징을 설명하는 기능인 Class method를 포함한다.
- 추상적인 개념 Class를 실제로 사용하려면 하나 하나의 개별 사물로 만들어야 하는데, 이를 개별 사물인 객체라고 한다.
- OOP의 장점
- 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용이 쉬워진다. -> 생산성 향상
- 일상 생활에 존재하는 개념을 그대로 프로그램에 구현 가능하다 -> 자연적인 모델링
- 클래스의 상속의 개념 때문에, 프로그래밍 자체의 재사용성이 극대화된다. -> 재사용성 증가
- OOP를 이용하여 개발을 하게되면, 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향이 매우 적어질 수 있다. -> 유지보스 용이성 증가
1. 상속
- 클래스는 개념의 추상화이기 때문에, 해당 개념을 계승하는 하위 개념을 만들 수 있다.
- 상위/하위 개념이 상대적으로 존재하며, 상속하는 클래스는 superclass, 상속받는 클래스는 subclass라고 얘기한다.
- subclass는 superclass의 모든 개념을 이어받기 때문에, class variable, class method도 그대로 이어받는다
2. 다형성
- 여러 하위 클래스가 같은 class method를 상속받게 되면, 그 기능을 다르게 구현할 수 있다.
- 예를 들어 Animal 이라는 Class에 Speak()이라는 method가 있다면, 이 기능은 다른 동물을 표헌하는 subclass들마다 다르게 구현될 수 있다.
- 이렇게 하나의 기능을 나타내는 개념이 실제 구현해서 다양한 형태로 표현 가능한 것을 Polymorphism이라고 한다.
- 이러한 다형성을 구현할 수 있는 기능을 Method Overridning이라고 한다
3. 추상화
- Abstraction(추상화)는 Class 내부에 구현된 Class variable이나 Class method를 직접 보지 않아도 개념상으로 사용할 수 있게 하는 개념이다
- 기능에 대한 명세나 변수의 의미만 확실하게 알면, 내부 구현은 살펴보지 않아도 된다.
4. 은닉화
- Encapsulation은 Class variable과 Class method까지 단일 개념으로 구성되어 있어, 사용자가 개념 구현의 혼선을 막고 심플하게 사용할 수 있게 만드는 특징
- Encapsulation이 잘되면 사용자는 Class의 내부 구현 코드를 보지 않아도 내부 데이터와 기능을 사용하는데 아무런 문제가 없다.
- 우리가 사용해왔던 모든 함수들, Data type들의 내부 구현 코드를 보지 않아도 개념적으로 이해하고 사용할 수 있는 이유도 Encapsulation이 잘되기 때문이다.
- ex) list.append()
Class
- OOP에서 구현하려는 개념을 추상화한 코드 탬플릿
- Class를 이용해서 구현하려는 개념을 객체(object)의 형태로 찍어낼 수 있다.
- 구현하려는 대상의 특성을 Class variable로, 대상이 수행해야 하는 일을 Class method로 구현해야 한다.
- Constructor(생성자)를 통해서 객체를 찍어내는 틀을 정의할 수 있다.
- 생성자는 init() 함수를 이용하여 구현한다.
- 구현되는 객체는 self라는 자체 변수를 가집니다. self는 말 그대로 객체 자기 자신을 지칭한다.
- self 변수를 통해서 모든 객체는 자기 자신을 구분할 수 있다
- Class method도 self 변수를 이용하여 객체를 구분한다.
- self는 Class variable이기 때문에 하나의 Class내에서 통용된다
- Class도 역시 재사용성을 고려하여 디자인되어야 한다.
- Class로 구현할 때 제일 중요한 포인트는 "어떤 특성과 어떤 기능을 구현할 것인가"