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

iberis2·2023년 1월 13일
0

<이전 업무 방식>
절차 지향 프로그래밍
top-down 방식 (전체를 기능에 따라 각 부분으로 나눈 뒤 각자 완성하여 합치는 방법)으로 업무를 구분하여 각자 기능을 완성시키고 합쳤다.

<단점>
1. 하나의 데이터가 여러 함수에서 사용되기도 하고, 어떤 데이터가 사용될 지 쉽게 예측할 수 없어, 코드 전체가 완성되지 않으면 동작을 제대로 확인해볼 수 없다
2. 하나의 기능이 미완성이거나 잘 못 됐을 경우, 연결된 다른 기능도 사용이 어렵다
3. 하나의 기능을 수정하려고 해도, 전체 코드를 점검해보아야 한다.


<객체 지향 프로그래밍>
Bottom-up 방식(작은 단위로 객체를 만들고 이를 이용해 큰 전체를 만듦)으로 바뀜
객체 : 기능(함수, 매서드)과 데이터(프로퍼티, 속성, 변수)를 함께 묶음
기능 뿐만아니라, 관련 있는 데이터도 함께 묶어서 업무를 구분함

<SNS 만들기 프로젝트 업무를 객체 지향 프로그래밍으로 나눈다면?>
사용자 객체 = {
  데이터 : 아이디 데이터, 비밀번호 데이터, 자기소개 데이터,
  기능 : 로그인 기능, 친구추가기능, 게시글 작성 기능,
}

게시글 객체 = {
 데이터 : 텍스트 내용 데이터, 업로드 시간 데이터, 좋아요 수 데이터,
 기능 : 게시글 작성 기능
}

장점

  • 유지 보수에 용이하다.
    데이터나 기능에 변화가 생기더라도, 관련된 객체만 신경을 쓰면 되니, 프로그래밍하기 훨씬 편하다.
  • 가독성이 높고, 재사용하기 좋다.
    조금 더 의미 있는 단위로 나누기 때문에, 코드를 이해하거나, 다른 프로그램에서 재사용하기에도 더 수월하다.
  • 꼭 전체가 완성되지 않아도 일부 기능만 사용해볼 수도 있기 때문에 테스트에도 더 유리하다.

단점

  • 코드를 잘 나누고 설계하는 것이 어렵다
    코드를 작성하기도 전에, 설계부터 많은 노력이 든다.

    • 따라서 굳이 객체 지향적으로 만들 필요가 없는 경우 (규모가 작아서 일을 나누지 않고 혼자 바로 만들어버릴 수 있는 경우, 데이터를 크게 신경 쓰지 않아도 되는 경우, 이후에 바뀔 염려가 거의 없는 경우 등) 이런 설계 과정 없이 그냥 바로 만들어버리는 게 더 빠르고 효율적이다.

    • 작은 규모의 프로그램 또는 극도로 빠르거나, 주어진 자원을 극도로 활용해야 하는 경우에는 좋지 않다.

    • 임베디드와 같은 특정 분야에는 부적합하다.
  • 객체 지향은 사람이 이해하고 작성하기 편한 방식으로 코드를 나눠는 것이다 보니, 컴퓨터가 이해하는데 시간이 걸려 실행하는 속도가 느려지거나, 저장 공간을 많이 차지하기도 한다.

객체 지향 프로그래밍

OOP : 객체 지향 프로그래밍(Object Oriented Programming)
자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.

OOP는 객체로 그룹화되어 나뉜다.
객체 내에는 데이터(속성)기능(함수, 매서드)가 함께 있다.

객체 지향 프로그래밍의 주요 개념

Encapsulation 캡슐화

캡슐화(Encapsulation)는 데이터(속성)기능(매서드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 느슨하게 결합되어 있는 것을 말한다.

  • 느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮도록 코드를 모아 결합하는 것을 의미한다.

캡슐화에는 은닉화의 특징도 포함되어 있다.

  • 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다.
    은닉화하여 코드를 잘 작성하면, 수정이 필요할 때 객체 내부의 메서드의 구현만 수정하고, 노출된 메서드를 사용하는 코드의 흐름은 바뀌지 않도록 만들 수 있다.
  • [참고하면 좋은 글] getter와 setter
    • getter와 setter를 이용해 프로퍼티를 은닉하면, 사용자가 해당 프로퍼티에 맞지 않는 값을 입력했을 때, 프로퍼티에 맞는 값으로 수정되도록 할 수도 있다.

Encapsulation 캡슐화의 장점

코드가 복잡하지 않게 만들고, 재사용성을 높인다.

Abstraction 추상화

추상화(Encapsulation) 복잡함 속에서을 필요한 핵심만 추출하여 단순하게 보여지게 하는 것을 말한다

  • 너무 많은 기능들이 노출되지 않도록 하여, 사용 도중 예기치 못한 변화가 발생하는 것을 막을 수 있다.
  • class를 사용하는 사람에게 필요하지 않은 매서드 등을 노출시키지 않는 것, 단순한 이름으로 정의하는 것 등
  • 클래스를 정의할 때 매서드와 속성만 정의한 것을 인터페이스라고 부르는데, 이것이 추상화의 본질이다.

Abstraction 추상화의 장점

코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향력을 최소화한다.

Inheritance 상속

상속(Inheritance)은 부모 클래스(=기본 클래스, base class)의 특징을 자식 클래스(=파생 클래스, derived class)가 물려받는 것이다.

  • 예를 들어, '사람 클래스'={properties: 이름, 성별, 나이, methods : 잠자기(), 먹기()}가 정의되어 있을 때,
    '학생 클래스'를 만든다면, 학생의 본질도 결국 사람이므로, 사람 클래스를 상속받아 만들 수 있다.
    '학생 클래스' = {properties: 이름, 성별, 나이, 소속 학교, methods: 잠자기(), 먹기(), 공부하기()}

Inheritance 상속의 장점

불필요한 코드를 줄여 재사용성을 높인다.

Polymorphism 다형성

다형성(polymorphism)은 같은 매서드이더라도 각 객체에 따라 다른 방식으로 구현될 수 있는 특징을 가리킨다.

[참고하면 좋은 글] 객체의 다형성을 확인할 수 있는 클래스 확장

Polymorphism 다형성의 장점

동일한 매서드에 대해 부모 클래스(객체)에서 if/else if와 같은 조건문을 사용하여 각 자식 클래스마다 매서드를 바꾸지 않아도 자식 클래스(객체)의 특성에 맞게 달리 작성하는 것이 가능해진다.

profile
React, Next.js, TypeScript 로 개발 중인 프론트엔드 개발자

0개의 댓글