1. 단일 책임 원칙(Single Responsibility Principle)
하나의 클래스는 하나의 책임만 가져야 한다는 원리입니다. 즉, 클래스는 오직 한 가지 기능만 수행하도록 해야 합니다.
예를 들어, 주문(Order) 클래스가 주문 생성, 결제, 배송 등 여러 기능을 수행한다면 이는 SRP 원칙을 위배하는 것입니다. 이 경우 주문 생성, 결제, 배송 등 각각의 책임을 갖는 클래스를 만들어야 합니다.
이를 통해 클래스의 응집도를 높이고, 클래스 간 결합도를 낮춰 유연성과 확장성을 높일 수 있습니다.
2. 개방-폐쇄 원칙(Open-closed Principle)
클래스나 모듈은 확장에는 열려있어야 하고, 변경에는 닫혀있어야 한다는 원리입니다.
기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 합니다. 이를 통해 코드의 유지보수성과 재사용성을 높일 수 있습니다.
3. 리스코프 치환 원칙(Liskov Substitution Principle)
자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다는 원리입니다. 즉, 상위 클래스를 사용하는 코드는 하위 클래스로 대체해도 동작에 문제가 없어야 합니다.
예를 들어, 'ArrayList' 클래스는 'List' 인터페이스를 구현하므로, 'List' 타입 변수에 'ArrayList' 인스턴스를 할당할 수 있습니다.
리스코프 치환 원칙을 지키지 않으면 예상치 못한 동작이 발생할 수 있습니다. 만약 자식 클래스에서 부모 클래스의 메서드를 오버라이드할 때, 오버라이드된 메서드가 부모 클래스의 메서드와 다른 동작을 수행한다면, 프로그램이 동작이 예상과 다르게 동작할 수 있습니다. 따라서 자식 클래스는 부모 클래스와 동일한 동작을 수행하도록 구현되어야 합니다.
리스코프 치환 원칙은 다형성을 지원하는 객체 지향 언어에서 매우 중요합니다. 이러한 대체 가능성이 유지되어야 다형성을 이용한 코드 재사용과 유연한 설계가 가능합니다. 이 원칙을 지키지 않으면, 하위 클래스를 사용하는 코드가 예상치 못한 결과를 내거나, 예외를 발생시킬 수도 있습니다.
4. 인터페이스 분리 원칙(Interface Segregation Principle)
인터페이스는 클라이언트가 필요로 하는 메서드만 포함해야 한다는 원리입니다. 즉, 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 합니다. 만약 다수의 메서드를 가진 인터페이스를 사용한다면, 클라이언트는 자신이 사용하지 않는 메서드에 대한 구현까지 제공해야 합니다. 이는 코드의 중복을 유발하고, 유지보수를 어렵게 합니다.
인터페이스 분리 원칙은 다음과 같이 작동합니다.
1)인터페이스를 작은 단위로 분리합니다. 하나의 인터페이스에 여러 개의 메서드를 정의하지 않고, 관련된 메서드들을 하나의 인터페이스로 분리합니다.
2)클라이언트가 필요로 하는 기능에만 인터페이스를 구현합니다. 클라이언트에서 사용하지 않는 메서드를 포함하지 않도록 인터페이스를 작성합니다.
3)기능을 필요로 하는 객체 간의 인터페이스를 작성합니다. 객체 간의 관계와 필요한 기능에 따라 인터페이스를 작성합니다.
이를 통해 인터페이스의 응집도를 높이고, 클래스 간의 결합도를 낮출 수 있습니다.
5. 의존 역전 원칙(Dependency Inversion Principle)
추상화에 의존해야 하며, 구체화에 의존해서는 안 된다는 원리입니다. 즉, 클래스는 추상화된 것에 의존해야 하며, 구체적인 것에는 의존해서는 안 됩니다.
상위 모듈이 하위 모듈에 직접 의존하면, 하위 모듈을 변경할 때 상위 모듈까지 영향을 미칠 수 있습니다. 이는 코드의 유연성과 확장성을 저해합니다.
이를 해결하기 위해 상위 모듈과 하위 모듈 모두 추상화된 인터페이스나 추상 클래스를 이용해 구현하고, 이를 이용해 의존성을 역전시켜야 합니다.
이를 통해 시스템의 결합도를 낮추고, 유연성과 재사용성을 높일 수 있습니다.
'java(자바)' 카테고리의 다른 글
[java(자바)] 자바의 데이터 타입-기본형(Primitive Type) vs 참조형(Reference Type) _디버깅의 눈물 (0) | 2023.03.26 |
---|---|
[java(자바)] 객체 지향 프로그래밍 vs 절차 지향 프로그래밍 _디버깅의 눈물 (0) | 2023.03.25 |
[java(자바)] 자바에서 다중 상속을 허용하지 않는 이유 _디버깅의 눈물 (0) | 2023.03.23 |
[java(자바)] 상속(extends) vs 구현(implements) _디버깅의 눈물 (0) | 2023.03.22 |
[java(자바)] 추상 클래스와 인터페이스의 차이 _디버깅의 눈물 (0) | 2023.03.21 |