소개: 자바에서 객체 지향 프로그래밍을 할 때, SOLID 원칙을 따르는 것이 중요합니다. SOLID는 SRP, OCP, LSP, ISP, DIP 다섯 가지 원칙으로 이루어져 있으며, 이를 지키면 코드의 유지보수성과 확장성을 높일 수 있습니다. 이 블로그에서는 각 원칙의 특징과 중요성에 대해 알아보겠습니다.
1. 단일 책임 원칙 (Single Responsibility Principle - SRP):
// 단일 책임 원칙을 지키지 않은 예제
public class Employee {
public void generateReport() {
// 보고서 생성 로직
}
public void saveToDatabase() {
// 데이터베이스에 저장하는 로직
}
}
// 단일 책임 원칙을 지키는 예제
public class Employee {
public void generateReport() {
// 보고서 생성 로직
}
}
public class DatabaseManager {
public void saveToDatabase() {
// 데이터베이스에 저장하는 로직
}
}
2. 개방/폐쇄 원칙 (Open/Closed Principle - OCP):
// 개방/폐쇄 원칙을 지키지 않은 예제
public class Rectangle {
public double width;
public double height;
}
public class AreaCalculator {
public double calculateRectangleArea(Rectangle rectangle) {
return rectangle.width * rectangle.height;
}
}
// 개방/폐쇄 원칙을 지키는 예제
public interface Shape {
double calculateArea();
}
public class Rectangle implements Shape {
private double width;
private double height;
@Override
public double calculateArea() {
return width * height;
}
}
public class Circle implements Shape {
private double radius;
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
3. 리스코프 치환 원칙 (Liskov Substitution Principle - LSP):
// 리스코프 치환 원칙을 지키지 않은 예제
public class Bird {
public void fly() {
// 날기 로직
}
}
public class Penguin extends Bird {
// 펭귄은 날지 못하는데 부모 클래스의 메서드를 그대로 상속받음
}
// 리스코프 치환 원칙을 지키는 예제
public interface Flyable {
void fly();
}
public class Bird implements Flyable {
@Override
public void fly() {
// 날기 로직
}
}
public class Penguin implements Flyable {
@Override
public void fly() {
// 펭귄은 날지 못하지만 Flyable 인터페이스에 맞춰 구현
}
}
4. 인터페이스 분리 원칙 (Interface Segregation Principle - ISP):
// 인터페이스 분리 원칙을 지키지 않은 예제
public interface Worker {
void work();
void eat();
}
public class Programmer implements Worker {
@Override
public void work() {
// 프로그래머의 작업 로직
}
@Override
public void eat() {
// 프로그래머의 식사 로직
}
}
// 인터페이스 분리 원칙을 지키는 예제
public interface Workable {
void work();
}
public interface Eatable {
void eat();
}
public class Programmer implements Workable, Eatable {
@Override
public void work() {
// 프로그래머의 작업 로직
}
@Override
public void eat() {
// 프로그래머의 식사 로직
}
}
5. 의존 역전 원칙 (Dependency Inversion Principle - DIP):
// 의존 역전 원칙을 지키지 않은 예제
public class LightBulb {
public void turnOn() {
// 전구를 켜는 로직
}
public void turnOff() {
// 전구를 끄는 로직
}
}
public class Switch {
private LightBulb bulb;
public Switch(LightBulb bulb) {
this.bulb = bulb;
}
public void operate() {
bulb.turnOn();
// 스위치 조작에 따른 추가 로직
bulb.turnOff();
}
}
// 의존 역전 원칙을 지키는 예제
public interface Switchable {
void turnOn();
void turnOff();
}
public class LightBulb implements Switchable {
@Override
public void turnOn() {
// 전구를 켜는 로직
}
@Override
public void turnOff() {
// 전구를 끄는 로직
}
}
public class Switch {
private Switchable device;
public Switch(Switchable device) {
this.device = device;
}
public void operate() {
device.turnOn();
// 스위치 조작에 따른 추가 로직
device.turnOff();
}
}
결론: SOLID 원칙은 자바뿐만 아니라 객체 지향 프로그래밍에서 좋은 설계를 위한 기본 원칙입니다. 이를 지키면 코드의 유지보수성과 확장성이 향상되어 품질 높은 소프트웨어를 개발할 수 있습니다. SOLID 원칙을 적용하면 객체 지향 프로그래밍의 강력한 기능을 최대한 활용할 수 있습니다.
[자바 CS지식] 체크 예외와 언체크 예외/런타임 예외의 차이 (0) | 2024.02.12 |
---|---|
[자바 CS지식] 오버로딩과 오버라이딩의 차이 (0) | 2024.02.12 |
[자바 CS지식] Call By Reference와 Call By Value의 차이점 (0) | 2024.02.11 |
[자바 CS지식] 캡슐화와 정보 은닉의 차이점 (0) | 2024.02.11 |
[자바 CS지식] 접근 제어자의 종류와 특징 (0) | 2024.02.11 |