책너두 (헤드 퍼스트 디자인 패턴) 28일차 (~386p)

요약

  • 반복자 패턴과 컴포지트 패턴
    • 단일 역할 원칙
    • Iterable 인터페이스 알아보기
    • 향상된 for 순환문 알아보기
    • 객체마을 카페 메뉴 살펴보기
    • 객체마을 카페 메뉴 코드 고치기

메모

단일 역할 원칙

  • 집합체에서
    • 내부 컬렉션 관련 기능
    • 반복자용 메소드 관련 기능
      • 전부 구현하면, 한 클래스에 2가지 역할을 가짐.
      • 만약, 컬렉션이 어떤 이유로 바뀌게 되면 그 클래스가 바뀌어야함.
      • 또, 반복자 관련 기능이 바뀌더라도 그 클래스가 바뀌어야 함.
      • 이러한 이유로 ‘변경’과 관련된 디자인 원칙이 추가됨.
📍 디자인 원칙 : 어떤 클래스가 바뀌는 이유는 하나뿐이어야 한다.
  • 클래스를 고치는 일은 최대한 피해야 함.
    • 코드 변경이 일어나면 여러 문제가 발생할 수 있기 때문.
    • 코드 변경 이유가 2가지나 되면, 그만큼 그 클래스를 나중에 고쳐야 할 가능성이 커짐.
  • 이 원칙에 따르면 하나의 역할은 하나의 클래스에서만 맡아야 함.
    • 이 원칙은 어찌 보면 지키기 쉬울 것 같지만, 매우 지키키 힘들 수 있음.
    • 디자인 시, 역할을 분리하는게 어려움.
    • 시스템이 점점 커짐에 따라 클래스가 바뀌는 부분의 역할이 2가지 이상이 아닌지 열심히 디자인해야 함.

Iterable 인터페이스 알아보기

  • 자바의 모든 컬렉션 유형에 Iterable 인터페이스를 구현함.
  • Iterable 구현하는 클래스는 iterator() 메소드를 구현함.
    • iterator() 메소드에서는 Iterator 인터페이스를 구현하는 반복자를 리턴함.
  • 컬렉션에 있는 항목을 대상으로 반복 작업을 수행하는 forEach() 메소드를 기본 제공함.
  • 자바는 향상된 for 순환문으로 몇 가지 편리한 문법적 기능도 제공함.

향상된 for 순환문 알아보기

List<MenuItem> menuItems = new ArrayList<MenuItem>();

for (MenuItem item : item) {
    System.out.print(menuItem.getName() + ", ");
    System.out.print(menuItem.getPrice() + " -- ");
    System.out.println(menuItem.getDescription());
}
  • ArrayList 는 Iterable 이므로, 다음과 같이 자바의 향상된 for 순환문을 사용할 수 있음.

향상된 for 순환문 사용 시 주의 사항

  • 만약, menuItems 가 ArrayList 가 아닌, 배열을 사용했다면 향상된 for문을 사용할 수 없음.
    • 왜냐면 배열은 Iterable 인터페이스를 구현하지 않기 때문에 printMenu 파라미터로 Iterable을 받을 수 없음.

객체마을 카페 메뉴 살펴보기

  • 식당 합병에 이어, 카페까지 합병한다고 함.
  • p 381 참고

객체마을 카페 메뉴 코드 고치기

  • HashTable(HashMap)도 Iterator 를 지원하는 자바 컬렉션이기 때문에 기존 식당 프레임워크에 추가하기 까다롭지 않음.
    • 대신, ArrayList와 조금 다른식으로 고쳐야 함.
    • 해시맵의 값에 대한 반복자를 리턴함.

댓글

Designed by JB FACTORY