Solid

Solid


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

클래스나 모듈은 변경할 이유가 하나만 있어야 한다. 즉, 클래스는 하나의 책임 또는 작업만 가져야 하며, 클래스를 변경할 수 있는 다른 책임이 없어야 한다.

결과적으로 SRP원칙을 잘따른 클래스는 변경사항에 대한 파급 효과가 적으며 , 변화에 잘 대응할수 있다.


❗이때 무조건적으로 하나의 클래스에 하나의 기능만 있으란건아니고 해당클래스에 너무 위배되는 기능 (ex) 옷장이 옷을벗는다) 이 없으면 된다.

OCP(Open Closed Principle) 개방 폐쇄 원칙 (추상화, 다형성)

개방 폐쇄 원칙은 높은 응집도와 낮은 결합도 라는 원리로 설명할 수 있다.

즉 확장에 열려있고, 변경에는 닫혀있어야한다.

이말은 새로운 변경사항은 유연하게 추가 또는 수정하되 객체에 존재하는 기존의 코드에는 변경이 일어나지 않도록 설계해야한다.

결론적으로 개방-폐쇄 원칙을 수용하는 코드는 컴파일타임 의존성을 수정하지 않고도 런타임 의존성을 쉽게 변경할수 있는 코드를 말한다. 위의 원칙을 준수하면 새로운 기능이 필요할때 기존의 코드를 변경하지 않고 기능을 추가할수 있다.


LSP(Liskov Substitution Principle) 리스코프 치환 원칙 (인터페이스)

객체 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다.

다형성을 지원하기 위한 원칙이다.

인터페이스의 메서드를 사용한다 할때, 어떤 구현체를 사용하든 호출부에서 기대하는 대로 동작되어야 한다.

상속을 통한 재사용은 기반 클래스와 서브 클래스 사이에 IS-A관계가 있을 경우로 제한해야하며 그외의 경우는 합성을 이용해 재사용을 해야 한다.


ISP(Interface Segragation Principle) 인터페이스 분리 원칙

범용 인터페이스 하나보다는 특정 클라이언트를 위한 여러 개의 인터페이스 분리가 더 좋다.

이때 인터페이스가 구체화되면서 클라이언트에 변화를 일으키면 안된다.

예를들어 운전자가 자동차를 운전한다 라는 명제를 객체간 관계로 비교하면 자동차에 대한 인터페이스, 운전자에 대한 인터페이스를 각각 분리한다. 이렇게되면 운전자는 택시기사, 버스기사 등..이 될수있고 자동차는 택시,버스 ..등 이 될수있다. 즉 확장성이 커진다.


DIP(Dependency Inversion Principle) 의존관계 역전 원칙

  • 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다.
  • 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.

위 2가지 사항을 의존성 역전 원칙이라 한다. 이름이 의존성 역전 원칙인 이유는 절차형 프로그래밍(상위 모듈이 하위 모듈에 의존)과는 의존성의 방향이 반대방향이라 그렇다고 한다.


OOP 4원칙


캡슐화

데이터와 데이터를 활용하는 함수를 외부에 들어나지 않게 한다.

즉 데이터를 외부에서 접근하지 않고 함수를 통해서만 접근할수 있도록 한다.

캡슐화를 통해 객체의 상태가 실수로 수정되는 것을 방지하고 코드 유지보수성을 개선하는 도움을 준다.


상속화

상속은 클래스가 다른 클래스로부터 속성 및 메서드를 상속할 수 있는 메커니즘이다.

다른 클래스에서 상속하는 클래스를 서브클래스 또는 파생 클래스라고 하고, 상속하는 클래스를 수퍼클래스 또는 베이스 클래스라고 한다.

상속을 사용하면 코드를 재사용할 수 있으며 클래스를 관계에 따라 계층 구조로 구성하는 데 도움이 되며, 상속은 캡슐화를 유지 하는데도 도움을 준다.


추상화

인터페이스, 추상클래스, 추상 메소드를 통해 객체가 가진 특성중 필수적인 속성만 객체로 묘사하고 유사성만을 표현하며 세부적인 상세 사항은 객체에 따라 다르게 구현될수 있도록 한다.


다형성

하나의 메세지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할수 있는 능력

  • 오버라이딩: 상위클래스가 가지고있는 메서드를 하위 클래스가 재정의 하여 사용
  • 오버로딩: 서로다른 파라미터를 통해 이름이 같은 메서드 를 여러개 가진다.

'Java' 카테고리의 다른 글

ElasticSearch 를 사용하기 위해 SSL/TLS인증서 추가방법  (0) 2023.11.30

+ Recent posts