[개념 설명]
IteratorAggregate는 PHP의 SPL(Standard PHP Library)에 내장된 인터페이스입니다. 어떤 객체가 이 인터페이스를 구현하면, foreach 루프에서 사용될 때 어떻게 반복(iterate)해야 하는지를 다른 이터레이터 객체에게 위임할 수 있습니다.
IteratorAggregate는 단 하나의 메소드, getIterator()만 구현하면 됩니다. 이 메소드는 반드시 Traversable 인터페이스(주로 Iterator 또는 다른 IteratorAggregate 객체)를 구현한 객체를 반환해야 합니다.
[왜 Iterator 대신 IteratorAggregate를 사용할까요?]
Iterator 인터페이스는 rewind(), current(), key(), next(), valid()라는 5개의 메소드를 모두 직접 구현해야 합니다. 이는 반복 로직이 복잡하거나, 객체 내부에서 여러 방식으로 반복을 제공해야 할 때 코드를 지저분하게 만들 수 있습니다.
IteratorAggregate를 사용하면 다음과 같은 큰 이점을 얻을 수 있습니다.
1. 캡슐화: 객체의 내부 데이터 구조(예: private 배열)를 외부에 노출하지 않고도 안전하게 반복 기능을 제공할 수 있습니다. foreach는 getIterator()가 반환한 이터레이터를 사용할 뿐, 원래 객체의 내부를 직접 건드리지 않습니다.
2. 코드의 단순함: 이미 존재하는 이터레이터를 반환하기만 하면 되므로, 복잡한 5개의 메소드를 직접 구현할 필요가 없습니다. 코드가 훨씬 간결하고 명확해집니다.
3. 유연성: 동일한 객체라도 상황에 따라 다른 이터레이터를 반환하도록 로직을 구성할 수 있습니다. (예: 정순, 역순, 필터링된 이터레이터 등)
예제 1: 기본 사용법 - 도서관의 책 목록 순회하기
도서관 객체가 내부에 책 목록을 private 배열로 가지고 있다고 가정해 봅시다.
이 책 목록을 외부에서 직접 접근하지 못하게 하면서 foreach로 순회하고 싶습니다.
IteratorAggregate를 사용하지 않은 경우

IteratorAggregate를 사용
getBooks() 같은 public 메소드 없이도 객체 자체를 foreach에 사용할 수 있습니다.

[제너레이터(Generator)와 함께 사용하기]
Iterator 인터페이스를 자동으로 구현하는 가장 간결한 방법입니다. getIterator()에서 제너레이터 함수를 사용하면 코드를 더욱 단순화할 수 있습니다.

객체를 명시적으로 생성하는 대신 제너레이터 yield 키워드를 사용하여 반복 로직을 구현.
복잡한 순회 로직을 구현할 때 유연합니다.
[결론]
IteratorAggregate는 객체지향 설계 원칙, 특히 캡슐화를 지키면서 클래스에 반복 기능을 부여하는 방법입니다.
클래스가 '컬렉션'의 역할을 할 때: 객체가 내부에 여러 아이템을 포함하고 있고, 이를 순회할 필요가 있을 때 먼저 고려해야 할 인터페이스입니다.
반복 로직을 숨기고 싶을 때: 정렬, 필터링, 역순 등 다양한 순회 방식을 제공해야 할 때, getIterator() 내부에 로직을 캡슐화하여 외부에는 단순한 foreach 인터페이스만 제공할 수 있습니다.
내부 구현을 자유롭게 변경하고 싶을 때: 나중에 내부 데이터 구조가 배열에서 SplDoublyLinkedList로 바뀌더라도, getIterator()가 반환하는 이터레이터만 수정하면 되므로 클래스 외부의 코드는 영향을 받지 않습니다.
'PHP' 카테고리의 다른 글
| [PHP] Secure Password Hashing - password_hash()로 비밀번호 저장 (0) | 2025.11.10 |
|---|---|
| [PHP] Constructor Property Promotion (생성자 속성 승격) (0) | 2025.10.27 |
| [PHP] match 표현법 (0) | 2025.10.20 |
| [PHP] 숫자 내장 함수: number_format, round, rand 함수 (0) | 2025.10.13 |
| SQL 문 사용하기 / 공부하기 / DB명령어/ 해석하기 (4) | 2024.05.15 |