[JavaScript] 객체 지향 프로그래밍

KIM DA MI·2023년 3월 15일
0

JavaScript

목록 보기
13/16
post-thumbnail

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


  • 객체 지향 프로그래밍 (Object Oriented Programming)
  • OOP는 프로그램 설계 철학이다.
  • 자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.
  • OOP의 모든 것은 '객체'로 그룹화된다.
    이 객체는 한번 만들고 나면, 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지된다.
  • 객체 내에는 "데이터와 기능이 함께 있다"라는 원칙에 따라 메서드와 속성이 존재한다.
  • OOP의 4가지 주요 개념을 통해 재사용성을 얻을 수 있다.



2. OOP의 주요 개념 4가지


  • 애플리케이션을 만들 때 좋은 설계를 하기 위해서는 기본적으로 이 객체지향을 이해하고 응용하는 것이 중요하다.
  • 크게 4가지의 기본적인 개념이 있으며, 다음과 같다.
    1. 캡슐화 (Encapsulation)
    2. 추상화 (Abstraction)
    3. 상속 (Inheritance)
    4. 다형성 (Polymorphism)

2-1. 캡슐화 (Encapsulation) 💊


데이터와 기능을 하나의 단위로 묶는 것

  • 데이터(속성)와 기능(메서드)을 따로 정의하는 것이 아닌 하나의 객체 안에 넣어서 묶는 것이다.

느슨한 결합

  • 위에 설명한 데이터와 기능이 느슨하게 결합된다.
  • 느슨한 결합 : 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
  • 예시) 마우스 구동을 위한 코드 작성 : 스위치가 눌리고, 전기 신호가 생겨서, 전선을 타고 흐르고... 와 같은 모든 과정을 이곳저곳에 나누어 작성하는 것이 아니라,
    마우스의 상태를 속성(property)로 정하고, 클릭과 이동을 메서드(method)로 정해서 코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법

은닉화

  • 캡슐화라는 개념은 은닉화의 특징도 포함하고 있다.
  • 은닉화 : 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다.
  • 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시킨다.



2-2. 추상화 (Abstraction) 🙂


단순화된 사용으로 변화에 대한 영향을 최소화

  • 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념이다.
  • 코드가 복잡하지 않게 만들고 단순화된 사용으로 변화에 대한 영향을 최소화한다.
  • 속성과 메서드의 이름만 노출시켜서 사용을 단순화한다는 의미를 갖고 있다.
    (너무 많은 기능들이 노출되지 않은 덕분에 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있다.)

인터페이스(interface)를 단순화

  • 클래스 정의 시, 메서드와 속성만 정의한 것. 이것이 추상화의 본질이다.
  • 예시) 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷 보드 등이 존재하는 등 내부 구현이 되어 있을 것이다. 그러나 실제로 우리가 사용할 때에는 이러한 존재에 대해서는 생각하지 않고 단순히 수화기를 들고 버튼을 눌러서 해결하는 것으로 인터페이스(interface)를 단순화 할 수 있다.



2-3. 상속 (Inheritance) 👨‍👩‍👧


부모 클래스의 특징을 자식 클래스가 물려 받는 것

  • 부모/자식으로 이야기하기도 하지만, 보다 그 특징을 자세하게 설명하는 용어는
    "기본 클래스(base class)의 특징을 파생 클래스(derived class)가 상속받는다"로 표현하는 것이 적합하다.
  • 불필요한 코드를 줄여 재사용성을 높인다.
  • 예시) 사람(Human)이라는 클래스가 있을 때, 사람은 기본적으로 이름과 성별, 나이와 같은 속성, 그리고 먹다, 자다 등과 같은 메서드가 있다고 볼 수 있다.
    추가적으로 학생(Student)이라는 클래스를 작성한다고 생각해보자. 이때 앞서 구현했던 사람(Human) 클래스의 속성과 메서드를 다시 구현한다면 비효율적일 것이다. 학생의 본질은 결국 사람이므로, 상속을 이용하여 학생(Student) 클래스는 사람(Human) 클래스를 상속받을 수 있다.
    학생은 추가적으로 학습 내용, 공부하다 와 같은 속성/메서드를 추가한다.



2-4. 다형성 (Polymorphism) 🌈


다양한 형태를 가질 수 있는 것

  • "말하다"라는 동작의 본질은 "입으로 소리를 내다"를 의미한다. 그러나, 각기 다른 동물들이 "말할 때" 제각각의 소리를 내는 것처럼, 객체 역시 똑같은 메서드라 하더라도, 다른 방식으로 구현될 수 있다.
  • 만일 언어 자체에서 다형성을 제공하지 않는다면, 기본(부모) 클래스에 종류별로 분기를 시켜서 하나하나 다르게 만들어야 할 것이다.
  • 다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신 객체의 특성에 맞게 달리 작성하는 것이 가능해진다.

0개의 댓글