[Java] 객체지향 SOLID 원칙

김민범·2024년 10월 26일

Java

목록 보기
7/8

두 번의 과제를 진행하며 매번 들었던 피드백이 있다.

설계를 할 때 요구사항을 정리해 행위만 분류한다. 이는 함수가 될 수 있고, 비슷한 성격의 함수를 모아 클래스를 만들 수 있다.

바로 클래스, 메서드를 확실하게 분리해서 좀 더 직관적이고 보기 쉬운 코드를 만들자! 라는 내용이였다.
.
.
.
그런데,
어떤 기준으로 분리하고 설계를 해야할까? 를 고민하다가 객체지향 설계원칙인 SOLID 원칙 을 알게 되어 소개한다.


SOLID 원칙이란

  • 객체지향 설계의 SOLID 원칙은 유지보수성과 확장성을 높이는 설계 원칙이다.
  • 객체지향 설계5대 원칙이라 부르는데 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), ISP(인터페이스 분리 원칙), DIP(의존 역전 원칙)을 말하고 앞자를 따서 SOILD 원칙이라고 부른다.

각 원칙을 예시와 함께 살펴보자.


1. 단일 책임 원칙 (SRP, Single Responsibility Principle)

  • 설명: 클래스는 하나의 책임만 가져야 한다.
  • 예시: User 클래스가 회원 정보를 관리하고, UserAuthenticator 클래스는 로그인 기능만 담당하게 한다. 이는 클래스가 하나의 역할만 수행하도록 하여 유지보수를 쉽게 한다.
public class User {
    private String name;
    private String email;
    // Getter, Setter
}

public class UserAuthenticator {
    public boolean login(String email, String password) {
        return true;
    }
}

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

  • 설명: 클래스는 확장에 열려 있고 변경에는 닫혀 있어야 한다.
  • 예시: Shape 인터페이스를 통해 새로운 도형 클래스가 추가될 때 기존 코드를 수정하지 않고도 기능을 확장할 수 있다.
public interface Shape {
    double area();
}

public class Rectangle implements Shape {
    private double width, height;
    
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
    
    public double area() {
        return width * height;
    }
}

3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

  • 설명: 자식 클래스는 부모 클래스를 대체할 수 있어야 한다.
  • 예시: Bird 클래스와 Penguin 클래스에서 Penguinfly() 대신 move()를 통해 LSP를 준수하게 한다.
public abstract class Bird {
    public abstract void move();
}

public class Sparrow extends Bird {
    public void move() {
        System.out.println("날고 있다!");
    }
}

public class Penguin extends Bird {
    public void move() {
        System.out.println("걷고 있다!");
    }
}

4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)

  • 설명: 클라이언트는 사용하지 않는 인터페이스에 의존하지 않아야 한다.
  • 예시: Worker 인터페이스를 분리해 WorkEat 인터페이스로 분리해 필요한 기능만 구현하게 한다.
public interface Work {
    void work();
}

public interface Eat {
    void eat();
}

public class Worker implements Work {
    public void work() {
        System.out.println("일하고 있다!");
    }
}

5. 의존 역전 원칙 (DIP, Dependency Inversion Principle)

  • 설명: 고수준 모듈은 저수준 모듈에 의존하지 않고 추상화에 의존해야 한다.
  • 예시: MessageSender 인터페이스를 통해 NotificationServiceEmailSenderSMSSender에 직접 의존하지 않도록 한다.
public interface MessageSender {
    void sendMessage(String message);
}

public class EmailSender implements MessageSender {
    public void sendMessage(String message) {
        System.out.println("이메일 발송: " + message);
    }
}

public class NotificationService {
    private MessageSender messageSender;

    public NotificationService(MessageSender messageSender) {
        this.messageSender = messageSender;
    }

    public void notify(String message) {
        messageSender.sendMessage(message);
    }
}

SOLID 원칙을 준수하면 코드의 유연성과 유지보수성이 높아지고, 변화에 강한 구조를 만들 수 있다.

0개의 댓글