OOP (feat. 객체 지향 프로그래밍)

moono·2023년 1월 13일
0

JavaScript

목록 보기
19/23

객체 지향 프로그래밍(OOP)

(Object Oriented Programming)

절차 지향 프로그래밍객체 지향 프로그래밍
절차적 언어객체 지향 언어
초기의 C, 포트란 등현대의 언어 Java, C++, C#등
순차적인 명령의 조합(함수로 이동이 전부)클래스 라고 부르는 데이터 모델의 청사진을 사용해 코드 작성, 데이터와 기능을 한번에 묶어서 처리 가능

javascript 는 객체 지향 언어가 아니지만 객체 지향 패턴으로 작성 가능


OOP (Object Oriented Programming) 란?

  • 프로그래밍 설계 철학 중 하나
  • 모든 것은 객체 로 그룹화 됨
  • 한 번 만들고 나면 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지
  • 객체 내에는 '데이터와 기능이 함께 있다' 라는 원칙에 따라 메서드와 속성이 존재
  • 4가지 주요 개념을 통해 재사용성을 얻을 수 있음



OOP의 4가지 기본적인 개념


캡슐화(Encapsulation)

어떠한 클래스를 사용할 때 내부 동작이 어떻게 돌아가는지 모르더라도 사용법만 알면 쓸 수 있도록 클래스 내부를 감추는 기법
클로저랑 똑같은건데, 변화를 주려면 메소드를 쓰게 강제할 수 있음
코드가 복잡하지 않게 만들고 재사용성을 높임
코드나 데이터를 은닉하는데 중점

  • 데이터(속성)와 기능(메서드)을 하나의 객체 안에 묶는 것 (느슨하게 결합)

  • 느슨한 결합 은 코드 실행 순서에 따라 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미

  • 은닉화 특징 포함 : 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것
    ⇒ 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시켜야 함.
    ⇒ 특징 살려서 코드 작성하면 객체 내 메서드의 구현만 수정, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있고,

추상화(Abstraction)

단순화로 사용상의 변화가 일어나지 않게 만든다
필요하지 않은 메서드 등 노출x, 단순한 이름으로 정의하는 것에 중점
내부 구현은 아주 복잡, 실제 노출 부분(인터페이스)은 단순하게 만든다는 개념
캡슐화와 비슷하지만 중점으로 두고 있는 것이 다름
⇒ 복잡한 것을 숨기는

상속(Inheritance)

불필요한 코드를 줄여 재사용성을 높임
부모 클래스(기본 클래스) 의 특징을 자식 클래스(파생 클래스) 가 물려 받는 것
ex : 학생 클래스는 사람 클래스를 상속받지만 추가적으로 학습 내용, 공부하다 같은 속성/메서드를 추가할 수 있다.

다형성(Polymorphism)

조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능
다양한 형태 ⇒ 객체 역시 똑같은 메서드라도 다른 방식으로 구현될 수 있다.
다 같은 동물이라도 내는 소리가 다른 것 처럼
⇒ 어떤 건 같이 공유되는데 인스턴스 하나마다 고유의 뭔가를 가질 수 있다.



객체 지향 언어와 JS 의 차이점

Java, TypeScript처럼 JavaScript 와 다른 프로그래밍 언어가 가지고 있는 기능

은닉화(private)의 한계

Java나 TypeScript에는 클래스 내부에서만 쓰이는 속성, 메소드를 구분하기 위해 private 키워드를 제공한다.
⇒ JavaScript는 은닉화를 돕기 위해 일반적으로 클로저 모듈 패턴을 사용하고
클래스/인스턴스 형태로 만들 때는 ES2019부터 # 이라는 키워드가 도입되었다.

추상화(interface) 기능의 부재

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) {}
}
  • 인터페이스의 이점 : 인터페이스가 일종의 규약처럼 간주되어 인터페이스를 클래스로 구현하는 사람들이 이에 맞게 작성할 수 있게 돕는다.
    ⇒ 클래스를 이용하는 입장에서 노출된 인터페이스를 통해 이 클래스는 메서드 이름이 의도한대로 작동할 것이다 라는 것을 드러낸다. + 실질적인 구현 방법을 공개하지 않고, 사용법을 노출시키기 유리
    대표적인 예 : API(Application Programming Interface)

0개의 댓글