SOLID 란 Object-Oriented Programming 을 하면서 지켜야하는 5대 원칙이다.

원칙을 무시하고 프로그래밍을 한다면, 객체 지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 결코 얻을 수 없다.

Single Responsibility Principle

Object 는 하나의 책임(Object 가 할 수 있는것)만 가져야한다.


SRP 원칙을 적용하면 다른 클래스들이 서로 영향을 미치는 연쇄작용을 줄일 수 있다.

A 라는 기능을 가진 클래스를 수정할 때는 그 목적이 A 여만 한다.

Open-Closed Principle


기존의 코드를 변경하지 않으면서(Closed), 기능을 추가(Open)할 수 있어야 한다.

OCP 에서 가장 중요한 것은 요구사항이 변경 되었을 때, 코드에서 변경되어야 하는 것과 변경되지 않아야 하는 부분을 명확히 구분하여, 확장에는 유연하게 반응하며 변경은 최소화 하는 것을 의미한다.

public class Character {
	  private Gun gun;
    public static void main(String[] args) {
        Character character = new Character();
        character.attack();
    }
    private void attack(){
        System.out.println("reload...");
        gun = new Gun();
        gun.trigger();
    }
}

class Gun {
    public void trigger(){
        System.out.println("bang!");
    }
}

해당 코드는 character 가 쏜 총이 bang! 을 출력한다.

여기서 만약 flamethrower 로 무기를 바꾸게 된다면 불필요하게(변경 목적에 맞지않는 method 변경) attack method() 를 변경해야 하며

이처럼 변경될만한 Object(Gun) 가 있을 경우, 변경되지 않는 Interface(Weapon) 을 정의하여 아래와 같이 훨씬 유연하게 설계 가능하며, 기존 코드는 거의 만지지 않는다.

public class Character {
    private Weapon weapon;
    public static void main(String[] args) {
        Character character = new Character();
        character.setWeapon(new Gun());
        character.attack();

        Character character1 = new Character();
        character1.setWeapon(new Flamethrower());
        character1.attack();
    }
    private void setWeapon(Weapon weapon){
        this.weapon = weapon;
    }
    private void attack() {
        System.out.println("reload...");
        weapon.trigger();
    }
}

class Flamethrower implements Weapon{
    @Override
    public void trigger(){
        System.out.println("fire!");
    }
}

class Gun implements Weapon {
    @Override
    public void trigger() {
        System.out.println("bang!");
    }
}

interface Weapon {
    void trigger();
}

Liskov Substitution Principle


상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작하여야 한다.

https://steady-coding.tistory.com/383