컴퓨터가 만들어진 후 초창기 프로그램은 대부분이 Procedural 프로그래밍이었다. 그러나 시작부터 끝까지 모든 순서를 정의하기에는 경우의 수가 너무 많고 코드가 꼬이기 십상이다. 그래서 나온 개념이 바로 Object-oriented이다.
객체지향이란?
객체지향에 대한 명확한 정의를 딱 내리긴 어렵고 사람마다 다양한 관점이 있지만, 나는 다음과 같이 정의한다.
객체지향이란 객체들의 상호작용으로 프로그램을 구현하는 방법이다.
객체란 어떤 개념을 추상화하고 모델링한 요소이다.
객체에 대해 좀 더 설명하자면, 어떠한 개념을 추상화하고 모델링을 통해 만든 요소이다. 객체는 상태(state)와 행위(behavior)를 가지고 있으며 행위를 통해 상호작용한다.
Class vs Instance
class는 instance를 만들기 위한 설계도이며, instance는 class라는 설계도를 이용해 만들어진 메모리에 할당된 실체이다. 쉽게 비유하자면 class는 주형이며, instance는 주형으로 만든 물건이다.
객체지향의 특징
추상화 Abstraction
일반적으로 컴퓨터 과학에서 추상화라 함은 불필요한 정보(세부 구현 등)는 숨기고 중요한 정보만을 보여주는 것이다. 객체지향에서도 같은 의미를 띄고 있지만, 조금 더 풀어서 설명할 수 있다.
추상화는 객체를 만들 때 사용하는 개념으로, 일반화를 통해 공통된 속성과 행위를 추출하는 것이다. 불필요한 정보(객체마다 다른 특이한 정보)는 숨기고 중요한 정보(공통된 속성과 행위)를 상위 class로 추출하는 것이다.
이러한 개념에 따라서 객체들은 hierarchy를 가지게 된다. 더 일반화된 객체는 high level에 있게 되고, 세분화된 객체는 low level에 있게 된다.
예를 들어 자동차라는 일반화된 객체 아래에 현대 자동차, 기아 자동차, 포르쉐, 벤츠, ... 등등이 있는 것이다.
캡슐화 Encapsulation
변수와 함수를 class라는 하나의 단위로 묶는 것이다. 이렇게 함으로써 추가적으로 얻는 이점이 있는데, 바로 정보 은닉(Information Hiding)이다.
정보 은닉 Information Hiding
접근제어자(private, public, protected)를 통해 객체의 세부 구현을 외부로 드러나지 않도록 숨기는 것이다.
대표적으로 상태 정보인 attribute는 private를 이용해 숨기고, 객체의 동작인 method는 public을 이용해 공개하는 방식이다. class 내부가 어떻게 되어있는지는 알지 못하지만 method를 이용해 객체의 동작이나 상태 정보를 가져올 수 있다.
상속 Inheritance
존재하는 class로부터 새로운 class를 만드는 것이다. Inheritance를 통해 code reuse를 도모할 수 있다. 또한 상속받는 자식 클래스는 새로운 attribute나 method를 추가해 확장해 나갈 수 있으며 이를 통해 class hierarchy를 만들 수 있다.
다형성 Polymorphism
하나의 component(variable, method, class, ...)가 casting, overloading, 또는 overriding을 통해 상황에 따라 다르게 사용되는 것을 말한다.
static polymorphism (overloading)
이름은 같지만 method signature가 다르게 하여(parameter를 다르게 하여) 이름만 같은 함수로 사용하는 것이다. static binding이다.
dynamic polymorphism (overriding)
부모 class의 method를 자식 class에서 재정의하는 것이다. dynamic binding이다.
장단점
장점
- 코드 재사용성이 높아진다. abstraction으로 공통된 코드를 high level로 올리고 상속시키거나, inheritance를 통해 중복 코드를 상당히 줄일 수 있다. 동시에 코드 중복을 줄일 수 있다.
- 유지보수성이 높아진다. 객체를 통해 프로그램을 모듈화할 수 있기 때문에 분업하기 좋다.
단점
- 어렵다. inheritance, polymorphism 등을 고려해야 하기 때문에 설계 능력이 중요해지며 이를 잘못 구현할 경우 안 쓰니만 못하게 된다.
- 느리다. 각 객체들이 dependency가 있기 때문에 프로그램 실행 시 각 객체를 계속 찾아 줘야 한다.
'CS > OOP' 카테고리의 다른 글
[OOP] SOLID - Dependency Inversion Principle (0) | 2023.03.12 |
---|---|
[OOP] SOLID - Interface Segregation Principle (0) | 2023.03.11 |
[OOP] SOLID - Liskov Substitution Principle (0) | 2023.03.09 |
[OOP] SOLID - Open Closed Principle (0) | 2023.03.07 |
[OOP] SOLID - Single Responsibility Principle (0) | 2023.03.06 |