Single Responsibility Principle
// SRP 위반
public class User {
public User() {
// User 생성자 로직
}
public saveUser {
// 데이터베이스 저장 로직
}
}
// SRP 준수
public class User {
public User() {
// User 생성자 로직
}
}
public class UserDatabase {
public saveUser {
// 데이터베이스 저장 로직
}
}
Open/closed Principle
// override를 사용하여 기존 calculateArea()를 변경하지 않는다 (다형성)
public interface Shape {
double calculateArea();
}
public class Rectangle implements Shape {
public double length;
public double width;
@Override
public double calculateArea() {
return length * width;
}
}
public class Circle implements Shape {
public double radius;
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
Liskov Substitution Principle
// LSP 위반
public class Bird {
public void fly(){
}
}
public class Ostrich extends Bird {
@Override
public void fly() {
throw new UnsupportedOperationException("Ostrich can't fly.");
}
}
Bird bird = new Ostrich();
bird.fly(); // 런타임 에러 발생, LSP 위반
// LSP 준수
public abstract class Bird {
// 공통 기능
}
public class FlyingBird extends Bird {
public void fly(){
System.out.println("This bird can fly.");
}
}
public class NonFlyingBird extends Bird {
// 비행하지 않는 새를 위한 기능
}
public class Sparrow extends FlyingBird {
// 참새는 날 수 있음
}
public class Ostrich extends NonFlyingBird {
// 타조는 날 수 없음
}
FlyingBird sparrow = new Sparrow();
sparrow.fly(); // 문제없음
Bird ostrich = new Ostrich();
// ostrich.fly(); // 이 코드는 존재하지 않음. LSP 준수
Interface Segregation Principle
// 운전 인터페이스
interface DrivingService {
void drive();
}
// 정비 인터페이스
interface MaintenanceService {
void fixEngine();
}
// 운전자 클라이언트
class Driver implements DrivingService {
public void drive() {
// 운전 기능 구현
}
}
// 정비사 클라이언트
class Mechanic implements MaintenanceService {
public void fixEngine() {
// 엔진 수리 기능 구현
}
}
Dependency Inversion Principle
// 추상화 인터페이스
interface Switchable {
void turnOn();
void turnOff();
}
// 저수준 모듈
class LightBulb implements Switchable {
public void turnOn() {
// 전구를 켬
}
public void turnOff() {
// 전구를 끔
}
}
// 고수준 모듈
class ElectricPowerSwitch {
private Switchable device;
public ElectricPowerSwitch(Switchable device) {
this.device = device;
}
void press() {
if (device != null) {
device.turnOn();
} else {
device.turnOff();
}
}
}