PHP Iterables
PHP 반복 가능한 데이터(Iterables): 순차적으로 처리할 수 있는 데이터 구조
- *PHP Iterables(반복 가능한 데이터)**는 배열과 객체처럼 순차적으로 처리할 수 있는 데이터 구조를
의미합니다. PHP에서 iterable이라는 타입은 배열과
Traversable
인터페이스를 구현한 객체를 받아들일 수 있으며, 이들을 **foreach
*와 같은 반복문에서 사용할 수 있습니다. 이를 통해 함수나 메서드가 다양한 반복 가능한 데이터를 처리할 수 있게 됩니다.
이 가이드에서는 PHP 반복 가능한 데이터의 개념, iterable 타입 선언, 반복 가능한 데이터 사용법, Iterator 인터페이스 및 실용적인 예제를 다룹니다.
1. PHP에서 Iterable이란?
Iterable은 배열과 **Traversable
**을 구현한 객체를 포함하여, 순차적으로 접근할 수 있는
데이터 구조를 의미합니다. 이를 통해 하나의 함수나 메서드가 배열 또는 객체 모두를 처리할 수 있게 됩니다.
1.1 Iterable의 특징
- 배열 및 Traversable 인터페이스를 구현한 객체가 포함됩니다.
foreach
같은 반복문에서 사용 가능합니다.- 함수 인자 또는 반환 값으로
iterable
타입을 명시하여 배열과 객체 모두를 처리할 수 있습니다.
2. iterable
타입 선언
PHP 7.1부터는 iterable
타입을 명시적으로 함수나 메서드의 매개변수나 반환 타입으로
사용할 수 있습니다. 이를 통해 배열이나 Traversable
객체를 모두 처리할 수 있게 됩니다.
2.1 iterable
타입 선언 예제
<?php
function printItems(iterable $items) {
foreach ($items as $item) {
echo $item . "<br>";
}
}
// 배열 사용
$fruits = ["apple", "banana", "cherry"];
printItems($fruits); // 결과: apple, banana, cherry
// Traversable 객체 사용
class ItemCollection implements IteratorAggregate {
private $items = [];
public function __construct($items) {
$this->items = $items;
}
public function getIterator(): Traversable {
return new ArrayIterator($this->items);
}
}
$items = new ItemCollection(["item1", "item2", "item3"]);
printItems($items); // 결과: item1, item2, item3
?>
설명:
iterable
타입 선언을 통해 함수가 배열과Traversable
객체를 모두 처리할 수 있습니다.IteratorAggregate
인터페이스는getIterator()
메서드를 통해 반복 가능한 객체를 반환하며, 이 객체는foreach
문에서 사용할 수 있습니다.
3. 반복 가능한 데이터 사용법
PHP에서는 **foreach
**를 사용해 배열이나 객체를 손쉽게 반복할 수 있습니다.
iterable 타입은 이러한 반복 가능한 구조를 처리하는 데 매우 유용합니다.
3.1 배열과 객체를 foreach
로 반복하기
<?php
// 배열 반복
$numbers = [1, 2, 3, 4];
foreach ($numbers as $number) {
echo $number . "<br>";
}
// Traversable 객체 반복
class NumberCollection implements IteratorAggregate {
private $numbers;
public function __construct($numbers) {
$this->numbers = $numbers;
}
public function getIterator(): Traversable {
return new ArrayIterator($this->numbers);
}
}
$collection = new NumberCollection([10, 20, 30]);
foreach ($collection as $number) {
echo $number . "<br>";
}
?>
설명:
- 배열과 객체 모두
foreach
문을 사용해 반복할 수 있습니다. IteratorAggregate
인터페이스는 객체를 반복 가능한 데이터 구조로 변환하여 사용할 수 있게 합니다.
4. Traversable
인터페이스와 Iterator
인터페이스
- *
Traversable
*은 PHP에서 반복 가능한 객체를 나타내는 인터페이스로, 직접 구현할 수는 없지만 이를 구현하는 **Iterator
*나IteratorAggregate
인터페이스를 통해 반복 기능을 제공할 수 있습니다.
4.1 Iterator
인터페이스 사용
Iterator
인터페이스를 구현하면, 객체를 반복 가능한 구조로 만들 수 있습니다. Iterator
는
반복을 위한 5가지 메서드를 구현해야 합니다: current()
, next()
, key()
,
rewind()
, valid()
.
4.2 Iterator
구현 예제
<?php
class MyIterator implements Iterator {
private $data = [];
private $position = 0;
public function __construct($data) {
$this->data = $data;
}
public function current() {
return $this->data[$this->position];
}
public function key() {
return $this->position;
}
public function next() {
$this->position++;
}
public function rewind() {
$this->position = 0;
}
public function valid() {
return isset($this->data[$this->position]);
}
}
$myIterator = new MyIterator(["apple", "banana", "cherry"]);
foreach ($myIterator as $key => $value) {
echo "$key: $value<br>";
}
?>
설명:
MyIterator
클래스는Iterator
인터페이스를 구현하여 반복 가능한 객체로 만듭니다.Iterator
인터페이스는 5개의 메서드(current()
,key()
,next()
,rewind()
,valid()
)를 구현하여 객체를 순차적으로 처리할 수 있게 합니다.
5. yield
키워드와 제너레이터
PHP에서는 yield
키워드를 사용해 **제너레이터(Generator)**를 생성할 수 있습니다. 제너레이터는 반복 가능한
데이터를 한 번에 하나씩 생성하며, 메모리 효율성을 높이는 데 유용합니다.
5.1 yield
를 사용한 제너레이터 예제
<?php
function getNumbers() {
for ($i = 1; $i <= 5; $i++) {
yield $i;
}
}
foreach (getNumbers() as $number) {
echo $number . "<br>";
}
?>
설명:
yield
키워드를 사용해 제너레이터를 정의하고, 반복 시마다 하나씩 값을 반환합니다.- 제너레이터는 메모리 효율성이 뛰어나며, 대량의 데이터를 처리할 때 유용합니다.
6. Iterable의 실용적인 예제
6.1 여러 타입의 반복 가능한 데이터 처리
<?php
function processItems(iterable $items) {
foreach ($items as $item) {
echo $item . "<br>";
}
}
// 배열 처리
processItems([10, 20, 30]);
// Iterator 객체 처리
class CustomCollection implements IteratorAggregate {
private $items;
public function __construct($items) {
$this->items = $items;
}
public function getIterator(): Traversable {
return new ArrayIterator($this->items);
}
}
$collection = new CustomCollection([100, 200, 300]);
processItems($collection);
?>
설명:
processItems()
함수는iterable
타입을 받아들이며, 배열과 객체 모두 처리할 수 있습니다.- 이를 통해 함수가 더 유연하게 다양한 데이터 구조를 처리할 수 있게 됩니다.
7. PHP Iterable 사용 시 장점
- 유연성:
iterable
타입을 사용하면 배열뿐만 아니라 반복 가능한 객체도 처리할 수 있어 함수의 유연성이 높아집니다. - 메모리 효율성: 제너레이터(
yield
)를 사용하면 데이터를 한 번에 하나씩 생성하여 메모리를 절약할 수 있습니다. - 복잡한 데이터 구조 처리: 반복 가능한 데이터 구조를 쉽게 구현하고 처리할 수 있어 복잡한 데이터 처리가 용이해집니다.
요약
PHP에서 Iterable은 배열과 반복 가능한 객체를 포함하는 데이터 타입으로,
순차적으로 접근할 수 있는 데이터를 처리하는 데 사용됩니다. iterable
타입 선언을 통해 함수나 메서드에서 배열과
객체를 모두 처리할 수 있으며, Iterator 인터페이스를 구현하면 사용자 정의 객체도 반복 가능하게 만들 수 있습니다.
**제너레이터(yield)**는 메모리를 효율적으로 사용하는 **반복 방식**을 제공합니다. iterable은 유연성과 효율성을 높이는 중요한
기능입니다.