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 |