OOP 객체지향 5원칙

Rudy·2023년 4월 26일
0

OOP 5원칙 SOLID

  • SRP(Single Responsibility Principle): 단일 책임 원칙
  • OCP(Open Closed Priciple): 개방 폐쇄 원칙
  • LSP(Listov Substitution Priciple): 리스코프 치환 원칙
  • ISP(Interface Segregation Principle): 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle): 의존 역전 원칙

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

하나의 클래스는 단 하나의 책임을 가지며, 그 책임을 완전히 캡슐화해야 합니다. 이를 위해 클래스는 그 책임을 수행하는 데 필요한 데이터와 메서드만을 가지도록 설계되어야 합니다.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }
}

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

소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있으나 변경에는 닫혀 있어야 합니다. 이를 위해, 새로운 기능이나 변경사항이 필요한 경우 기존 코드를 변경하는 것이 아니라, 새로운 코드를 추가함으로써 시스템의 기능을 확장해야 합니다.

public abstract class Shape {
    public abstract double area();
}

public class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    public double area() {
        return width * height;
    }
}

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

상위 타입의 객체를 하위 타입의 객체로 치환해도 시스템의 일관성이 유지되어야 합니다. 이를 위해, 하위 클래스는 상위 클래스에서 정의된 메서드와 속성을 그대로 사용할 수 있어야 합니다.

public class Bird {
    public void fly() {
        System.out.println("I'm flying!");
    }
}

public class Penguin extends Bird {
    public void fly() {
        throw new UnsupportedOperationException("I can't fly.");
    }
}

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

인터페이스 분리 원칙(ISP)은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리해야 한다는 원칙입니다. 즉, 인터페이스는 클라이언트가 필요로 하는 작업을 수행하는 데 필요한 최소한의 메서드만을 포함해야 합니다. 이를 통해 시스템의 결합도를 낮추고 유연성과 재사용성을 향상시킬 수 있습니다.

예를 들어, 자동차를 운전하는 인터페이스를 설계할 때, 모든 자동차가 브레이크, 악셀러레이터, 핸들 등의 기능을 가지고 있지만, 전기차는 연료 탱크나 엔진과 같은 기능이 필요하지 않습니다. 이 경우, 인터페이스를 전기차와 같은 특정 유형의 자동차에 대해 세분화해서 설계해야 합니다.

public interface Car {
    void start();
    void stop();
}

public interface GasolineCar extends Car {
    void refuel();
}

public interface ElectricCar extends Car {
    void recharge();
}

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

의존 역전 원칙(DIP)은 고수준 모듈은 저수준 모듈에 의존해서는 안 된다는 원칙입니다. 대신, 모든 모듈은 추상화된 인터페이스나 추상 클래스에 의존해야 합니다. 이를 통해 시스템은 더욱 유연하고 확장 가능하며, 결합도를 낮출 수 있습니다.

예를 들어, 운전자가 자동차를 운전하기 위해서는 자동차에 의존해야 합니다. 하지만, 자동차를 제조하는 공장에 의존할 필요는 없습니다. 이 경우, 인터페이스나 추상 클래스를 사용해서 자동차와 운전자 간의 결합도를 낮출 수 있습니다.

public interface Car {
    void start();
    void stop();
}

public class Driver {
    private Car car;

    public Driver(Car car) {
        this.car = car;
    }

    public void drive() {
        car.start();
        // ...
        car.stop();
    }
}
profile
주니어 개발자

0개의 댓글