OOP (Object Oriented Programming)

정현웅·2021년 2월 26일
1

OOP 란?

OOP. 즉, 객체지향 프로그래밍은 프로그래밍 설계 철학이다. OOP의 모든 것은 객체로 그룹화되며 이 객체는 한번 만들고 나면, 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지된다.
OOP가 등장하기 전에 절차지향 프로그래밍이 먼저 존재하였다. 절차지향 프로그래밍을 아주 간단하게 이야기하면, 특정 작업을 수행하기 위한 프로그램을 작성할 때, 정해진 절차에 순차적으로 맞춰 수행하는 것이다.
그러나 OOP가 등장함에 따라, 단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어 데이터의 접근과 데이터의 처리 과정에 대한 모형을 만들어 내는 방식을 고안한 것이다. 그러므로 데이터와 기능이 별개로 취급되지 않고, 한번에 묶어서 처리할 수 있게 된 것이다.
이러한 객체 지향의 특징은 빠르게 현대 언어에 적용이 되었으며, Javascript는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.


OOP의 4가지 주요 개념

1. 캡슐화 (Encapsulation)

  • 데이터와 기능을 하나의 단위로 묶는 것
  • 은닉 Hiding : 구현은 숨기고, 동작은 노출시킴
  • 느슨한 결합 Loose Coupling에 유리: 언제든 구현을 수정할 수 있음

캡슐화는 속성과 기능(메소드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것이다.

캡슐화라는 개념에는 "은닉화"의 특징도 포함하고 있는데, 은닉화는 내부 데이터나 내부 동작이 외부로 노출되지 않도록 만드는 것이다. 따라서, 디테일한 구현이나 데이터는 숨기고, 동작만 노출시켜야 한다. 또한, 캡슐화의 장점으로는, 느슨한 결합을 할 수 있게 돕는다.

절차적 코드의 경우 데이터의 형태가 바뀔 때에 코드의 흐름에 큰 영향을 미치지만, 객체 지향의 경우 객체 내 메소드의 구현만 수정하고, 노출된 메소드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있다.

2. 추상화 (Abstraction)

추상화는 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념이다.

예를 들어 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷 보드 등이 존재하는 등 내부 구현이 되어 있을 것이다.

그러나 실제로 우리가 사용할 때에는, 이러한 존재에 대해서는 생각하지 않고 단순히 수화기를 들고 버튼을 눌러서 해결하는 것으로 인터페이스(interface)를 단순화할 수 있다.

이러한 추상화를 통해 인터페이스가 단순해진다. 너무 많은 기능들이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있다.

추상화는 캡슐화와 비교해서 종종 헷갈려하는 개념 중 하나다.

캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고, 기능 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다.

클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 부른다. 이것이 추상화의 본질이다.

3. 상속 (Inheritance)

상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것이다.

부모/자식으로 이야기하기도 하지만, 보다 그 특징을 자세하게 설명하는 용어는 "기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속받는다"로 표현하는 것이 적합하다.

4. 다형성 (Polymorphism)

Polymorphism라는 단어의 poly는 "많은", 그리고 morph는 "형태"라는 뜻을 가지고 있다. 즉 "다양한 형태"를 가질 수 있다는 설명이 된다.

"말하다"라는 동작의 본질은 "입으로 소리를 내다"를 의미한다. 그러나, 각기 다른 동물들이 "말할 때" 제각각의 소리를 내는 것처럼, 객체 역시 똑같은 메소드라 하더라도, 다른 방식으로 구현될 수 있다.

만일 언어 자체에서 다형성을 제공하지 않는다면, 기본(부모) 클래스에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것이다.


정리

캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높인다.

추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 인해 변화에 대한 영향을 최소화한다

상속 역시 불필요한 코드를 줄여 재사용성을 높인다.

다형성으로 인해 동일한 메소드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해진다.

profile
이것저것 생각나는 대로.

0개의 댓글