객체 지향 프로그래밍이 등장하기 전엔 어떤 게 있었을까?
바로 절차 지향 프로그래밍이 있었다.
우리가 잘 알고 있는 C언어도 절차적 언어다. 순차적인 명령의 조합이라고 생각하면 된다.
그러나, 객체 지향 프로그래밍이 등장하면서…
별개의 변수와 함수로 순차적으로 작동하는 것을 넘어서서 데이터와 기능이 별개로 취급되지 않고, 한 번에 묶여서 처리할 수 있게 된 것이다.
이는 Java, C++, C# 등의 현대 언어에 적용됐는데 자바스크립트는 객체 지향 언어는 아니다! 그렇지만 객체 지향 패턴으로 작성이 가능한 언어다.
OOP(Object Oriented Programming 객체 지향 프로그래밍)
OOP는 프로그램 설계 철학 중 하나로, 객체로 그룹화된다. 한번 만들고 나면 메모리상에서 반환되기 전까진 객체 내의 모든 것이 유지된다.
데이터와 기능이 함께 있다는 특징이 있는데 이게 바로 앞서 배운 메서드(기능)와 속성(데이터)이다.
OOP 기본 개념
애플리케이션을 만들 때 좋은 설계를 하기 위해서 객체지향을 이해하고 응용하는 게 중요하다.
네 가지의 기본 개념 (특징 중 진한 글씨는 장점)
1. Encapsulation (캡슐화)
- 데이터와 기능을 느슨하게 결합(하나의 객체 안에 넣어서 묶음)
- 느슨한 결합이란? 코드 실행 순서에 따라 코드를 작성하는 게 아닌 코드가 상징하는 실제 모습과 닮게 코드를 모아서 결합하는 것
- “은닉화”(내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것) 특징을 가짐
- 코드가 복잡하지 않게 하고, 재사용성 높임
2. Inheritance (상속)
- 부모 클래스 특징을 자식 클래스가 물려받음
- 다른 말로는 “기본 클래스(base class)의 특징을 파생 클래스(derived class)가 상속받는다”고도 함.
- 불필요한 코드를 줄여 재사용성 높임
3. Abstraction (추상화)
- 내부 구현은 복잡하지만, 노출되는 부분은 단순하게
- 게임기의 내부는 복잡하지만 외부는 단순하게 버튼을 누르면 되는 것과 같음
- 캡슐화는 코드나 데이터의 은닉이 중요, 추상화는 클래스를 사용하는 사람한테 필요없는 메서드를 노출하지 않고 단순한 이름으로 정의한다는 것이 차이.
- 클래스 정의할 때, 메서드와 속성만 정의한 것이 ‘인터페이스’.
- 코드가 복잡하지 않게 하고, 단순화된 사용으로 변화에 대한 영향 최소화
4. Polymorphism (다형성)
- 많은 형태, 다양한 형태라는 뜻.
- 같은 이름의 메서도여도 조금씩 다르게 작동
- 다형성을 제공해야 종류별로 클래스를 또 만들지 않을 수 있음
- 동일한 메서드에 대해 if, else if 등의 조건문 대신에 객체 특성에 맞게 달리 작성할 수 있음
따라서 객체 지향 프로그래밍 패러다임은 사람이 세계를 보고 이해하는 방법과 매우 흡사하다. 하나의 요소를 객체 단위로 구분시켜서 코드를 작성하는 게 중요하다!