GRASP 패턴: Information Expert (정보 전문가)
Prof. Jong Min Lee이(가) 약 한달 전에 추가함
GRASP 패턴: Information Expert (정보 전문가) - 간단한 설명과 예시¶
핵심 아이디어: 어떤 책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 클래스에게 그 책임을 할당합니다. "무엇을 해야 하는가?"에 대한 답을 얻기 위해 필요한 데이터를 가진 객체가 그 행동을 담당하는 것이 자연스럽고 응집도를 높이는 방법입니다.
간단한 설명:
어떤 작업을 수행해야 할 때, 그 작업에 필요한 정보가 있는 객체를 찾아 그 객체에게 책임을 할당하는 것이 정보 전문가 패턴의 핵심입니다. 이는 객체 지향 설계의 기본적인 원칙 중 하나이며, 클래스가 자신이 관리하는 데이터와 관련된 행동을 함께 갖도록 유도하여 높은 응집도와 낮은 결합도를 달성하는 데 도움을 줍니다.
예시:
온라인 쇼핑몰에서 장바구니(ShoppingCart
)에 담긴 상품들의 총 가격을 계산하는 기능을 생각해 봅시다.
class ShoppingCart {
private List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
this.items.add(item);
}
public List<Item> getItems() {
return items;
}
// 총 가격을 계산하는 책임은 누가 가져야 할까요?
// public double calculateTotalPrice() { ... }
}
class Item {
private String name;
private double price;
private int quantity;
public Item(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
public double getPrice() {
return price;
}
public int getQuantity() {
return quantity;
}
public String getName() {
return name;
}
}
public class Order {
private ShoppingCart cart;
public Order(ShoppingCart cart) {
this.cart = cart;
}
// 주문 총액을 알고 싶다. 누가 계산해야 할까?
public double getOrderTotal() {
double total = 0;
for (Item item : cart.getItems()) {
total += item.getPrice() * item.getQuantity();
}
return total;
}
}
public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.addItem(new Item("노트북", 1000000, 1));
cart.addItem(new Item("마우스", 30000, 2));
Order order = new Order(cart);
System.out.println("주문 총액: " + order.getOrderTotal());
}
}
위의 예시에서 Order
클래스는 장바구니에 담긴 각 Item
의 가격과 수량 정보를 얻어와 총 가격을 계산하는 책임을 가지고 있습니다. 하지만 총 가격을 계산하는 데 필요한 정보 (Item
의 가격과 수량)는 Item
객체와 ShoppingCart
객체가 가장 잘 알고 있습니다.
Information Expert 패턴을 적용하면 다음과 같이 설계를 변경할 수 있습니다.
class ShoppingCart {
private List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
this.items.add(item);
}
public List<Item> getItems() {
return items;
}
// 정보 전문가: Item 객체의 가격과 수량을 알고 있으므로 총 가격 계산 책임을 가짐
public double calculateTotalPrice() {
double total = 0;
for (Item item : items) {
total += item.getPrice() * item.getQuantity();
}
return total;
}
}
class Item {
private String name;
private double price;
private int quantity;
public Item(String name, double price, int quantity) {
this.name = name;
this.price = price;
this.quantity = quantity;
}
public double getPrice() {
return price;
}
public int getQuantity() {
return quantity;
}
public String getName() {
return name;
}
}
public class Order {
private ShoppingCart cart;
public Order(ShoppingCart cart) {
this.cart = cart;
}
// ShoppingCart에게 총 가격 계산을 위임
public double getOrderTotal() {
return cart.calculateTotalPrice();
}
}
public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.addItem(new Item("노트북", 1000000, 1));
cart.addItem(new Item("마우스", 30000, 2));
Order order = new Order(cart);
System.out.println("주문 총액: " + order.getOrderTotal());
}
}
변경된 설계의 장점:
- 높은 응집도:
ShoppingCart
클래스는 자신이 관리하는Item
들의 총 가격을 계산하는 책임을 가지게 되어 응집도가 높아집니다. - 낮은 결합도:
Order
클래스는Item
객체의 가격이나 수량에 대해 알 필요 없이ShoppingCart
에게 총 가격 계산을 위임하므로 결합도가 낮아집니다. 만약 가격 계산 방식이 변경되더라도ShoppingCart
클래스만 수정하면 됩니다. - 정보 은닉:
Order
클래스는ShoppingCart
내부의Item
정보에 직접 접근할 필요가 없어 정보 은닉이 강화됩니다.
결론적으로, 정보 전문가 패턴은 책임을 필요한 정보를 가진 객체에게 할당함으로써 객체 지향 설계의 기본적인 목표인 높은 응집도와 낮은 결합도를 달성하는 데 중요한 역할을 합니다.