기타

디자인 원칙 - (feat. 캡슐화, 모듈화, 추상화, 은닉화)

인어공쭈 2024. 11. 19. 16:18

1. 캡슐화 (Encapsulation)

"데이터와 메서드를 묶고, 외부에선 숨긴다."

  • 정의: 객체의 상태(필드)와 동작(메서드)을 하나의 단위로 묶는 것. 외부에서는 객체 내부의 세부 구현을 보지 못하도록 숨기고, 필요한 인터페이스만 공개.
  • 목적: 데이터 무결성을 유지하고, 외부 코드와 내부 구현의 의존성을 줄임.
  • 예시:
class BankAccount {
    private balance: number = 0; // 외부에서 직접 접근 불가

    deposit(amount: number): void {
        if (amount > 0) this.balance += amount;
    }

    getBalance(): number {
        return this.balance; // 필요한 정보만 제공
    }
}

const account = new BankAccount();
account.deposit(100);
console.log(account.getBalance()); // 100

 

 

2. 모듈화 (Modularity)

"코드를 독립적인 블록으로 나눠서 관리."

  • 정의: 프로그램을 기능별로 분리해서 독립적인 모듈(파일, 클래스, 함수)로 나누는 것. 각 모듈은 독립적으로 동작하며, 다른 모듈과 최소한의 인터페이스로 소통.
  • 목적: 코드 재사용성, 가독성, 유지보수성 향상.
  • 예시:
    폴더 구조를 사용한 모듈화
/services
  - authService.ts
  - userService.ts
/models
  - userModel.ts
/controllers
  - userController.ts

// authService.ts
export function login(user: string, password: string): boolean {
    // 인증 로직
    return true;
}

// main.ts
import { login } from './services/authService';

login('admin', '1234'); // 모듈화된 기능 호출

 

 

3. 추상화 (Abstraction)

"필요한 것만 보여주고, 복잡한 세부 사항은 감춘다."

  • 정의: 복잡한 내부 구현은 감추고, 꼭 필요한 기능(행동)만 외부에 제공하는 설계 원칙.
    인터페이스나 추상 클래스 같은 도구를 사용해 "무엇을 할 수 있는지" 에만 집중하게 함.
  • 목적: 복잡성을 줄이고, 사용자는 인터페이스만 알면 되도록 설계.
  • 예시:
interface Payment {
    process(amount: number): void; // 구현 방식은 숨기고, 동작만 명시
}

class CreditCardPayment implements Payment {
    process(amount: number): void {
        console.log(`Paid ${amount} using Credit Card.`);
    }
}

class PayPalPayment implements Payment {
    process(amount: number): void {
        console.log(`Paid ${amount} using PayPal.`);
    }
}

function makePayment(paymentMethod: Payment, amount: number) {
    paymentMethod.process(amount); // 내부 로직은 신경 쓰지 않음
}

const payment = new CreditCardPayment();
makePayment(payment, 100); // "Paid 100 using Credit Card."

 

 

4. 은닉화 (Information Hiding)

"감춰야 할 건 철저히 숨긴다."

  • 정의: 객체의 내부 데이터나 구현 세부 사항을 외부에서 접근하지 못하도록 막는 개념.
    캡슐화와 밀접하게 관련 있지만, 은닉화는 "숨기기"에 더 초점.
  • 목적: 객체의 데이터를 보호하고, 외부 코드가 잘못된 방식으로 내부 상태를 변경하지 못하도록 방지.
  • 예시:
class Employee {
    private salary: number;

    constructor(initialSalary: number) {
        this.salary = initialSalary;
    }

    getSalary(): number {
        return this.salary; // 내부 데이터는 getter로만 노출
    }

    increaseSalary(amount: number): void {
        if (amount > 0) this.salary += amount; // 안전한 변경만 허용
    }
}

const emp = new Employee(5000);
console.log(emp.getSalary()); // 5000
emp.increaseSalary(1000);
console.log(emp.getSalary()); // 6000

 

 

개념 정의 초점 예시
캡슐화 데이터와 메서드를 묶고, 외부에서는 필요한 인터페이스만 제공 데이터와 동작의 묶음 private 필드와 public 메서드 사용
모듈화 기능을 독립적인 블록(모듈)으로 나눠서 관리 코드 분리와 재사용 서비스/컨트롤러/모델 분리
추상화 내부 구현을 숨기고, 사용자가 꼭 필요한 동작만 노출 복잡성 감소, 사용성 향상 인터페이스/추상 클래스 활용
은닉화 내부 데이터를 외부에서 직접 접근하지 못하도록 막음 데이터 보호 private 필드와 getter 사용

 

반응형

'기타' 카테고리의 다른 글

프로그래밍의 3대 원칙  (8) 2024.09.22
브라우저 랜더링 과정 - CRP(Critical Rendering Path)  (0) 2024.09.17
vscode Prettier 설정  (0) 2024.04.18
구글 계정 로그인 구현 (OAuth)  (0) 2023.06.22
웹팩(WebPack)이란?  (0) 2023.05.22