Home 객체 지향 프로그래밍
Post
X

객체 지향 프로그래밍

JS에서의 객체 지향 프로그래밍에 대해 알아보자.


객체 지향 프로그래밍 (Object Oriented Programming)

로직을 상태와 행위로 이루어진 객체로 만드는 것을 말합니다.
즉, 변수와 메서드를 그룹핑한 것입니다.

여러 객체들을 조립해 하나의 프로그램을 만드는 것을 OOP라고 합니다.
프로그램을 객체 단위로 쪼개서 개발할 수 있기 때문에 재사용성이 높고, 수정이 용이합니다.

Javascript는 객체 지향 언어는 아니지만, class 문법을 지원하기 떄문에 객체 지향 프로그래밍이 가능합니다.

반대 개념으로는, 절차적 프로그래밍 (Procedure Programming)이 있습니다.
함수를 이용해서 정리해 프로그래밍하는 기법입니다.
여러 함수들을 결합해서 큰 프로그램을 만드는 기법인데, 이는 어플리케이션이 복잡해지면서 한계가 나타나기 시작했고 현업에서는 OOP를 더 많이 사용하고 있습니다.
(거대한 규모의 어플리케이션은 OOP와 PP를 잘 융합해서 사용합니다.)

  • 간단 예제
    • 커피 자판기를 OOP와 PP로 만든다면?
      oop&PP

객체 지향의 5가지 원칙 (SOLID)

S : 단일 책임 원칙 (Single Responsibility Principle)

객체는 오직 하나의 책임을 가져야 한다.
(객체는 오직 하나의 변경 이유만을 가져야한다.)

클래스의 목적을 명확히 함으로써 구조가 난잡해지거나 수정 사항이 불필요하게 넓게 퍼지는 것을 예방하고 기능을 명확히 분리할 수 있게 한다.
(스파게티 코드가 될 수 있습니다.)


O : 개방 폐쇄 원칙 (Open Closed Principle)

객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다. 즉, 객체 기능의 확장을 허용하고 스스로의 변경은 피해야 한다.


L : 리스코프 치환 원칙 (Liskov Substitution Principle)

자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다. 즉, 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것입니다.

이를 지키지 않으면 부모 클래스 본래의 의미가 변해서 is-a 관계가 망가져 다형성을 지킬 수 없게 된다.


I : 인터페이스 분리 원칙 (Interface Segregation Principle)

클라이언트에서 사용하지 않는 메서드는 사용해선 안 된다. 즉, 인터페이스를 다시 작게 나누어 만든다.


D : 의존성 역전 원칙 (Dependency Inversion Principle)

추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안 된다.


객체 지향의 4가지 특성

추상화 (Abstraction)

객체 지향 프로그래밍의 추상화는 클래스를 정의할 때 중요한 것에 중점을 두어 모델화 하는 것을 말합니다.

  1. 제어 추상화
    제어 추상화란 사용자가 메서드 등을 이용할 때 내부 로직을 숨기는 것을 말합니다.
    내부 로직을 몰라도 사용자는 보다 빠르고 간단하게 프로그래밍을 할 수 있습니다.
    (라이브러리와 유사한 기능)
  2. 데이터 추상화
    데이터 추상화란 여러 객체를 일반화하는 과정을 말합니다.
    여러 객체들을 공통 특징으로 묶어 객체를 만들고 상위 객체부터 속성을 정의합니다.
    상위 객체부터 정의함에 따라 각각의 객체의 고유 기능 위주로 개발할 수 있습니다.
  • 간단 예제
    data-abstration
    공통 기능을 미리 개발해 두면, 상속을 통해 빠르게 구조를 확장 할 수 있습니다.

상속 (Inheritance)

객체의 로직을 그대로 물려 받는 또 하나의 객체를 만들 수 있는 기능을 말합니다.
기존의 로직을 수정하고 변경해서 파생된 새로운 객체를 만들 수 있게 해줍니다.

즉, 부모 클래스에 정의된 변수 및 메서드자식 클래스에서 상속받아 사용할 수 있습니다.


캡슐화 (Encapsulation)

프로그램의 내부 로직의 구현 내용을 외부로 드러나지 않도록 감추는 것을 말합니다.

클래스를 기준으로 보면, 클래스 외부에서는 바깥으로 노출된 특정 메서드에만 접근이 가능하고 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 합니다.

즉, 변수나 메서드들을 캡슐로 감싸서 안보이게 하는 정보 은닉 개념 중 하나입니다.


다형성 (Polymorphism)

객체의 메서드를 다양한(Poly) 형태(morph)로 변경해 사용할 수 있는 것을 말합니다.

예를 들어 클래스 동물에 소리를 내는 speak()라는 메서드는 강아지, 고양이 등의 여러 인스턴스 객체마다 다른 형태로 구현될 것입니다.

하나 더 예를 들면 클래스 도형에 넓이를 구하는 getArea()라는 메서드는 , 사각형 등의 인스턴스 객체마다 다른 형태로 구현될 것입니다.
(원은 반지름 X 반지름 X 원주율, 사각형은 가로 X 세로)

즉, 동일한 메서드라고 하더라도 개별 인스턴스에 따라 다양한 형태를 가질 수 있는 것을 다형성이라고 합니다.

  • 다형성 방법
    • 오버로딩 (Overloading) 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 정의하는 것입니다.
    • 오버라이딩 (Overriding) 부모 클래스로부터 상속받은 메서드 내용을 변경하여 사용하는 것입니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.