Language/JavaScript
[JS] OOP
오우영
2021. 2. 26. 10:53
OOP (Object Oriented Programming)
배경
- 초기의 프로그래밍 언어는 일반적으로 절차적 언어라고 불림 (C, 포트란 등)
- 절차적 언어는 순차적인 명령의 조합
- 단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어, 데이터의 접근과, 데이터의 처리 과정에 대한 모형을 만들어 내는 방식으로 바뀜
- 데이터와 기능이 별개로 취급되지 않고, 한번에 묶어서 처리가 가능해짐
특징과 의미
- 프로그램 설계 철학
- 모든 것은 '객체'로 그룹화 됨
- 재사용성을 얻을 수 있음
- 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론
클래스와 인스턴스
- 클래스는 일종의 원형(original form)으로, 객체를 생성하기 위한 청사진
- 인스턴스는 클래스의 사례
- 클래스는 객체를 만들기 위한 생성자(constructor) 함수를 포함합니다
- 생성자를 통해 세부 사항(속성)을 넣어줄 수 있습니다
속성과 메소드
- 자동차를 예로 든다면 속성은 색상, 가격, 속력과 같은 고유의 값을 말합니다
- 시작, 후진, 전진, 멈춤과 같이 자동차의 기능이 메소드로 존재합니다
OOP Basic Concepts
Encapsulation (캡슐화)
- 데이터와 기능을 하나의 단위로 묶는 것
- 은닉 : 구현은 숨기고, 동작은 노출
- 느슨한 결합(Loose Coupling)에 유리 : 언제든 구현을 수정할 수 있음
- 절차적 코드의 경우 데이터의 형태가 바뀔 때에 코드의 흐름에 큰 영향을 미치지만, 객체 지향의 경우 객체 내 메소드의 구현만 수정하고, 노출된 메소드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있습니다.
- 코드나 데이터의 은닉에 포커스가 맞춰짐
- 코드가 복잡하지 않게 만들고, 재사용성을 높임
Inheritance (상속)
- 기본 클래스(base class)의 특징을 파생 클래스(derive class)가 상속 받는 것
- 공통적으로 가지는 속성과 메소드를 기본 클래스로 정의하여 파생 클래스에 상속, 파생 클래스는 개별적인 속성, 메소드를 추가할 수 있음
- 불필요한 코드를 줄여 재사용성을 높임
Abstraction (추상화)
- 추상화를 통해 복잡한 내부 동작을 생각하지 않고 실제 사용하는 인터페이스를 단순화 할 수 있음
- 너무 많은 기능들이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있음
- 클래스를 사용하는 사람이 필요하지 않은 메소드 등을 노출시키지 않고 인터페이스를 단순화 시키는 것에 포커스가 맞춰짐
- 클래스 정의 시, 메소드와 속성만 정의한 것을 인터페이스라고 함 (이것이 추상화의 본질)
- 코드가 복잡하게 만들지 않고, 단순화된 사용으로 인해 변화에 대한 영향을 최소화
Polymorphism (다형성)
- 같은 기본 클래스를 상속받더라도 메소드가 조금씩 다르게 작동함
- 다형성을 제공하지 않는다면 기본 클래스에 종류별로 분기시켜 하나하나 다르게 만들어야 함
- 동일한 메소드에 대해 if/ else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해짐