본문 바로가기
Back-End/Spring Boot

예습) 스프링 입문을 위한 자바 객체 지향의 원리와 이해

by newny 2023. 4. 17.
반응형

SOLID

객체 지향 프로그래밍 및 설계의 다섯가지 기본 원칙

응집도는 높이고, 결합도는 낮춰라

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

 

결합도

  • 모듈(클래스) 간의 상호 의존 정도
  • 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어 객체의 재사용이나 수정, 유지보수가 용이하다.

 

응집도

  • 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성
  • 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용이나 기능의 수정, 유지보수가 용이하다.

 

SRP(Single Responsibility Principle) : 단일책임 원칙

  • 객체는 단 하나의 책임(기능담당)만 가져야 한다는 원칙
  • 같이 수정해야될 것들은 묶고, 따로 수정해야될 것들은 분리하는 것
  • 책임의 갯수 ≠ 메소드의 갯수

예) 맥가이버로 여러 기능을 사용할것인지(X), 필요에 맞는 각각의 도구들을 따로 사용할 것인지(O)

 

OCP(Open Closed Principle) : 개방 폐쇄 원칙

  • 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경(수정)에 대해서는 닫혀 있어야 한다.
  • 기능 추가 요청이 오면 클래스를 확장을 통해 손쉽게 구현하면서, 확장에 따른 클래스 수정은 최소화  하도록 프로그램을 작성해야 하는 설계 기법을 말한다고 보면 된다.

예1) JDBC 연결 → DB가 오라클에서 MySQL로 바뀐다고 해도 Connection을 설정하는 부분 외에는 따로 수정할 필요가 없음

  • 자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀있음
  • 데이터베이스를 교체한다는 것은 데이터베이스가 자신의 확장에는 열려있음을 의미

예2) 여러 운영체제 상에서 java는 JVM에 의해 똑같이 구동됨

  • 개발자가 작성한 소스코드는 운영체제의 변화에 닫혀있음
  • 각 운영체제별 JVM은 확장에 열려 있는 구조가 됨
// 잘못된 설계 예시
class HelloAnimal {
	// 기능을 확장하기 위해서는 클래스 내부 구성을 일일히 수정해야 하는 번거로움이 생긴다.
    void hello(Animal animal) {
        if (animal.type.equals("Cat")) {
            System.out.println("냐옹");
        } else if (animal.type.equals("Dog")) {
            System.out.println("멍멍");
        } else if (animal.type.equals("Sheep")) {
            System.out.println("메에에");
        } else if (animal.type.equals("Lion")) {
            System.out.println("어흥");
        }
        // ...
    }
}

 

// OCP의 좋은 예시 → 추상화시켜 코드 수정없이 확장이 가능하게 한다
class Cat extends Animal { // 상속
    void speak() {
        System.out.println("냐옹");
    }
}

class Dog extends Animal { // 상속
    void speak() {
        System.out.println("멍멍");
    }
}
class Lion extends Animal {
    void speak() {
        System.out.println("어흥");
    }
}
//...

 

LSP(Liskov Substitution Principle) : 리스코프 치환 원칙

  • 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
  • 계층도/조직도가 아닌 분류도로 표현되어야 한다.
  • 하위 클래스 is a kind of 상위 클래스 - 하위 분류는 상위 분류의 한 종류이다
  • 구현 클래스 is able to 인터페이스 - 구현 분류는 인터페이스할 수 있어야 한다.

        → ‘인터페이스 할 수 있어야 한다’의 의미 (인터페이스 명)

  • AutoCloseable - 자동으로 닫힐 수 있어야 한다
  • Appendable - 덧붙일 수 있어야 한다
  • Cloneable - 복제할 수 있어야 한다
  • Runnale - 실행할 수 있어야 한다
반응형

댓글