Post

πŸ₯” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 3μš”μ†Œ 5원칙

πŸ₯” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 3μš”μ†Œ 5원칙

πŸ“šΒ κ°μ²΄ μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 3μš”μ†Œ

1. μΊ‘μŠν™” (Encapsulation)

데이터(속성)와 이λ₯Ό λ‹€λ£¨λŠ” κΈ°λŠ₯(λ©”μ„œλ“œ)을 ν•˜λ‚˜μ˜ λ‹¨μœ„(객체 λ˜λŠ” 클래슀)둜 λ¬Άκ³ , μ™ΈλΆ€μ—μ„œλŠ” λ‚΄λΆ€μ˜ ꡬ체적인 κ΅¬ν˜„μ„ μˆ¨κΈ°λŠ” 것.

  • μ™œ ν•„μš”ν•œκ°€?
    • 데이터 보호: 객체 λ‚΄λΆ€μ˜ 데이터가 μ™ΈλΆ€μ—μ„œ 직접 λ³€κ²½λ˜μ§€ μ•Šλ„λ‘ 함.
    • μΈν„°νŽ˜μ΄μŠ€ 제곡: μ™ΈλΆ€μ—λŠ” ν•„μš”ν•œ κΈ°λŠ₯만 λ…ΈμΆœν•˜μ—¬ μ‚¬μš©λ²•μ„ λ‹¨μˆœν•˜κ²Œ λ§Œλ“¦.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Counter {
	// #countλŠ” private ν•„λ“œλ‘œ, 클래슀 μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•  수 μ—†μ–΄μ„œ λ‚΄λΆ€ 데이터 보호(μΊ‘μŠν™”)됨.
	// '#'λ₯Ό 뢙이면 μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•  수 없도둝 함. (ES2021λΆ€ν„° 지원)
	#counter = 0;
	
  // public λ©”μ„œλ“œ: 클래슀 μ™ΈλΆ€μ—μ„œ 호좜 κ°€λŠ₯ν•œ ν•¨μˆ˜λ“€
  // 외뢀에 μ œκ³΅ν•˜λŠ” "μΈν„°νŽ˜μ΄μŠ€" 역할을 함.
  
  // count 값을 1 μ¦κ°€μ‹œν‚€λŠ” λ©”μ„œλ“œ
  increment() {
    this.#count++;
  }

  // count 값을 λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ
  getCount() {
    return this.#count;
  }
}

const counter = new Counter(); // Counter 클래슀의 객체(μΈμŠ€ν„΄μŠ€) 생성
counter.increment; // 객체의 public λ©”μ„œλ“œ 호좜 β†’ λ‚΄λΆ€μ˜ #count 값이 1 증가
console.log(counter.getCount()); // 객체의 public λ©”μ„œλ“œλ₯Ό 톡해 λ‚΄λΆ€ κ°’ 쑰회 β†’ 좜λ ₯: 1

2. 상속 (Inheritance)

κΈ°μ‘΄ 클래슀(λΆ€λͺ¨ 클래슀, 슈퍼클래슀)의 νŠΉμ„±κ³Ό κΈ°λŠ₯을 μƒˆ 클래슀(μžμ‹ 클래슀, μ„œλΈŒν΄λž˜μŠ€)κ°€ λ¬Όλ €λ°›μ•„ μž¬μ‚¬μš© 및 ν™•μž₯ν•˜λŠ” 것.

  • μ™œ ν•„μš”ν•œκ°€?
    • μ½”λ“œ μž¬μ‚¬μš©: κ³΅ν†΅λœ κΈ°λŠ₯을 λΆ€λͺ¨μ— μž‘μ„±ν•˜μ—¬ μ—¬λŸ¬ μžμ‹ ν΄λž˜μŠ€μ—μ„œ 곡유.
    • 계측 ꡬ쑰 ν‘œν˜„: β€œAλŠ” B이닀.” λΌλŠ” 관계λ₯Ό μžμ—°μŠ€λŸ½κ²Œ λͺ¨λΈλ§.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(`${this.name}이(κ°€) μ†Œλ¦¬λƒ…λ‹ˆλ‹€.`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name}이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€.`);
  }
}

const dog = new Dog("바둑이");
dog.speak(); // "바둑이이(κ°€) 멍멍 μ§–μŠ΅λ‹ˆλ‹€."

3. λ‹€ν˜•μ„± (Polymorphism)

같은 λ©”μ‹œμ§€(λ©”μ„œλ“œ 호좜)에 λŒ€ν•΄ μ—¬λŸ¬ 객체가 각자의 λ°©μ‹μœΌλ‘œ λ°˜μ‘ν•  수 μžˆλŠ” λŠ₯λ ₯. 주둜 λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)을 톡해 κ΅¬ν˜„λ¨.

  • μ™œ ν•„μš”ν•œκ°€?
    • μ½”λ“œμ˜ μœ μ—°μ„±: λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ μ—¬λŸ¬ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό λ‹€λ£° 수 있음.
    • μΈν„°νŽ˜μ΄μŠ€ 톡일: λ™μΌν•œ λ©”μ„œλ“œ μ΄λ¦„μœΌλ‘œ λ‹€μ–‘ν•œ κ΅¬ν˜„μ„ μ œκ³΅ν•˜μ—¬ 일관성 μžˆλŠ” μ½”λ“œ μž‘μ„±.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Shape {
  draw() {
    console.log("λ„ν˜•μ„ κ·Έλ¦½λ‹ˆλ‹€.");
  }
}

class Circle extends Shape {
  draw() {
    console.log("원을 κ·Έλ¦½λ‹ˆλ‹€.");
  }
}

class Rectangle extends Shape {
  draw() {
    console.log("μ‚¬κ°ν˜•μ„ κ·Έλ¦½λ‹ˆλ‹€.");
  }
}

const shapes = [new Circle(), new Rectangle()];
shapes.forEach(shape => shape.draw());
// 좜λ ₯:
// "원을 κ·Έλ¦½λ‹ˆλ‹€."
// "μ‚¬κ°ν˜•μ„ κ·Έλ¦½λ‹ˆλ‹€."

πŸ“šΒ SOLID 5원칙 (객체 μ§€ν–₯ 섀계 원칙)

SOLIDλŠ” 쒋은 객체 μ§€ν–₯ 섀계λ₯Ό μœ„ν•œ λ‹€μ„― κ°€μ§€ 원칙을 λ§ν•œλ‹€.

1. 단일 μ±…μž„ 원칙 (Single Responsibility Principle, SRP)

πŸ˜ΌΒ ν•œ ν΄λž˜μŠ€λŠ” ν•œ κ°€μ§€ μ±…μž„(λ˜λŠ” κΈ°λŠ₯)만 κ°€μ Έμ•Ό ν•œλ‹€.

  • μ™œ ν•„μš”ν•œκ°€?
    • μ½”λ“œ μœ μ§€λ³΄μˆ˜ 용이: ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ ν•œ κ°€μ§€ μ—­ν• λ§Œ ν•˜λ―€λ‘œ λ³€κ²½ μ‹œ 영ν–₯이 μ΅œμ†Œν™”λ¨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// μ•ˆ 쒋은 예: ν•œ ν΄λž˜μŠ€κ°€ 데이터 μ²˜λ¦¬μ™€ λ‘œκΉ…μ„ λͺ¨λ‘ 함
class UserManager {
  createUser(user) {
    // μ‚¬μš©μž 생성 둜직
  }
  log(message) {
    // 둜그 기둝 둜직
  }
}

// 쒋은 예: 역할을 뢄리
class UserManager {
  createUser(user) {
    // μ‚¬μš©μž 생성 둜직
  }
}

class Logger {
  log(message) {
    // 둜그 기둝 둜직
  }
}

2. 개방-폐쇄 원칙 (Open-Closed Principle, OCP)

πŸ˜ΌΒ μ†Œν”„νŠΈμ›¨μ–΄ ꡬ성 μš”μ†Œ(클래슀, λͺ¨λ“ˆ λ“±)λŠ” ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³ , μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.

  • μ™œ ν•„μš”ν•œκ°€?
    • μ•ˆμ •μ„± μœ μ§€: 기쑴에 잘 λ™μž‘ν•˜λ˜ μ½”λ“œμ— 손을 λŒ€μ§€ μ•ŠμœΌλ―€λ‘œ, μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œμ—μ„œ 버그가 생길 μœ„ν—˜μ΄ 쀄어든닀.
    • μœ μ—°ν•œ ν™•μž₯: μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ, 기쑴의 μ½”λ“œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€μ–΄ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// 1. κΈ°λ³Έ 할인 계산기 (κΈ°λ³Έ λ™μž‘: 할인 μ—†μŒ)
class DiscountCalculator {
  calculate(price) {
    // 할인 μ—†μŒ β†’ μ›λž˜ 가격 λ°˜ν™˜
    return price;
  }
}

// 2. νΌμ„ΌνŠΈ(%) 할인 μ •μ±…: DiscountCalculatorλ₯Ό ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
class PercentageDiscount extends DiscountCalculator {
  constructor(percentage) {
    super(); // λΆ€λͺ¨ 클래슀의 μƒμ„±μž 호좜
    this.percentage = percentage; // ν• μΈμœ¨ (예: 10% β†’ 10)
  }
  
  // κΈ°μ‘΄ calculate λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)
  calculate(price) {
    // μ›λž˜ κ°€κ²©μ—μ„œ percentage만큼 ν• μΈν•œ 가격 계산
    return price - (price * this.percentage / 100);
  }
}

// 3. κ³ μ • κΈˆμ•‘ 할인 μ •μ±…: μ—­μ‹œ DiscountCalculatorλ₯Ό ν™•μž₯
class FixedDiscount extends DiscountCalculator {
  constructor(amount) {
    super();
    this.amount = amount; // 할인 κΈˆμ•‘ (예: 15원 할인)
  }
  
  calculate(price) {
    // μ›λž˜ κ°€κ²©μ—μ„œ κ³ μ • κΈˆμ•‘ 만큼 할인
    return price - this.amount;
  }
}

// 4. 할인 적용 ν•¨μˆ˜: 할인 μ •μ±…(DiscountCalculator)을 인자둜 λ°›μ•„ 계산
function applyDiscount(price, discountCalculator) {
  return discountCalculator.calculate(price);
}

// μ‚¬μš© 예제:
const price = 100;
const noDiscount = new DiscountCalculator();         // 할인 μ—†μŒ
const percentageDiscount = new PercentageDiscount(10); // 10% 할인
const fixedDiscount = new FixedDiscount(15);           // 15원 할인

console.log(applyDiscount(price, noDiscount));         // 100 좜λ ₯
console.log(applyDiscount(price, percentageDiscount));   // 90 좜λ ₯ (100 - 10%)
console.log(applyDiscount(price, fixedDiscount));        // 85 좜λ ₯ (100 - 15)

3. λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (Liskov Substitution Principle, LSP)

πŸ˜ΌΒ λΆ€λͺ¨ 클래슀의 객체λ₯Ό μžμ‹ 클래슀의 객체둜 λŒ€μ²΄ν•΄λ„ ν”„λ‘œκ·Έλž¨μ˜ 정상적인 λ™μž‘μ΄ μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€.

  • μ™œ ν•„μš”ν•œκ°€?
    • λ‹€ν˜•μ„±κ³Ό μƒμ†μ˜ 신뒰성을 보μž₯ν•˜μ—¬, μ½”λ“œ μž¬μ‚¬μš©κ³Ό ν™•μž₯이 μš©μ΄ν•΄μ§.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Bird {
  fly() {
    console.log("λ‚ κ°œλ‘œ λ‚ λ‹€");
  }
}

class Eagle extends Bird {
  // Eagle은 Birdλ₯Ό 상속받아 fly()λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©
}

function letBirdFly(bird) {
  bird.fly();
}

const eagle = new Eagle();
letBirdFly(eagle); // μ •μƒμ μœΌλ‘œ "λ‚ κ°œλ‘œ λ‚ λ‹€" 좜λ ₯
// λ§Œμ•½ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨μ˜ κΈ°λŠ₯을 κΉ¨λœ¨λ¦°λ‹€λ©΄ LSP μœ„λ°˜!

4. μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (Interface Segregation Principle, ISP)

πŸ˜ΌΒ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ―€λ‘œ, νŠΉμ • ν΄λΌμ΄μ–ΈνŠΈμ— 맞게 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 뢄리해야 ν•œλ‹€.

  • μ™œ ν•„μš”ν•œκ°€?
    • λΆˆν•„μš”ν•œ λ©”μ„œλ“œ κ΅¬ν˜„ κ°•μš”λ₯Ό ν”Όν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•„μš”ν•œ κΈ°λŠ₯만 μ‚¬μš©ν•˜λ„λ‘ 함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// μ•ˆ 쒋은 예: ν•˜λ‚˜μ˜ 객체에 λ„ˆλ¬΄ λ§Žμ€ 역할을 λΆ€μ—¬
class MultiFunctionPrinter {
  print() { /* ... */ }
  scan() { /* ... */ }
  fax() { /* ... */ }
}

// 쒋은 예: 역할에 따라 μΈν„°νŽ˜μ΄μŠ€(κΈ°λŠ₯)λ₯Ό 뢄리
class Printer {
  print() { /* ... */ }
}

class Scanner {
  scan() { /* ... */ }
}

5. 의쑴 μ—­μ „ 원칙 (Dependency Inversion Principle, DIP)

πŸ˜ΌΒ κ³ μˆ˜μ€€ λͺ¨λ“ˆ(λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)은 μ €μˆ˜μ€€ λͺ¨λ“ˆ(μ„ΈλΆ€ κ΅¬ν˜„)에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , λ‘˜ λ‹€ 좔상화(μΈν„°νŽ˜μ΄μŠ€)에 μ˜μ‘΄ν•΄μ•Ό ν•œλ‹€.

  • μ™œ ν•„μš”ν•œκ°€?
    • μœ μ—°μ„± ν–₯상: κ³ μˆ˜μ€€ λͺ¨λ“ˆμ΄ ꡬ체적인 μ €μˆ˜μ€€ κ΅¬ν˜„μ— μ˜μ‘΄ν•˜μ§€ μ•ŠμœΌλ©΄, μ €μˆ˜μ€€ λͺ¨λ“ˆμ„ λ³€κ²½ν•˜κ±°λ‚˜ ꡐ체할 λ•Œ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ„ μˆ˜μ •ν•  ν•„μš”κ°€ μ—†λ‹€.
    • μž¬μ‚¬μš©μ„± 증가: 좔상화에 μ˜μ‘΄ν•˜λ©΄ λ‹€μ–‘ν•œ ꡬ체 클래슀(μ €μˆ˜μ€€ λͺ¨λ“ˆ)λ₯Ό μ‰½κ²Œ ꡐ체할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‘œκΉ… 방법을 λ³€κ²½ν•  λ•Œ κ³ μˆ˜μ€€ μ½”λ“œ(예: μ‚¬μš©μž μ„œλΉ„μŠ€)λŠ” λ³€κ²½ 없이 μƒˆλ‘œμš΄ 둜거만 μ£Όμž…ν•˜λ©΄ 됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// 1. 좔상화 역할을 ν•˜λŠ” Logger "μΈν„°νŽ˜μ΄μŠ€"
// μ‹€μ œλ‘œλŠ” 좔상 클래슀처럼 λ™μž‘ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ 돼.
class Logger {
  log(message) {
    // μ‹€μ œ κ΅¬ν˜„μ€ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ œκ³΅ν•΄μ•Ό 함.
    throw new Error("log() λ©”μ„œλ“œλŠ” κ΅¬ν˜„λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.");
  }
}

// 2. μ €μˆ˜μ€€ λͺ¨λ“ˆ: μ½˜μ†”μ— 둜그λ₯Ό 좜λ ₯ν•˜λŠ” ꡬ체적인 Logger κ΅¬ν˜„
class ConsoleLogger extends Logger {
  log(message) {
    console.log("ConsoleLogger:", message);
  }
}

// 3. κ³ μˆ˜μ€€ λͺ¨λ“ˆ: μ‚¬μš©μž κ΄€λ ¨ λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” UserService
// 이 ν΄λž˜μŠ€λŠ” ꡬ체적인 둜거(ConsoleLogger)에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , LoggerλΌλŠ” 좔상화에 μ˜μ‘΄ν•¨.
class UserService {
  // μƒμ„±μžμ—μ„œ Logger(좔상화)λ₯Ό μ£Όμž…λ°›μŒ.
  constructor(logger) {
    // loggerλŠ” λ°˜λ“œμ‹œ Logger νƒ€μž…(λ˜λŠ” Loggerλ₯Ό κ΅¬ν˜„ν•œ 객체)이어야 함.
    this.logger = logger;
  }
  
  createUser(user) {
    // μ‚¬μš©μž 생성 둜직 (예: λ°μ΄ν„°λ² μ΄μŠ€ μ €μž₯ λ“±)
    // ...
    // μƒμ„±λœ ν›„ 둜그 기둝
    this.logger.log(`μ‚¬μš©μž ${user} 생성됨`);
  }
}

// 4. μ‚¬μš© 예제
// μ—¬κΈ°μ„œ ConsoleLoggerλ₯Ό μƒμ„±ν•˜κ³ , UserService에 μ£Όμž…(μ˜μ‘΄μ„± μ£Όμž…)함.
const logger = new ConsoleLogger();
const userService = new UserService(logger);

// UserServiceλŠ” λ‚΄λΆ€μ—μ„œ μ–΄λ–€ ꡬ체 둜거λ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ λͺ°λΌλ„, 단지 logger.log()λΌλŠ” μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€λ§Œ μ‚¬μš©ν•¨.
userService.createUser("Alice");  // 좜λ ₯: "ConsoleLogger: μ‚¬μš©μž Alice 생성됨"

ν•­λͺ©μ„€λͺ…μ˜ˆμ‹œ μ½”λ“œ λΆ€λΆ„
좔상화 (μΈν„°νŽ˜μ΄μŠ€)κ³ μˆ˜μ€€ λͺ¨λ“ˆκ³Ό μ €μˆ˜μ€€ λͺ¨λ“ˆ λͺ¨λ‘κ°€ μ˜μ‘΄ν•˜λŠ” 계약. ꡬ체 κ΅¬ν˜„ 없이 κΈ°λŠ₯의 ν‹€λ§Œ μ •μ˜class Logger { log(message) { ... } }
μ €μˆ˜μ€€ λͺ¨λ“ˆκ΅¬μ²΄μ μΈ κ΅¬ν˜„μ„ λ‹΄λ‹Ήν•˜λŠ” 클래슀. 좔상화에 따라 κ΅¬ν˜„λ¨class ConsoleLogger extends Logger { ... }
κ³ μˆ˜μ€€ λͺ¨λ“ˆν•΅μ‹¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λ©°, μΆ”μƒν™”μ—λ§Œ μ˜μ‘΄ν•˜λŠ” 클래슀class UserService { constructor(logger) { ... } }

좔상화(Abstraction)λŠ” λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ΄λ‚˜ κ°μ²΄μ—μ„œ ν•„μš”ν•œ 핡심 κΈ°λŠ₯만 λ…ΈμΆœν•˜κ³ , μ„ΈλΆ€ κ΅¬ν˜„μ€ κ°μΆ”λŠ” κ°œλ…μ΄λ‹€.
μΆ”μƒν™”μ˜ λͺ©μ : μ‚¬μš©μž(개발자)κ°€ λ³΅μž‘ν•œ λ‚΄λΆ€ λ™μž‘μ„ μ‹ κ²½ μ“°μ§€ μ•Šκ³ , κ°„λ‹¨ν•œ μΈν„°νŽ˜μ΄μŠ€(μ‚¬μš©λ²•)만 보고 μ‚¬μš©ν•  수 있게 λ§Œλ“œλŠ” 것.
μ˜ˆμ‹œ: μžλ™μ°¨λ₯Ό μš΄μ „ν•  λ•Œ, μš΄μ „μžλŠ” μ—”μ§„ λ‚΄λΆ€μ˜ λ³΅μž‘ν•œ μž‘λ™ 원리λ₯Ό λͺ°λΌλ„ ν‚€λ₯Ό 돌리면 μ°¨κ°€ μΆœλ°œν•˜λŠ” 것과 κ°™λ‹€. μ—¬κΈ°μ„œ β€œμ‹œλ™ κ±ΈκΈ°β€œκ°€ μΆ”μƒν™”λœ μΈν„°νŽ˜μ΄μŠ€κ³ , λ‚΄λΆ€ μ—”μ§„ λ©”μ»€λ‹ˆμ¦˜μ€ 감좰진 μ„ΈλΆ€ 사항이닀.

λ‚˜: μΆ”μƒν™”λž‘ μΊ‘μŠν™”λž‘ 뭐가 달라 그러면

GPT:

ꡬ뢄좔상화 (Abstraction)μΊ‘μŠν™” (Encapsulation)
λͺ©μ ν•„μš”ν•œ κΈ°λŠ₯만 λ…ΈμΆœν•˜μ—¬ μ‚¬μš©μžκ°€ λ³΅μž‘ν•œ λ‚΄λΆ€ κ΅¬ν˜„μ„ λͺ°λΌλ„ 되게 함.데이터와 λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³ , λ‚΄λΆ€ μƒνƒœλ₯Ό μˆ¨κΉ€μœΌλ‘œμ¨ λ³΄ν˜Έν•¨.
κ΄€μ μ‚¬μš©μž μž…μž₯: β€œμ–΄λ–»κ²Œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€?” (μΈν„°νŽ˜μ΄μŠ€ 제곡)κ΅¬ν˜„μž μž…μž₯: β€œλ‚΄λΆ€ 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κ³ , 변경을 μ œν•œβ€
μ˜ˆμ‹œμžλ™μ°¨μ˜ μ‹œλ™ λ²„νŠΌ (μ—”μ§„ λ‚΄λΆ€ μž‘λ™ μ›λ¦¬λŠ” μˆ¨κΉ€)은행 κ³„μ’Œ: μž”μ•‘μ€ 은행 μ‹œμŠ€ν…œμ— 감좔고, μž…μΆœκΈˆμ€ μ •ν•΄μ§„ μΈν„°νŽ˜μ΄μŠ€λ§Œ μ‚¬μš©
  • μΆ”μƒν™”λŠ” β€œμ–΄λ–€ κΈ°λŠ₯(μΈν„°νŽ˜μ΄μŠ€)을 μ œκ³΅ν•  κ²ƒμΈκ°€β€œμ— μ§‘μ€‘ν•˜λŠ” κ°œλ…
  • μΊ‘μŠν™”λŠ” β€œμ–΄λ–»κ²Œ λ‚΄λΆ€ 데이터λ₯Ό λ³΄ν˜Έν•˜κ³ , 외뢀에 접근을 μ œν•œν•  κ²ƒμΈκ°€β€œμ— μ΄ˆμ μ„ λ‘” κ°œλ…

πŸ“šΒ μš”μ•½

μ›μΉ™μ˜λ―Έ 및 λͺ©μ μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ‹œ
단일 μ±…μž„ 원칙 (SRP)ν•œ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ±…μž„λ§Œ κ°€μ Έμ•Ό 함UserManager와 Loggerλ₯Ό 뢄리
개방-폐쇄 원칙 (OCP)κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  κΈ°λŠ₯ ν™•μž₯이 κ°€λŠ₯ν•΄μ•Ό 함Discount 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ 할인 μ •μ±… μΆ”κ°€
λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 (LSP)μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀 λŒ€μ‹  μ‚¬μš©λ˜μ–΄λ„ 문제 μ—†μ–΄μ•Ό 함Bird ν΄λž˜μŠ€μ™€ Eagle, letBirdFly ν•¨μˆ˜ μ‚¬μš©
μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 (ISP)ν΄λΌμ΄μ–ΈνŠΈλŠ” λΆˆν•„μš”ν•œ λ©”μ„œλ“œμ— μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 뢄리해야 함MultiFunctionPrinter λŒ€μ‹  Printer, Scanner 뢄리
의쑴 μ—­μ „ 원칙 (DIP)κ³ μˆ˜μ€€ λͺ¨λ“ˆμ€ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , 좔상화에 μ˜μ‘΄ν•΄μ•Ό 함UserServiceκ°€ Logger 좔상화에 의쑴
This post is licensed under CC BY 4.0 by the author.