(Object Oriented Programming)
절차 지향 프로그래밍 | 객체 지향 프로그래밍 |
---|---|
절차적 언어 | 객체 지향 언어 |
초기의 C, 포트란 등 | 현대의 언어 Java, C++, C#등 |
순차적인 명령의 조합(함수로 이동이 전부) | 클래스 라고 부르는 데이터 모델의 청사진을 사용해 코드 작성, 데이터와 기능을 한번에 묶어서 처리 가능 |
javascript 는 객체 지향 언어가 아니지만 객체 지향 패턴으로 작성 가능
객체
로 그룹화 됨어떠한 클래스를 사용할 때 내부 동작이 어떻게 돌아가는지 모르더라도 사용법만 알면 쓸 수 있도록 클래스 내부를 감추는 기법
클로저랑 똑같은건데, 변화를 주려면 메소드를 쓰게 강제할 수 있음
코드가 복잡하지 않게 만들고 재사용성을 높임
코드나 데이터를 은닉하는데 중점
데이터(속성)와 기능(메서드)을 하나의 객체 안에 묶는 것
(느슨하게 결합)
느슨한 결합
은 코드 실행 순서에 따라 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미
은닉화
특징 포함 : 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것
⇒ 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시켜야 함.
⇒ 특징 살려서 코드 작성하면 객체 내 메서드의 구현만 수정, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있고,
단순화로 사용상의 변화가 일어나지 않게 만든다
필요하지 않은 메서드 등 노출x, 단순한 이름으로 정의하는 것에 중점
내부 구현은 아주 복잡, 실제 노출 부분(인터페이스)은 단순하게 만든다는 개념
캡슐화와 비슷하지만 중점으로 두고 있는 것이 다름
⇒ 복잡한 것을 숨기는
불필요한 코드를 줄여 재사용성을 높임
부모 클래스(기본 클래스) 의 특징을 자식 클래스(파생 클래스) 가 물려 받는 것
ex : 학생 클래스는 사람 클래스를 상속받지만 추가적으로 학습 내용, 공부하다 같은 속성/메서드를 추가할 수 있다.
조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능
다양한 형태 ⇒ 객체 역시 똑같은 메서드라도 다른 방식으로 구현될 수 있다.
다 같은 동물이라도 내는 소리가 다른 것 처럼
⇒ 어떤 건 같이 공유되는데 인스턴스 하나마다 고유의 뭔가를 가질 수 있다.
Java, TypeScript처럼 JavaScript 와 다른 프로그래밍 언어가 가지고 있는 기능
Java나 TypeScript에는 클래스 내부에서만 쓰이는 속성, 메소드를 구분하기 위해 private 키워드를 제공한다.
⇒ JavaScript는 은닉화를 돕기 위해 일반적으로 클로저 모듈 패턴
을 사용하고
클래스/인스턴스 형태로 만들 때는 ES2019부터 #
이라는 키워드가 도입되었다.
Java나 TypeScript는 언어의 주요 기능으로 interface를 구현해 놓았다.
// TypeScript 문법입니다.
// TypeScript에서 interface 와 class 를 따로 정의한 예시
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}
class Clock implements ClockInterface {
currentTime: Date = new Date();
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) {}
}
이 클래스는 메서드 이름이 의도한대로 작동할 것이다
라는 것을 드러낸다. + 실질적인 구현 방법을 공개하지 않고, 사용법을 노출시키기 유리