SOLID란 객체 지향 프로그래밍을 하면서 지켜야 하는 5대 원칙으로, 각각 SRP(단일 책임 원칙), OCP(개방-폐쇄 원칙), LSP(리스코프 치환 원칙), DIP(의존관계 역전 원칙), ISP(인터페이스 분리 원칙)를 의미한다.
OCP 원칙을 따른 JDBC
만약 자바 애플리케이션에서 사용하고 있는 데이터베이스를 MySQL에서 Oracle로 바꾸고 싶다면,
복잡한 하드 코딩 없이 그냥 connection 객체 부분만 교체해주면 된다.
즉, 자바 애플리케이션은 데이터베이스라고 하는 주변의 변화에 닫혀(closed) 있는 것이다.
반대로 데이터베이스를 손쉽게 교체한다는 것은 데이터베이스가 자신의 확장에는 열려(open) 있다는 의미이다.
extends
대신 implements
하여 인터페이스 타입으로 사용컬렉션 프레임워크 (Collection Framework)
만약 변수에 LinkedList 자료형을 담아 사용하다가, 중간에 전혀 다른 HashSet 자료형으로 바꿔도 add() 메서드 동작을 보장받기 위해서는 Collection 이라는 인터페이스 타입으로 변수를 선언하여 할당하면 된다.
왜냐하면 인터페이스 Collection의 추상 메서드를 각기 하위 자료형 클래스에서 implements 하여 인터페이스 구현 규약을 잘 지키도록 미리 잘 설계되어 있기 때문이다.
implements
하는 설계 원칙이다.스마트폰 인터페이스는 통화, 메시지 기능 이외에도 무선 충전, AR 뷰어, 생체인식 등의 다채로운 기능을 포함하고 있다.
interface SmartPhone {
void call(String number); // 통화 기능
void message(String number, String text); // 문자 메시지 전송 기능
void wirelessCharge(); // 무선 충전 기능
void AR(); // 증강 현실(AR) 기능
void biometrics(); // 생체 인식 기능
}
만약 갤럭시 S20이나 S21 클래스를 구현한다면, 최신 스마트폰 기종인 만큼 객체의 동작 모두가 필요하므로 ISP 원칙을 만족하게 된다.
class S20 (or S21) implements SmartPhone {
public void call(String number) {
}
public void message(String number, String text) {
}
public void wirelessCharge() {
}
public void AR() {
}
public void biometrics() {
}
}
그러나 최신 기종 스마트폰뿐만 아니라 구형 기종 스마트폰 클래스도 다뤄야 할 경우 문제가 생긴다.
갤럭시 S3 클래스를 구현해야 한다면 무선 충전, 생체인식과 같은 기능이 포함되어 있지 않기 때문이다.
이렇게 될 경우, 추상 메소드 구현 규칙상 오버라이딩은 하되, 메서드 내부는 빈 공간으로 두거나 혹은 예외(Exception)을 발생토록 구성해야 한다.
결국 필요하지도 않은 기능을 어쩔 수 없이 구현해야 하는 낭비가 발생된다.
class S3 implements SmartPhone {
public void call(String number) {
}
public void message(String number, String text) {
}
public void wirelessCharge() {
System.out.println("지원하지 않는 기능 입니다.");
}
public void AR() {
System.out.println("지원하지 않는 기능 입니다.");
}
public void biometrics() {
System.out.println("지원하지 않는 기능 입니다.");
}
}
interface IPhone {
void call(String number); // 통화 기능
void message(String number, String text); // 문자 메시지 전송 기능
}
interface WirelessChargable {
void wirelessCharge(); // 무선 충전 기능
}
interface ARable {
void AR(); // 증강 현실(AR) 기능
}
interface Biometricsable {
void biometrics(); // 생체 인식 기능
}
class S21 implements IPhone, WirelessChargable, ARable, Biometricsable {
public void call(String number) {
}
public void message(String number, String text) {
}
public void wirelessCharge() {
}
public void AR() {
}
public void biometrics() {
}
}
class S3 implements IPhone {
public void call(String number) {
}
public void message(String number, String text) {
}
}