[Javascript] OOP, 객체 지향 프로그래밍

SungWoo·2024년 10월 22일

자바스크립트 공부

목록 보기
9/42
post-thumbnail

자바스크립트는 명령형, 함수형, 프로토타입 기반, 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어이다. 하지만 C++이나 JAVA 등의 클래스 기반 객체지향 프로그래밍 언어와는 조금 다른 프로토타입 기반의 프로그래밍 언어이다. 프로토타입이라는 개념을 정리하기 전에 객체 지향 프로그래밍이 무엇인지에 대해 정리하고 넘어가도록 하자.

OOP(Object-Oriented Programming)

객체 지향 프로그래밍이란 소프트웨어 설계의 패러다임 중 하나로, 프로그램을 여러 개의 독립적인 객체로 구성하여 개발하는 방식

  • 객체 지향 프로그래밍은 객체의 상태를 나타내는 데이터(프로퍼티)와 상태 데이터를 조작할 수 있는 동작(메서드)을 하나의 논리적인 단위로 묶어서 사용한다.
  • 객체는 상태 데이터(프로퍼티)동작(메서드)을 하나의 논리적인 단위로 묶은 복합적인 자료구조이다.
  • OOP에서 객체는 애플리케이션의 빌딩 블록이며 서로 상호작용한다.
  • API를 통해 객체 외부의 코드와 상호작용한다.

Classes and Instance (Tranditional OOP)

1. Class

클래스는 객체를 생성하기 위한 청사진(템플릿)이다.

클래스는 프로퍼티와 메서드를 정의하여 어떤 종류의 객체가 만들어질지를 규정한다.

// Car 클래스 정의
class Car {
  constructor(brand, color) {
    this.brand = brand; // 속성
    this.color = color; // 속성
  }

  drive() { // 메서드
    console.log(`${this.brand} is driving.`);
  }
}

클래스에는 프로퍼티(변수)와 메서드(함수)가 정의된다. 여기서 프로퍼티는 객체가 가지는 데이터(ex. 자동차의 색상, 모델명)를 의미하고, 메서드는 객체가 수행할 수 있는 동작(ex. 운전하기, 멈추기 등)을 의미한다.

2. Instance

인스턴스는 클래스라는 설계도를 기반으로 만들어진 구체적인 '실체'를 의미한다.

  • 인스턴스는 클래스를 통해 실제로 만들어진 객체를 말한다.
  • 클래스를 바탕으로 new 키워드를 사용하여 인스턴스를 생성한다.
  • 여러 개의 인스턴스를 생성할 수 있으며, 각 인스턴스는 독립적인 프로퍼티를 가질 수 있다. 예를 들어, Car 클래스를 사용해 new Car('Kia', 'Red')로 만든 자동차 인스턴스는 Kia의 빨간색 자동차를 의미한다.
// Car 클래스의 인스턴스 생성
const myCar = new Car('Kia', 'Red');
const yourCar = new Car('Hyundai', 'Blue');

myCar.drive(); // "Kia is driving."
yourCar.drive(); // "Hyundai is driving."

OOP의 핵심 개념

1. 추상화(Abstraction)

핵심적인 부분만 드러내고 불필요한 세부 사항을 감추는 것

복잡한 시스템을 단순화하여 사용자에게 필요한 정보만을 제공하고 불필요한 내부 구현 세부 사항을 숨기는 것을 의미한다. 추상화는 소프트웨어를 설계할 때 복잡성을 줄이고, 사용자가 중요한 것에만 집중할 수 있도록 도와준다.

현실 세계에서 '자동차'를 예로 들면, 자동차를 운전할 때 '핸들 돌리기', '브레이크 밟기' 등의 기능을 사용하지만 기능을 사용할 때 내부에서 엔진이 어떻게 작동하고, 연료가 어떻게 연소되는지 알 필요가 없습니다. 즉 이러한 내부 작동 방식은 사용자에게 추상화된 것입니다.

2. 캡슐화(Encapsulation)

객체의 데이터(프로퍼티)와 그 데이터를 조작하는 메서드를 하나로 묶고 외부로부터 데이터를 보호하는 방법

정보 은닉(Information Hiding)

캡슐화는 객체의 내부 데이터를 외부에서 직접 접근하지 못하도록 막고, 데이터를 조작하는 메서드를 통해서만 접근할 수 있게 해줍니다. 이를 통해 객체의 무결성을 지킬 수 있습니다.

예를 들어, 은행 계좌 객체가 있다고 하면 잔액(balance) 데이터를 외부에서 수정할 수 없게하여 잘못된 값이 입력되는 일을 방지할 수 있습니다.

3. 상속(Inheritance)

하나의 클래스가 다른 클래스의 특성(프로퍼티와 메서드)을 물려받아 재사용하는 것.

상속을 통해 코드를 재사용할 수 있고, 기존의 클래스를 확장하여 새로운 기능을 추가하거나 수정할 수 있습니다.
부모 클래스와 자식 클래스를 정의하였을 때 자식 클래스는 부모 클래스의 프로퍼티와 메서드를 그대로 물려받아 사용할 수 있으며, 필요한 경우 이를 수정하거나 추가할 수도 있습니다.

이를 통해 코드 중복을 줄이고, 프로그램의 유지보수성과 확장성을 높일 수 있습니다.

4. 다형성(Polymorphism)

동일한 인터페이스(메서드)를 여러 객체가 각기 다른 방식으로 구현할 수 있는 능력

"연주하다"라는 동작으로 예를 들면, 악기마다 "연주하다"라는 동작은 같지만 피아노를 연주할 때와 기타를 연주할 때 나오는 소리는 다릅니다. 각각의 악기(객체)는 "연주하다"라는 명령을 받으면 자기만의 소리를 냅니다.

이와 비슷하게 프로그래밍에서도 다형성을 사용하면 같은 메서드를 호출하더라도 객체의 타입에 따라 다른 동작을 하도록 만들 수 있습니다.

profile
어제보다 더 나은

0개의 댓글