SOLID
ν΄λ¦°μ½λλ‘ μ λͺ ν λ‘λ²νΈ λ§ν΄μ΄ μ μν κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ
SRP: λ¨μΌ μ±
μ μμΉ(Single Responsibility Principle)
νλμ ν΄λμ€λ νλμ μ± μ(λͺ©μ )λ§ κ°μ ΈμΌ νλ€.
μ± μμ ν΄ μλ μκ³ , μμ μλ μμΌλ©° μν©μ λ°λΌ λ€λ₯΄λ€.
ν΄λμ€λ₯Ό λ³κ²½νλ μ΄μ κ° νλμ μ΄μ μ¬μΌ νλ€.
λ³κ²½μ μ©μ΄νκ² μ€κ³νλ€λ©΄ λ¨μΌ μ± μ μμΉμ μ λ°λ₯Έ κ²
class Order {
private List<Item> items;
public void addItem(Item item) {
// μμ΄ν
μ μ£Όλ¬Έμ μΆκ°νλ λ‘μ§
}
public double calculateTotal() {
// μ£Όλ¬Έμ μ΄ κ°κ²©μ κ³μ°νλ λ‘μ§
}
}
class Item {
private String name;
private double price;
// μμ΄ν
μ μ΄λ¦κ³Ό κ°κ²©μ μ€μ νλ μμ±μ λ° λ©μλ
}
Order ν΄λμ€λ μ£Όλ¬Έμ κ΄λ ¨λ μ± μλ§ κ°μ§κ³ μκ³ , Item ν΄λμ€λ μμ΄ν μ κ΄λ ¨λ μ± μλ§ κ°μ§κ³ μλ€.
OCP: κ°λ°©-νμ μμΉ (Open-Closed principle)
νμ₯μ μ΄λ €μμΌλ, λ³κ²½μλ λ«νμμ΄μΌ νλ€.
μλ‘μ΄ κΈ°λ₯μ μΆκ°ν λ κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νμ§ μκ³ νμ₯ν μ μλλ‘ μ€κ³ν΄μΌ νλ€.
interface Shape {
double calculateArea();
}
class Circle implements Shape {
private double radius;
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
class Rectangle implements Shape {
private double width;
private double height;
@Override
public double calculateArea() {
return width * height;
}
}
// μ’μ μ, κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νμ§ μκ³ νμ₯ κ°λ₯
class Test1 {
private Shape shape;
public Test1(Shape shape) {
this.shape = shape;
}
public void doSomething() {
shape.calculateArea();
// ...
}
}
// λμ μ, κΈ°λ₯μ μΆκ°νκΈ° μν΄μ νλμ 쑰건문μ μΆκ°ν΄μΌνλ λ³κ²½μ΄ νμ
class Test2 {
private Circle circle = new Circle();
private Rectangle rectangle = new Rectangle();
public void doSomething(String shape) {
if (shape.equals("circle")) {
circle.calculateArea();
} else if (shape.equals("rectangle")) {
rectangle.calculateArea();
}
// ...
}
}
μ μ½λμμ κΈ°λ₯μ μΆκ°νκΈ° μν΄μλ Shape μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ§ μΆκ°νλ©΄ λλ€.
LSP: 리μ€μ½ν μΉν μμΉ (Liskov Substitution Principle)
κ°μ²΄λ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ μμ ν΄λμ€μ κ°μ²΄λ₯Ό νμ ν΄λμ€λ‘ λ체 κ°λ₯ν΄μΌ νλ€.
λΆλͺ¨ ν΄λμ€μ κ·μ μ μμ ν΄λμ€κ° λ€ μ§μΌμΌ νλ€λ κ²μ μλ―Ένλ€.
class Parent {
public int calculate(int a, int b) {
return a + b;
}
}
class Child extends Parent {
@Override
public int calculate(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("b cannot be zero");
}
return a / b;
}
}
public class test {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.calculate(10, 0)); // IllegalArgumentException
}
}
μ μ½λμμ μλ¬κ° λ°μνμ§ μμ§λ§ λμ΄λ₯Ό ꡬνλλ°μ λ Όλ¦¬μ μΈ μ°¨μ΄κ° μμ΄ μλνμ§ μμ κ²°κ³Όκ° λμ¬ μ μλ€.
ISP: μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (Interface segregation principle)
μ¬λ¬ κΈ°λ₯μ ν¬ν¨ν λ²μ© μΈν°νμ΄μ€ λ³΄λ¨ νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬ κ°λ₯Ό μμ±νλ κ²μ΄ μ’λ€.
μΈν°νμ΄μ€κ° λͺ νν΄μ§λ©° λ체 κ°λ₯μ±μ΄ λμμ§λ€.
interface Printer {
void print(Document document);
}
interface Scanner {
void scan(Document document);
}
class AllInOnePrinter implements Printer, Scanner {
public void print(Document document) {
// μΆλ ₯ λ‘μ§
}
public void scan(Document document) {
// μ€μΊ λ‘μ§
}
}
μΈν°νμ΄μ€λ₯Ό μ¬λ¬ κ°λ‘ λΆλ¦¬νμ¬ ν΄λμ€μ νμν μΈν°νμ΄μ€λ§ ꡬννλλ‘ νλ©΄, νμν κΈ°λ₯λ§ μ¬μ©ν μ μκ³ , λ체 κ°λ₯μ±λ λμμ§λ€. λν λΆνμν λ©μλλ₯Ό ꡬννμ§ μμλ λκ³ , μ¬μ©νλ ν΄λΌμ΄μΈνΈμκ² λΆνμν λ©μλλ₯Ό λ ΈμΆμν€μ§ μλ μ₯μ μ΄ μλ€.
DIP: μμ‘΄ μμ μμΉ (Dependency inversion principle)
"μΆμνμ μμ‘΄ν΄μΌνκ³ , ꡬ체νμ μμ‘΄νλ©΄ μλλ€."λ₯Ό λ°λ₯΄λ μμΉ
ꡬν ν΄λμ€μ μμ‘΄νμ§ μκ³ , μΈν°νμ΄μ€μ μμ‘΄ν΄μΌ νλ€.
ꡬν체μ μμ‘΄νκ² λλ©΄ λ³κ²½μ΄ μ΄λ €μμ§κ³ , ν μ€νΈλ μ΄λ €μμ§λ€.
interface PaymentProvider {
void processPayment(int amount);
}
class KakaoPaymentProvider implements PaymentProvider {
public void processPayment(int amount) {
// μΉ΄μΉ΄μ€νμ΄ κ²°μ λ‘μ§
}
}
class OrderService {
private final PaymentProvider paymentProvider;
public OrderService(PaymentProvider paymentProvider) {
this.paymentProvider = paymentProvider;
}
public void processOrder(Order order) {
// μ£Όλ¬Έ μ²λ¦¬ λ‘μ§
paymentProvider.processPayment(order.getTotalAmount());
}
}
class OrderServiceTest {
void processOrder() {
OrderService orderService = new OrderService(new KakaoPaymentProvider());
orderService.processOrder(new Order());
}
}
μ μ½λλ μΈν°νμ΄μ€μ μ‘΄μ¬λ‘ OrderService -> PaymentProvider <- KakaoPaymentProvider
λ‘ μμ‘΄ λ°©ν₯μ΄ μμ λμκΈ° λλ¬Έμ, λ³κ²½μ΄ μ©μ΄ν΄μ§ μ½λκ° λλ€.
νμ§λ§ μΈν°νμ΄μ€κ° μμλ€λ©΄ OrderService -> KakaoPaymentProvider
λ‘ μμ‘΄νκ² λμ΄ λ³κ²½μ΄ μ΄λ €μμ§κ³ , ν
μ€νΈλ μ΄λ ΅κ² λλ€.
Last updated
Was this helpful?