부트캠프(16일차)

성준혁·2022년 11월 21일
0
post-thumbnail

오늘은 부트캠프 16일차이다. OOP(객체지향프로그래밍)에서 SOLID 원칙에 대해서 공부를 했다. SOLID(SRP, OCP, LSP, DIP, LSP)를 말한다. 이런 원칙들을 알아야 하는 이유는 시스템에 예상하지 못한 변경사항이 발생하더라도, 유연하게 대처하고 이후에 확장성이 있는 시스템 구조를 설계하기 위해서이다. 그리고 좋은 설계를 하기 위해서는 시스템에 새로운 요구사항이나 변경사항이 있을 때, 영향을 받는 범위가 적은 구조가 좋은 설계인 것 같다. 오늘 공부한 SOLID 원칙 말고도 다양한 디자인 패턴이 있어서 어느 정도 공부하다가 다른 디자인 패턴을 공부하는 것도 좋은 것 같다. 밑에서 SRP, OCP, ISP 예제를 내 방식대로 작성해보았는데 그냥 코드적으로 맞는가 보다는 최대한 뜻을 이해하려고 작성했다.

오늘 배운 것

1. 객체지향적으로 설계할 때는 응집도를 높게, 결합도는 낮게 설계하는 것이 좋다.

-응집도 : 구성 요소들 사이의 응집력을 말한다.
-결합도 : 구성 요소들 사이가 얼마나 의존적인지를 말한다.
-여러 객체들이 하나의 책임만 갖도록 잘 분배한다면, 시스템에 변화가 생기더라도 그 영향을 최소화 할 수 있다. 클래스 안에 하나의 메드만 있어야 한다.

2. SRP(Single Reponsibility Principle, 단일 책임 원칙)

  • ISP 위배
public class Calculator {
    public void add()
    public void subtraction()
    public void multiply()
    public void division()
    public void alram() < ---------- SRP에 위배
}
  • SRP GOOD
public class Calculator {
    public void add()
    public void subtraction()
    public void multiply()
    public void division()
}
public class Alarm {
    public void setTime()
    public void ring()
}

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

-기존의 코드를 변경하지 않으면서(Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙
-OPC는 상속 / 인터페이스의 사용과 연결점이 있어 보인다.
-OPC의 장점은 유연성, 사용성, 유지보수성을 얻을 수 있다.

  • OPC 위배
public class Calculator {
    public static void main(String[] args) {
        A cal = new A();
        cal1.calculator();

        B cal = new B();
        cal2.calculator();

        C cal = new C();
        cal3.calculator();
    }
}

class A{
    void calculator() {
        System.out.println("나는 A계산기를 사용한다.")
    }
}

class B{
    void calculator() {
        System.out.println("나는 B계산기를 사용한다.")
    }
}

class C{
    void calculator() {
        System.out.println("나는 C계산기를 사용한다.")
    }
}
  • OCP GOOD
public class Calculator {
    public static void main(String[] args) {
        calMar[] cal = new Cal[3];

        call[0] = new A();
        call[1] = new B();
        call[2] = new C();

        for(int i = 0; i<cal.length; i++){
            cal[i].calculator();
        }
}

class calMar{
    String myCal="calMar"
    void calculator() {
        System.out.println("나는 %s를 사용한다. \n", calMar);
    }
}

class A extends calMar{
    public A() {
         calMar = "A"
    }
}

class B extends calMar{
    public B() {
         calMar = "B"
    }
}

class C extends calMar{
    public C() {
         calMar = "C"
    }
}

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

각 역할에 대한 인터페이스를 구현
하나의 인터페이스에 연관성 없는 하나 이상의 메서드를 포함해서는 안된다.

  • ISP 위배
public class Calculator {
    public static void main(String[] args) {
                sung_Cal cal  = new cla2();
                cal.calculator();
                cal.turnOff();
    }
}

interface Sung_Cal {
    void calculator()
    void turnOn();
}

class cal2 implements sung_Cal {

    @Override
    public void calculator() {
         System.out.println("계산기로 계산한다.")
    }

    @Override
    public void turnOff() {
         System.out.println("전원이 꺼집니다.")
    }
}
  • ISP GOOD
public class Calculator {
    public static void main(String[] args) {
                Sung sung  = new cla2();
                sung.calculator();
                Cal cal  = new cla2();
                cal.turnOff();
    }
}

interface Sung_Cal {
    interface Sung { void calculator(); }
    interface Cal { void turnOn(); }
}

class cal2 implements Sung, Cal {

    @Override
    public void calculator() {
         System.out.println("계산기로 계산한다.")
    }

    @Override
    public void turnOff() {
         System.out.println("전원이 꺼집니다.")
    }
}

0개의 댓글