Back to the Basics

[Js/Node]객체지향 - 캡슐화와 정보은닉, 상속과 다형성 본문

Programming Languages/JavaScript & Node.js

[Js/Node]객체지향 - 캡슐화와 정보은닉, 상속과 다형성

9Jaeng 2021. 9. 3. 01:05
728x90

OOP Basic concepts

Application을 만들 때 객체지향을 이용하고 응용하면 좋은 설계를 할 수 있다.

객체지향 프로그래밍의 주요 컨셉으로는 크게 네 가지가 있다.

  1. 캡슐화 (Encapsulation)와 정보은닉 (Informaion Hiding)

우리는 객체의 생성을 위해 class를 디자인한다. 좋은 class를 만들기 위한 최소한의 조건은 정보은닉과 캡슐화이다.
정보은닉(Information Hiding)
정보은닉이란, 직접적으로 변경되면 안 되는 변수에 대한 접은을 오직 별도의 함수로 접근하도록 유도하는 것이다.
실수로 변수를 변경하려는 시도가 있을 때, 실수가 쉽게 발견되고 잘못된 값이 저장되지 않도록 제한된 접근 방법으로의 접근만 허용하는 방법이다.

캡슐화(Encapsulation)

캡슐화는 같은 기능을 하는 변수와 함수를 클래스로 묶는 것을 말한다. 캡슐화에는 위에서 설명한 정보은닉의 개념도 포함되어있다.
캡슐화는 쉽게 말해 같은 기능을 하는 애들을 감싸는 것인데, 이왕이면 안전하게 감싸기 위해 변수를 보이지 않게 감싸는 것이다.
캡슐화는 느슨한 결합을 한다 : 코드가 상징하는 실제 모습과 닮게 코드를 결합하는 것을 의미한다. 이 둘이 상호작용을 하긴 하지만, 서로 느슨하게 결합되어있어 의존성을 최소화한 것.
(강한 결합이란 클래스와 객체가 서로 의존적이라 객체가 변경될 시 클래스가 전체적으로 수정되어야 할 위험이 있다고 한다)
캡슐화는 코드를 단순하게 하고 재사용성을 높인다

캡슐화의 중요성을 수도 코드로 작성해 보겠다. (예전에 보던 책에서 캡슐화에 대한 재미있는 예제가 있어 인용하였다.)

// 코감기에 걸려 약을 복용하려고 한다 
// 코감기는 항상 콧물, 재채기, 코막힘 등을 동반한다.

// 콧물 처지용 캡슐을 클래스로 정의한다.
// 재채기 처지용 캡슐을 클래스로 정의한다.
// 코막힘 처치용 캡슐을 클래스로 정의한다.

// 코감기환자를 정의한다.
    // 코감기환자는 콧물 처치용 캡슐을 복용한다.
    // 코감기환자는 재채기 처치용 캡슐을 복용한다.
    // 코감기환자는 코막힘 처치용 캡슐을 복용한다.

// 코감기의 처치를 위해 캡슐을 순서대로 먹는다
    // 코감기환자는 콧물 처치용 캡슐을 복용한다.
    // 코감기환자는 재채기 처치용 캡슐을 복용한다.
    // 코감기환자는 코막힘 처치용 캡슐을 복용한다.

위의 예제는 캡슐화를 하지 않은 예제이다. 코감기가 걸리면 콧물, 재채기, 코막힘이 같이 동반하는데 이를 위해 세 개의 약을 전체 복용해야 한다.
만약 세 개의 캡슐이 하나의 캡슐로 되어있다면 복용하는 절차가 굉장히 단순화가 될 것이다. 마치 코감기에 걸리면 먹는 콘택 600처럼

아래 코드로 확인해보자


// 콧물 처지용 캡슐을 클래스로 정의한다. 
// 재채기 처지용 캡슐을 클래스로 정의한다. 
// 코막힘 처치용 캡슐을 클래스로 정의한다. 

// 콘택600 클래스를 정의한다
    // private 으로 변수를 선언한다
        // 콧물 처지용 캡슐 변수 선언
        // 재채기 처지용 캡슐 변수 선언
        // 코막힘 처지용 캡슐 변수 선언
    // public으로 호출한다
        // 콧물 처지용 캡슐 함수 실행
        // 콧물 처지용 캡슐 함수 실행
        // 콧물 처지용 캡슐 함수 실행

// 코감기환자를 정의한다
    // 코감기환자는 콘택600을 복용한다

// 코감기의 처치를 위해 콘택600을 복용한다

캡슐화를 함으로써 약의 복용이 간결해졌고 환자의 정의도 매우 간결해졌다.

하지만 캡슐화의 범위를 결정하는 일은 쉽지 않기 때문에 어렵다

  1. 추상화 (Abstraction)
  • 내부 구현은 복잡하지만 실제로 노출되는 부분은 단순하게 만드는 개념으로, 특성을 일반화하고 세부사항을 제거하여 단순하게 만드는 과정이다.
    A라는 사람 B라는 사람 C라는 사람을 "인간"이라고 하고 고양이, 사자, 개를 "동물"이라고 공통된 특성을 일반화하는 것이다.
  • 추상화를 통해 인터페이스가 단순해진다. 많은 기능들이 노출되지 않아서 예상치 못한 사용상의 변화가 일어나지 않도록 한다.
  • 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 집중한다.
  • 인터페이스 : 클래스 정의 시 메서드와 속성만 정의한 것을 인터페이스라고 부른다.
  1. 상속 (Inheritance) & 다형성

상속(Inheritance)
상속은 부모 class(base class)의 특징을 자식 class(derive class)가 물려받는 것이다.
상속은 불필요한 코드 사용을 줄요 재사용성을 높인다.

// class Human {
    // 속성
        // 나이, 성별, 이름
    // 메소드 
        // 자다, 먹다, 싸다
}

// class Student {
    // 속성
        // 나이, 성별, 이름 --> Human에서 상속
        // 학습내용 --> 추가속성
    // 메소드 
        // 자다, 먹다, 싸다 --> Human에서 상속
         // 공부하가 --> 투가 메소드

위와 같이 부모 클래스인 Human 클래스를 상속받고 속성/메서드를 추가할 수 있다.

다형성(Polymorphism)

다형성은 많은 형태를 가질 수 있는 능력을 의미한다. 객체들은 똑같은 메서드라고 해도 다른 방식으로 구현될 수 있다.
예를 들어, 플러스 연산자를 숫자 연산에서는 덧셈, 문자열 연산에서는 연결 연산자로 동작한다. 이렇듯 같은 메소드라고 해도 다른 방식으로 구현될 수 있는 것을 다형성이라고 한다.

728x90
Comments