객체지향의 핵심은 관계와 다형성
상속은 최소화하고 컴포지션을 기본 전략
SOLID 원칙은 객체지향 설계가 망가지지 않도록 함
AI에게 요구사항만 던지면, 돌아가긴 하는 스파게티 코드가 나온다.
즉,
문제의 본질은 설계 사고의 부재다.
객체 자체보다 객체 간의 관계가 중요하다
코드는 결국 객체들이 어떻게 협력하는지를 표현한 것이다.
Person ── uses ──▶ Car
Car ── has ──▶ Engine
👉 이 관계가 설계
중요한 포인트는 이것이다.
“외부 접근을 통제하는 책임은 설계자에게 있다”
하지만 강의에서 반복해서 강조된 점:
상속은 생각보다 위험하다
Animal animal = new Dog();
animal.speak();
객체지향 설계의 핵심은 다형성
예:
Car extends Engine ❌
엔진을 바꾸고 싶으면?
→ 클래스 구조부터 수정
class Car {
Engine engine;
}
“기능 확장은 상속보다 컴포지션을 써라”
SOLID는 패턴이 아니다.
객체지향 설계가 망가지지 않게 붙잡아 주는 기준이다.
class Report {
void calculate() {}
void print() {}
void saveToFile() {}
}
class ReportCalculator {
void calculate() {}
}
class ReportPrinter {
void print() {}
}
class ReportSaver {
void save() {}
}
class Animal {
void speak(String type) {
if (type.equals("dog")) {}
else if (type.equals("cat")) {}
}
}
interface Animal {
void speak();
}
class Dog implements Animal {
public void speak() {}
}
기존 코드 수정 ❌
새 클래스 추가 ⭕
class Car {
void drive() {}
}
class Bicycle extends Car {
void drive() {
throw new UnsupportedOperationException();
}
}
interface Vehicle {
void move();
}
이상한 상속을 하지 마라
interface Machine {
void print();
void scan();
void fax();
}
interface Printer {
void print();
}
구현이 아니라 추상화에 의존
class Zoo {
Dog dog = new Dog();
}
class Zoo {
Animal animal;
Zoo(Animal animal) {
this.animal = animal;
}
}
| 개념 | 핵심 |
|---|---|
| 상속 | 구조 고정, 강한 결합 |
| 컴포지션 | 런타임 교체, 유연성 |
| OCP | if 제거가 목적 아님 |
| DIP | 추상화에 의존 |