코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

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유연성과 효율성을 높이는 중요한 기능입니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com