반복자
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
반복자 패턴은 객체 지향 프로그래밍에서 컬렉션의 요소에 접근하고 순회하는 방법을 제공하는 디자인 패턴이다. 이 패턴은 컬렉션의 내부 구조를 노출하지 않고 요소에 접근할 수 있게 하며, 요소 접근과 순회 기능을 제공한다. 내부 반복자, 암시적 반복자, 제너레이터, 스트림 등 다양한 형태로 구현될 수 있으며, 프로그래밍 언어별로 구현 방식과 특징이 다르다.
더 읽어볼만한 페이지
- 추상 자료형 - 리스트 (컴퓨팅)
리스트는 컴퓨터 과학에서 항목들을 순서대로 저장하고 관리하는 기본적인 자료 구조이며, 다양한 연산을 지원하고 연결 리스트나 동적 배열 등으로 구현되며 큐, 스택 등 다른 자료형의 기반이 된다. - 추상 자료형 - 스택
스택은 후입선출(LIFO) 원칙에 따라 데이터를 관리하는 추상 자료형으로, push 연산으로 데이터를 쌓고 pop 연산으로 가장 최근 데이터를 제거하며, 서브루틴 호출 관리, 수식 평가, 백트래킹 등에 활용된다. - 컴퓨터 프로그래밍 - 순서도
순서도는 컴퓨터 알고리즘이나 프로세스를 시각적으로 표현하는 도구로, 흐름 공정 차트에서 기원하여 컴퓨터 프로그래밍 분야에서 알고리즘을 설명하는 데 사용되며, 다양한 종류와 소프트웨어 도구가 존재한다. - 컴퓨터 프로그래밍 - 의사코드
의사코드는 컴퓨터 과학 및 수치 계산 분야에서 알고리즘을 설명하기 위해 사용되는 비표준적인 언어로, 자연어와 프로그래밍 언어의 요소를 혼합하여 알고리즘의 논리적 흐름을 이해하기 쉽게 하고 프로그래머가 실제 코드로 구현하기 전에 알고리즘을 설계하고 검토하는 데 유용하다.
반복자 |
---|
2. 패턴
반복자는 컬렉션의 요소에 접근(''요소 접근'')하고, 다음 요소로 접근하기 위해 내부 상태를 변경(''요소 순회'')할 수 있게 해준다.[4] 또한, 첫 번째 요소를 생성 및 초기화하고 모든 요소를 순회했는지 여부를 알려준다.
반복자를 사용하면 컬렉션의 내부 구조와 관계없이 각 요소를 처리할 수 있다.[2] 컬렉션은 다양한 방식으로 요소를 저장할 수 있지만, 사용자는 반복자를 통해 일련의 순서로 접근할 수 있다.
객체 지향 프로그래밍에서 반복자 클래스는 일반적으로 컬렉션 클래스와 밀접하게 연관되어 설계된다. 보통 컬렉션은 반복자를 생성하는 메서드를 제공한다.
루프 카운터를 반복자라고 부르기도 하지만, 루프 카운터는 순회 기능만 제공할 뿐 요소 접근 기능은 없다.
많은 프로그래밍 언어에서 첨자 연산자와 루프 카운터를 사용하여 각 요소에 접근할 수 있지만, 반복자를 사용하면 다음과 같은 장점이 있다.[8]
- 카운팅 루프는 임의 접근이 없거나 느린 리스트 또는 트리와 같은 데이터 구조에는 적합하지 않다.
- 반복자는 모든 종류의 데이터 구조에 대해 일관된 방식으로 반복할 수 있으므로 코드를 더 읽기 쉽고, 재사용 가능하며, 데이터 구조의 변경에 덜 민감하게 만든다.
- 반복자는 요소 건너뛰기 금지 또는 이전에 방문한 요소 재접근 금지와 같은 추가적인 접근 제한을 적용할 수 있다.
- 반복자는 반복자를 무효화하지 않고 컬렉션 객체를 수정할 수 있게 해준다. 예를 들어 반복자가 첫 번째 요소를 지난 경우, 컬렉션 시작 부분에 예측 가능한 방식으로 요소를 추가할 수 있다.
3. 내부 반복자
내부 반복자는 컬렉션 자체가 반복 로직을 처리하는 방식이다. 주로 고차 함수를 사용하여 구현되며, 각 요소에 적용할 연산을 함수 형태로 전달한다. 내부 반복자는 외부 반복자에 비해 코드가 간결하고 가독성이 높다는 장점이 있다. 그러나 반복 로직을 세밀하게 제어하기 어렵다는 단점이 있다. 파이썬의 `map` 함수는 내부 반복자의 한 예이다.
예를 들어, 파이썬의 `map` 함수는 호출자가 정의한 함수를 각 요소에 적용한다.
```python
digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squared_digits = map(lambda x: x**2, digits)
# 이 반복자를 순회하면 0, 1, 4, 9, 16, ..., 81이 된다.
```
내부 이터레이터는 해시 등의 객체가 고차 함수로 구현한 이터레이터를 말한다. 주로 객체 지향 프로그래밍의 성질에 기반하여, 일반적으로 외부에서 명시적으로 사용하지 않는 이터레이터를 지칭한다.
루비에서는 열거형이 `each`와 같은 반복 메서드를 가지고 있는 내부 반복자이다. `each` 메서드 호출에 `{ ... }` 형식으로 "블록"을 쓰면, 그 안의 절차가 반복 실행된다.
```ruby
class MyObj
def my123
yield 1
yield 2
yield 3
end
end
arr = ["a", "b", "c"]
arr.each do |x|
p x
end
obj = MyObj.new
obj.my123 do |x|
p x
end
4. 암시적 반복자
암시적 반복자는 프로그래밍 언어 자체에서 제공하는 반복 기능으로, 명시적인 반복자 객체를 사용하지 않고도 컬렉션의 요소를 순회할 수 있게 해준다. 주로 `foreach` 문과 같은 형태로 제공된다.[4][6]
C#, C++, 델파이, Go, Java, Lua, Perl, Python, Ruby 등 많은 객체 지향 프로그래밍 언어에서 암시적 반복자를 지원한다.[4][6]
각 언어별 예시
- C#
// implicit version
foreach (MyType value in list)
Console.WriteLine(value);
- C++
//in C++11
for(auto i:items){
std::cout << i; // And print value of 'items'
}
- Java
Iterator iter = list.iterator();
//Iterator
while (iter.hasNext()) {
System.out.print(iter.next());
if (iter.hasNext())
System.out.print(", ");
}
- Python
for value in iterable:
print(value)
- Ruby
iterable.each do |value|
puts value
end
이러한 반복 스타일은 코드 실행이 반복 가능한 객체의 컨텍스트 내에서 완전히 이루어지므로 "내부 반복"이라고 불리기도 한다.
리스트 컴프리헨션을 지원하는 언어에서는 결과 리스트를 구성하는 동안 암시적 반복자를 사용하기도 한다.
- Python 리스트 컴프리헨션 예시:
names = [person.name for person in roster if person.male]
C++ 언어에는 `for_each()`와 같이 암시적 반복을 위한 함수 템플릿이 몇 가지 있다.
델파이에서는 버전 2005부터 `for-in` 구문을 사용한 반복자가 있다.
- 델파이 예시:
```delphi
for item in items do
Writeln(item);
5. 제너레이터
코루틴의 제한된 형태인 제너레이터를 사용하면 반복자를 구현할 수 있다. 서브루틴과 달리 제너레이터 코루틴은 한 번만 반환하지 않고 여러 번 호출자에게 값을 '양보(yield)'할 수 있다.[5] 대부분의 반복자는 제너레이터로 표현할 수 있지만, 제너레이터는 호출 간에 로컬 상태를 보존하므로 트리 순회와 같이 복잡한 상태를 가진 반복자에 특히 적합하다.[5]
파이썬에서 제너레이터는 반복자 생성자이다. 즉, 반복자를 반환하는 함수이다. 다음은 파이썬의 `yield` 문을 사용하여 피보나치 수에 대한 반복자를 반환하는 파이썬 제너레이터의 예시이다.
```python
def fibonacci(limit):
a, b = 0, 1
for _ in range(limit):
yield a
a, b = b, a + b
for number in fibonacci(100): # 제너레이터는 반복자를 생성한다.
print(number)
```
파이썬은 일종의 코루틴을 기술할 수 있는 제너레이터도 있다. 제너레이터는 이터레이터를 반환하는 함수이며, yield 문을 통해 `__next__()`로 실행되는 절차를 차례로 기술할 수 있다.
```python
def fruit_generator():
yield 'banana' # 첫 번째 __next__()에 의해 여기까지 실행되어 'banana'를 반환
yield 'apple' # 다음 __next__()에 의해 여기까지 실행되어 'apple'을 반환
yield 'orange' # 3번째 __next__()에 의해 여기까지 실행되어 'orange'를 반환
for fruit in fruit_generator():
print(fruit)
it = fruit_generator()
print(next(it))
print(next(it))
print(next(it))
print(next(it)) # 이 행에서 StopIteration 예외가 발생한다.
```
C# 2.0 및 VB.NET 11은 반복자 형태로 제너레이터 (generator)를 지원한다. 제너레이터는 `IEnumerator` 또는 `IEnumerable`을 반환하도록 선언된 메서드이지만, 객체 인스턴스를 반환하는 대신 요소의 시퀀스를 생성하기 위해 `yield return` 문을 사용한다. yield 문을 사용하여 작성된 제너레이터는 컴파일러에 의해 적절한 인터페이스를 구현하는 새로운 클래스로 변환된다. 단, 제너레이터(반복자)는 `IEnumerator.Reset()` 메서드를 지원하지 않는다.
```csharp
// 반복자 작성 예시.
static IEnumerable
yield return 1;
yield return -1;
yield return 0;
yield break;
}
IEnumerable
// 열거에 의해 메서드의 본문이 순차적으로 "지연 실행"된다 (중단과 재개를 반복한다).
foreach (int element in elements) {
Console.WriteLine(element);
}
```
```vbnet
Shared Iterator Function MyIteratorMethod() As IEnumerable(Of Integer)
Yield 1
Yield -1
Yield 0
Return
End Function
Dim elements As IEnumerable(Of Integer) = MyIteratorMethod()
For Each element As Integer In elements
Console.WriteLine(element)
Next
6. 스트림
반복자는 입력 스트림의 유용한 추상화로, 잠재적으로 무한한 반복 가능(하지만 반드시 인덱싱 가능하지는 않음)한 객체를 제공한다. 펄, 파이썬과 같은 여러 언어는 스트림을 반복자로 구현한다. 파이썬에서 반복자는 데이터 스트림을 나타내는 객체이다.[7] 스트림의 대체 구현에는 데이터 중심 프로그래밍 언어인 AWK, sed가 있다.
파이썬은 다음 요소를 반환하는 `__next__()` 메서드를 가진 객체를 외부 이터레이터로 사용한다. 컨테이너 객체의 `__iter__()` 메서드가 이터레이터를 반환한다. (편의상, 이터레이터의 `__iter__()`는 자신을 반환한다)
일반적인 프로그래밍에서는 `obj.__iter__()`처럼 직접 호출하는 것이 아니라, 내장 함수 iter를 사용하여 `iter(obj)`처럼 사용한다. 마찬가지로, 일반적인 용법으로 호출하는 것을 전제로 할 경우 `__next__()`가 아닌 `next()`를 사용한다. for 문 (Foreach 문)은 이터레이터를 사용할 수 있는 경우 이터레이터를 사용하지만, 그렇지 않은 컨테이너 객체에 대해서는 직접 `__getitem__()` 메서드를 통해 요소를 가져와 반복을 실행한다.
파이썬 코드 예시:
```python
cont = iteratable_container()
# 이터레이터를 직접 사용
it = iter(cont)
while 1:
try:
print it.next()
except StopIteration:
# 요소가 남아 있지 않다면,
# next()는 StopIteration 예외를 발생시킨다
break
# for문에서 사용
for element in cont:
print element
```
또한, 파이썬에는 일종의 코루틴을 기술할 수 있는 제너레이터도 있다. 제너레이터는 이터레이터를 반환하는 함수이며, yield 문을 통해 `__next__()`로 실행되는 절차를 차례로 기술할 수 있다.
```python
def fruit_generator():
yield 'banana' # 첫 번째 __next__()에 의해 여기까지 실행되어 'banana'를 반환
yield 'apple' # 다음 __next__()에 의해 여기까지 실행되어 'apple'을 반환
yield 'orange' # 3번째 __next__()에 의해 여기까지 실행되어 'orange'를 반환
for fruit in fruit_generator():
print(fruit)
it = fruit_generator()
print(next(it))
print(next(it))
print(next(it))
print(next(it)) # 이 행에서 StopIteration 예외가 발생한다
7. 인덱싱과의 비교
많은 프로그래밍 언어에서 첨자 연산자와 루프 카운터를 사용하여 각 요소에 접근할 수 있다. 인덱싱을 컬렉션과 함께 사용할 수도 있지만, 반복자를 사용하면 다음과 같은 장점이 있다:[8]
- 카운팅 루프는 모든 데이터 구조에 적합하지 않다. 특히 임의 접근이 없거나 느린 리스트 또는 트리와 같은 데이터 구조에는 적합하지 않다.
- 반복자는 모든 종류의 데이터 구조에 대해 일관된 방식으로 반복할 수 있다. 따라서 코드를 더 읽기 쉽고, 재사용 가능하며, 데이터 구조의 변경에 덜 민감하게 만든다.
- 반복자는 요소 건너뛰기 금지 또는 이전에 방문한 요소의 재접근 금지와 같은 추가적인 접근 제한을 적용할 수 있다.
- 반복자는 반복자를 무효화하지 않고 컬렉션 객체를 수정할 수 있다. 예를 들어, 반복자가 첫 번째 요소를 지나 진행되면 예측 가능한 결과로 컬렉션의 시작 부분에 추가 요소를 삽입할 수 있다. 인덱싱의 경우, 인덱스 번호가 변경되어야 하므로 문제가 된다.
8. 분류
반복자는 기능에 따라 여러 범주로 분류할 수 있다. 다음은 반복자 범주의 (비전체적인) 목록이다.
9. 언어별 반복자
반복자는 다양한 프로그래밍 언어에서 컬렉션의 요소에 접근하고 순회하는 데 사용되는 중요한 개념이다. 각 언어는 고유한 방식으로 반복자를 구현하고 활용한다.
유형 | 언어 |
---|---|
배열 반복자 | PHP, R |
캐싱 반복자 | PHP |
상수 반복자 | C++, PHP |
디렉토리 반복자 | PHP, 파이썬 |
필터 반복자 | PHP, R |
제한 반복자 | PHP |
리스트 반복자 | 자바, R |
재귀 배열 반복자 | PHP |
XML 반복자 | PHP |
- C# (.NET): C#에서 반복자는 "열거자"라고 불리며 `IEnumerator` 인터페이스로 표현된다.[15][16] `IEnumerator`는 다음 요소로 이동하고 컬렉션의 끝에 도달했는지 여부를 나타내는 `MoveNext()` 메서드와 현재 가리키고 있는 요소의 값을 얻는 `Current` 속성을 제공한다.
- C++ STL은 반복자 틀을 정의하고 있으며, 반복자는 기능에 따라 여러 종류로 나뉜다. 예를 들어 `std::vector` 컨테이너의 반복자와 같은 「임의 접근 반복자」와 `std::list` 컨테이너의 반복자와 같은 「양방향 반복자」는 모두 증가/감소 연산자(++, --)를 사용하여 바로 다음/이전 요소를 가리킬 수 있다.
- Java: Java영어에서는 `Iterator` 인터페이스를 구현하는 객체를 외부 반복자로 취급할 수 있다. Java 1.5 이후의 `Iterator`는 제네릭스를 지원한다.[4]
- Scala에서 반복자는 컬렉션과 유사한 풍부한 메서드 집합을 가지고 있으며, `for` 루프에서 직접 사용할 수 있다. 반복자와 컬렉션은 공통 기본 트레이트인 `scala.collection.TraversableOnce`에서 상속된다.
- PHP에서는 `Iterator` 인터페이스를 구현하여 반복자를 정의할 수 있다. `Iterator` 인터페이스를 구현한 객체는 `foreach` 루프를 사용하여 순회할 수 있다.[4] 또한, 배열은 `Iterator` 인터페이스를 암묵적으로 구현한다.
- 파이썬에서 반복자는 언어의 기본적인 부분이며, `for` 루프, 리스트 컴프리헨션, 제너레이터 표현식 등에서 암묵적으로 사용된다.[4][6] 파이썬에서 컬렉션 객체는 직접 반복할 수 있다.
- 루비에서는 열거형이 `each`와 같은 반복 메서드를 가지고 있는 내부 반복자이다.[4][6]
- Rust는 표준 라이브러리 전체에서 외부 반복자를 사용하며, `for` 루프는 반복자를 암묵적으로 사용한다. `IntoIterator` 트레이트를 구현하는 타입은 `into_iter()` 메서드를 통해 반복자를 반환한다.
- Raku에서 반복자는 언어의 기본적인 부분이며, `for` 루프, `map`, `grep`, 리스트 인덱싱 등에서 암묵적으로 사용된다. `iterator` 메서드를 통해 `Iterator` 객체를 얻을 수 있고, `pull-one` 메서드를 통해 다음 값을 얻을 수 있다.
- MATLAB은 "네이티브" 배열 또는 `cell` 배열을 사용하여 외부 및 내부 암시적 반복을 모두 지원한다. `for` 루프를 사용하여 배열을 순회할 수 있다.
- D 언어에서는 표준 라이브러리에 레인지(Range)라는 반복자가 정의되어 있으며, 규정된 인터페이스를 가진 객체라면 무엇이든 레인지로 취급할 수 있다.[1]
- 델파이(Delphi)에서는 버전 2005부터 `for-in` 구문을 사용한 반복자가 있다. 사용자가 정의하는 반복자는 `MoveNext` 메서드와 `Current` 속성을 임의의 클래스 등에 구현함으로써 정의할 수 있다.
- Perl에는
foreach
,each
와 같은 반복 키워드가 있다. 그 외에, Tie 기능 (변수 조작의 오버로드)으로 사용자 데이터에 대한 반복자를 정의할 수 있다.
9. 1. C# (.NET)
C#에서 반복자는 "열거자"라고 불리며 `IEnumerator` 인터페이스로 표현된다.[15][16] `IEnumerator`는 다음 요소로 이동하고 컬렉션의 끝에 도달했는지 여부를 나타내는 `MoveNext()` 메서드를 제공하며,[15][16][17] 현재 가리키고 있는 요소의 값을 얻는 `Current` 속성을 제공한다.[15][16][17] 또한 열거자를 초기 위치로 되돌리는 선택적 `Reset()` 메서드를 제공한다.[15] 열거자는 처음 요소 앞에 있는 특수한 값을 처음에는 가리키므로 반복을 시작하려면 `MoveNext()`를 호출해야 한다.열거자는 일반적으로 `IEnumerable` 인터페이스를 구현하는 객체의 `GetEnumerator()` 메서드를 호출하여 얻는다.[16][17] 컨테이너 클래스는 일반적으로 이 인터페이스를 구현한다. 그러나 C#의 `foreach` 문은 `IEnumerable`을 구현하지 않더라도(덕 타이핑) 그러한 메서드를 제공하는 모든 객체에서 작동할 수 있다.[17] 두 인터페이스는 .NET 2.0에서 제네릭 버전으로 확장되었다.
다음은 C# 2.0에서 반복자의 간단한 사용법을 보여준다.
```csharp
// 명시적 버전
IEnumerator
while (iter.MoveNext())
Console.WriteLine(iter.Current);
// 암시적 버전
foreach (MyType value in list)
Console.WriteLine(value);
```
C# 2.0은 또한 제너레이터를 지원한다. `IEnumerator`(또는 `IEnumerable`)를 반환하도록 선언되었지만 객체 인스턴스를 반환하는 대신 "`yield return`" 문을 사용하여 일련의 요소를 생성하는 메서드는 컴파일러에 의해 적절한 인터페이스를 구현하는 새 클래스로 변환된다.
9. 2. C++
C++ STL은 반복자 틀을 정의하고 있다. 이 틀은 포인터와 구문상 호환성을 갖도록 규정되어 있어, 포인터를 사용하는 코드와 동등한 코드로 반복자를 사용할 수 있다.[4] 반복자는 컬렉션의 요소에 접근(''요소 접근'')하고, 다음 요소에 접근하기 위해 내부 상태를 변경(''요소 순회'')하는 기능을 제공한다.[4]C++에서 반복자는 기능에 따라 여러 종류로 나뉜다. 예를 들어, `std::vector` 컨테이너의 반복자와 같은 「임의 접근 반복자」와 `std::list` 컨테이너의 반복자와 같은 「양방향 반복자」는 모두 증가/감소 연산자(++, --)를 사용하여 바로 다음/이전 요소를 가리킬 수 있다. 하지만, 임의의 폭으로 덧셈/뺄셈 연산은 임의 접근 반복자에서만 정의되어 있다. 임의 접근 반복자는 양방향 반복자의 일종이지만, 반복자 진행 조작이 상수 시간 내에 실행될 수 있다는 조건이 추가된다.[27] `std::list` 컨테이너의 요소는 앞뒤 요소에 대한 포인터만 가지고 있기 때문에 순차 접근만 가능하며, 반복자의 진행 조작이 상수 시간 내에 실행될 수 없어 임의 접근 반복자를 지원할 수 없다.
다음은 `std::vector`를 사용한 반복자 예시이다.
std::vector
items.push_back(1); // items에 정수 1 추가
items.push_back(2); // items에 정수 2 추가
items.push_back(3); // items에 정수 3 추가
for (std::vector
std::cout << *i; // 현재 인덱스의 items 값 출력
}
// C++11부터는 범위 기반 for 루프를 사용하여 반복자를 더 쉽게 사용할 수 있다.
for (auto i : items) {
std::cout << i; // items 값 출력
}
//결과: 123
C++11부터는 범위 기반 `for` 루프를 사용하여 반복자를 더 쉽게 사용할 수 있다.
원래 C++의 반복자는 템플릿을 사용한 정적 덕 타이핑에 기반하며, 각 반복자의 요구 사항 정의는 규격으로 문서화되었지만, 언어 구문으로는 지원되지 않았다. 그러나 C++20에서는 컨셉(concept)을 지원하게 됨으로써, `std::random_access_iterator`나 `std::bidirectional_iterator` 등의 형태로 충족해야 할 요건을 코드로 작성할 수 있게 되었다.[28][29]
9. 3. Java
javaimport java.util.*;
// ...
final List list = new ArrayList();
// Java 1.5 이후는 다음과 같이 쓸 수도 있다.
//final List
참조
[1]
웹사이트
Understanding and Using Iterators
https://www.perl.com[...]
Perl.com
2012-08-08
[2]
웹사이트
A Technique for Generic Iteration and Its Optimization
https://www.csd.uwo.[...]
The University of Western Ontario, Department of Computer Science
2012-08-08
[3]
웹사이트
STL Iterators
http://www.cprogramm[...]
Cprogramming.com - Your resource for C and C++
2012-08-08
[4]
웹사이트
Difference between an external iterator and an internal iterator
http://www.careerrid[...]
CareerRide.COM
2012-08-08
[5]
웹사이트
A Technique for Generic Iteration and Its Optimization
http://www.csd.uwo.c[...]
The University of Western Ontario, Department of Computer Science
2012-08-08
[6]
서적
Head First Design Patterns
http://shop.oreilly.[...]
O'REILLY
2012-08-09
[7]
웹사이트
Glossary — Python 3.8.4 documentation
https://docs.python.[...]
2020-07-15
[8]
웹사이트
index vs iterator
http://bytes.com/
BYTES
2012-08-08
[9]
웹사이트
C++ Iteratoren: Iterator-Kategorien
http://www.phpro.org[...]
cppreference.com
2012-08-09
[10]
웹사이트
Iterators: Concepts
http://www.sgi.com/t[...]
sgi
2012-08-09
[11]
웹사이트
Types of iterator: Output vs. input vs. forward vs. random access iterator
https://stackoverflo[...]
stackoverflow
2012-08-09
[12]
웹사이트
Introduction to SPL: Introduction to Standard PHP Library (SPL)
http://www.phpro.org[...]
PHPRO.ORG
2012-08-09
[13]
웹사이트
Iterators in R
http://www.exegetic.[...]
2013-11-16
[14]
웹사이트
concurrent_unordered_set Template Class
http://threadingbuil[...]
Intel Threading Building Blocks for Open Source
2012-08-09
[15]
서적
C# 10 in a Nutshell
O'Reilly
2022
[16]
서적
C# in Depth
Manning
2019-03-23
[17]
서적
C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development: Build Applications with C#, .NET Core, Entity Framework Core, ASP.NET Core, and ML.NET Using Visual Studio Code
Packt
[18]
서적
"Effective Java: Programming Language Guide"
Addison-Wesley
[19]
웹사이트
java.util: Interface Iterator
[20]
웹사이트
PHP 4 ChangeLog
https://secure.php.n[...]
The PHP Group
2000-02-20
[21]
문서
Internal refers to the fact that the interface cannot be implemented in PHP scripts, only in the [[C (programming language)]] source.
[22]
웹사이트
The Traversable interface
https://secure.php.n[...]
The PHP Group
2015-10-13
[23]
웹사이트
Iterators
https://secure.php.n[...]
The PHP Group
2015-10-13
[24]
웹사이트
PHP 5 ChangeLog
https://secure.php.n[...]
The PHP Group
2013-06-20
[25]
문서
JISC 日本産業標準調査会
https://www.jisc.go.[...]
[26]
문서
繰り返し子(くりかえしし)という訳もあるが一般的ではない。「Rubyプログラミング入門」著者: 原信一郎、出版: オーム社、p.197。
[27]
문서
C++ named requirements: LegacyRandomAccessIterator - cppreference.com
https://en.cpprefere[...]
[28]
문서
random_access_iterator - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[29]
문서
std::random_access_iterator - cppreference.com
https://en.cpprefere[...]
[30]
문서
JIS X 3015「プログラム言語C#」p.64より引用。
[31]
문서
反復子 (C#) | Microsoft Docs
https://docs.microso[...]
[32]
문서
yield (C# リファレンス) | Microsoft Docs
https://docs.microso[...]
[33]
문서
yield (C# リファレンス) | Microsoft Docs - Visual Studio 2008
https://docs.microso[...]
[34]
문서
IEnumerable・IEnumerator - Programming/.NET Framework/列挙操作と列挙子 - 総武ソフトウェア推進所
http://smdn.jp/progr[...]
[35]
문서
IEnumerator.Reset Method (System.Collections) | Microsoft Docs
https://docs.microso[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com