본문 바로가기
JAVA

JAVA SOLID 원칙에 대해 알아보자

by 얍얍1234 2023. 9. 12.

소프트웨어 개발의 핵심 목표 중 하나는 변경에 대한 대응력을 높이고 유지 보수성을 개선하는 것입니다. 이를 위해 소프트웨어 개발자들은 코드를 구조화하고 설계해야 합니다. SOLID 원칙은 객체지향 프로그래밍에서 소프트웨어 디자인을 향상시키는 데 도움을 주는 다섯 가지 원칙입니다. 이 원칙들은 소프트웨어를 더 확장 가능하고 유지 관리 가능하게 만들어줍니다. 이번 글에서는 SOLID 원칙을 자세히 알아보고, Java 언어와의 관련성을 다룰 것입니다.

 

자바_기본이미지


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

단일 책임 원칙은 클래스나 모듈은 하나의 책임만 가져야 한다는 원칙입니다. 이것은 클래스가 변경되어야 하는 이유를 하나로 제한하고, 코드의 응집성을 높여줍니다. Java에서는 이 원칙을 준수하면서 클래스를 작성할 때, 클래스가 한 가지 역할만 하도록 설계합니다. 예를 들어, 주문 관리 클래스는 주문을 생성, 저장, 검색, 삭제 등 다양한 작업을 처리하는 대신 오직 주문을 생성하는 역할만을 수행하도록 만들 수 있습니다.

 

class Order {
    public void createOrder(OrderDetails orderDetails) {
        // 주문 생성 로직
    }
}

 

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

개방-폐쇄 원칙은 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다는 원칙입니다. 즉, 새로운 기능이 추가될 때 기존 코드를 수정하지 않아야 합니다. Java에서는 이 원칙을 인터페이스와 추상 클래스를 통해 적용할 수 있습니다. 예를 들어, 다양한 지불 방법을 지원하는 주문 처리 클래스를 확장할 수 있습니다.

 

interface PaymentProvider {
    void processPayment(OrderDetails orderDetails);
}

class CreditCardPaymentProvider implements PaymentProvider {
    public void processPayment(OrderDetails orderDetails) {
        // 신용카드 결제 로직
    }
}

class PayPalPaymentProvider implements PaymentProvider {
    public void processPayment(OrderDetails orderDetails) {
        // PayPal 결제 로직
    }
}

 

 

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


리스코프 치환 원칙은 하위 클래스(subclass)는 언제나 상위 클래스(superclass)의 역할을 대체할 수 있어야 한다는 원칙입니다. Java에서 이 원칙을 준수하려면 상속 관계를 정확하게 설계해야 합니다. 예를 들어, 도형 클래스의 하위 클래스로 원, 사각형, 삼각형을 만들 때, 모든 도형 클래스는 도형의 넓이를 계산할 수 있어야 합니다.

 

class Shape {
    public double calculateArea() {
        // 도형의 넓이 계산 로직
    }
}

class Circle extends Shape {
    public double calculateArea() {
        // 원의 넓이 계산 로직
    }
}

class Rectangle extends Shape {
    public double calculateArea() {
        // 사각형의 넓이 계산 로직
    }
}

class Triangle extends Shape {
    public double calculateArea() {
        // 삼각형의 넓이 계산 로직
    }
}

 

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


인터페이스 분리 원칙은 클라이언트가 사용하지 않는 메서드에 의존하지 않아야 한다는 원칙입니다. Java에서 이 원칙을 준수하기 위해 작은 크기의 인터페이스를 설계합니다. 이렇게 하면 클라이언트는 자신이 필요로 하는 메서드만 구현하면 되므로 불필요한 의존성을 피할 수 있습니다.

 

interface Worker {
    void work();
}

interface Eater {
    void eat();
}

class Person implements Worker, Eater {
    public void work() {
        // 일하는 로직
    }

    public void eat() {
        // 먹는 로직
    }
}

 

 

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


의존성 역전 원칙은 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 모두 추상화에 의존해야 한다는 원칙입니다. Java에서는 이 원칙을 인터페이스와 추상 클래스를 사용하여 구현합니다. 예를 들어, 고수준 모듈이 데이터베이스에 의존하지 않고 데이터베이스 접근 코드에 의존하지 않도록 설계할 수 있습니다.

 

interface Database {
    void saveData(String data);
}

class MySQLDatabase implements Database {
    public void saveData(String data) {
        // MySQL 데이터베이스에 데이터 저장 로직
    }
}

class Application {
    private final Database database;

    public Application(Database database) {
        this.database = database;
    }

    public void processData(String data) {
        // 데이터 처리 로직
        database.saveData(data);
    }
}

 

 

SOLID 원칙을 준수하면 코드의 유지 보수성과 확장성을 향상시킬 수 있습니다. Java와 객체지향 프로그래밍에서 이러한 원칙을 적용하면 코드를 더 쉽게 이해하고 변경할 수 있으며, 높은 품질의 소프트웨어를 개발할 수 있습니다. SOLID 원칙은 자바를 포함한 다양한 프로그래밍 언어와 환경에서 유용하게 적용될 수 있는 중요한 원칙입니다.

'JAVA' 카테고리의 다른 글

Java Collection 간단 정리  (0) 2023.09.19
Java Optional 간단 정리  (0) 2023.09.18
Java Spring 에 대해 알아보자  (0) 2023.09.18
Java Stream 에 대해 알아보자  (0) 2023.09.13
JAVA 언어의 특징을 알아보자  (0) 2023.09.11