안녕하세요! 오늘은 객체지향 설계의 중요한 원칙 중 하나인 Locality of Behavior에 대해 알아보겠습니다.
Locality of Behavior란? 🤔
행위의 국소성이란 특정 데이터와 그 데이터를 사용하는 행위(메서드)가 같은 클래스에 있어야 한다는 객체지향 설계 원칙입니다.
쉽게 말해서:
- 데이터를 가진 객체가 그 데이터로 하는 일도 책임져야 한다는 의미예요!
- 마치 주방장이 자신의 주방 도구를 직접 관리하는 것과 같죠
왜 중요한가요? 🌟
응집도 향상
- 연관된 데이터와 행위가 한 곳에 모여있어 코드 이해가 쉬워짐
- 마치 주방 도구들이 주방에 모여있는 것처럼!
유지보수성 증가
- 관련 코드가 한 곳에 모여있어 수정이 용이
- 버그 수정도 더 쉬워짐
캡슐화 강화
- 데이터와 그 처리가 한 곳에서 이루어져 정보 은닉이 자연스러움
나쁜 예시와 좋은 예시 💡
나쁜 예시 ❌
class Order {
private List<OrderItem> items;
private BigDecimal totalPrice;
}
class OrderService {
public BigDecimal calculateTotal(Order order) {
return order.getItems().stream()
.map(item -> item.getPrice())
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
좋은 예시 ✅
class Order {
private List<OrderItem> items;
private BigDecimal totalPrice;
public BigDecimal calculateTotal() {
return items.stream()
.map(OrderItem::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
실제 적용 사례 📱
1. 주문 시스템
class Cart {
private List<Item> items;
public BigDecimal calculateTotalPrice() {
// 카트가 자신의 아이템 가격을 직접 계산
return items.stream()
.map(Item::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
public void addItem(Item item) {
// 카트가 자신의 아이템 추가를 직접 관리
items.add(item);
}
}
2. 사용자 인증
class User {
private String password;
private String salt;
public boolean validatePassword(String inputPassword) {
// 사용자가 자신의 비밀번호 검증을 직접 수행
String hashedInput = hashPassword(inputPassword, this.salt);
return hashedInput.equals(this.password);
}
}
적용 시 주의사항 ⚠️
과도한 책임 부여 금지
- 한 클래스에 너무 많은 행위를 넣지 않기
- 단일 책임 원칙(SRP)도 함께 고려하기
적절한 균형 찾기
- 때로는 별도의 서비스 계층이 필요할 수 있음
- 비즈니스 로직의 복잡도에 따라 유연하게 적용
장점 정리 🎯
코드 가독성 향상
- 관련 코드가 한 곳에 모여 있어 이해하기 쉬움
유지보수성 개선
- 수정이 필요한 코드를 쉽게 찾을 수 있음
버그 감소
- 데이터 처리 로직이 분산되지 않아 오류 가능성 감소
재사용성 증가
- 응집도 높은 클래스는 다른 상황에서도 쉽게 재사용 가능
참고 자료 📚
- "Object-Oriented Software Construction" by Bertrand Meyer
- "Clean Code" by Robert C. Martin
- "Patterns of Enterprise Application Architecture" by Martin Fowler
- Domain-Driven Design Community: https://dddcommunity.org/
- Object-Oriented Design Patterns: https://sourcemaking.com/design_patterns
728x90
'800===Dev Docs and License > Design Pattern' 카테고리의 다른 글
실전 Java 코드 리팩토링 상세 가이드 🔧 (2) | 2024.11.13 |
---|---|
더 나은 Java 코드 리팩토링 가이드 🛠️ (0) | 2024.11.13 |
Observer Pattern with Java (0) | 2024.05.30 |
Clean Architecture (0) | 2024.05.28 |
Singleton Pattern with Java (0) | 2024.05.28 |