βοΈ Java Design-Pattern β ‘ - Iterator
βοΈ Java Design-Pattern β
‘ - Iterator
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Iterator
ν¨ν΄μ΄λ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// λ°λ³΅λ¬Έ
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// μμ
arr[0]
arr[1]
arr[2]
// ...
arr[i]
// ...
arr[arr.length - 1]
Iterator
ν¨ν΄μ λ°λ³΅λ¬Έμμ μ¬μ©λλ λ³μi
μ κΈ°λ₯μ μΆμννμ¬ μΌλ°νν ν¨ν΄μ΄λ€.- ν΄λΉ ν¨ν΄μ μμκ° λͺ¨μ¬ μμ λ μ΄λ₯Ό μμλλ‘ κ°λ¦¬ν€λ©° μ 체λ₯Ό κ²μνκ³ λμΌ μ²λ¦¬λ₯Ό λ°λ³΅νλ€.
μμ νλ‘κ·Έλ¨
- μ λ€μ΄μ΄κ·Έλ¨μ μ 무μ ν΄λΉνλ νμ μ 무λͺ μ μ°¨λ‘λλ‘ νμνλ νλ‘κ·Έλ¨μ λνλΈλ€.
- μ 무μ νμ μ 무λ νμκ° μ§ννλ ν μ΄ νλ‘μ νΈ λλ©μΈμ΄λ€.
- νλ‘μ νΈλ μ λ¬΄λ‘ κ΅¬μ±λμ΄ μκ³ , κ° μ 무λ νμ μ λ¬΄λ‘ κ΅¬μ±ν μμ μ΄λ€.
1
2
3
public interface Iterable<E> {
public abstract Iterator<E> iterator();
}
- λ°λ³΅ κ°λ₯ν κ°μ²΄λ€.
iterator()
λ©μλλ₯Ό ν΅ν΄ μ€μ λ‘ λ°λ³΅μ μννλIterator<E>
λ°λ³΅μλ₯Ό λ°ννλ€.
1
2
3
4
public interface Iterator<E> {
public abstract boolean hasNext();
public abstract E next();
}
- λ°λ³΅μ μννλ κ°μ²΄λ€.
hasNext()
λ©μλλ₯Ό ν΅ν΄ λ€μ μμμ μ‘΄μ¬ μ¬λΆλ₯Ό λ°ννλ€.next()
λ©μλλ₯Ό ν΅ν΄ μμλ₯Ό νλ λ°ννκ³ , μΈλ±μ€κ° λ€μ μμλ₯Ό κ°λ¦¬ν€λλ‘ νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SubTask {
private String name;
private String description
public SubTask(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}
- νμμ 무μ ν΄λΉνλ ν΄λμ€λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.Iterator;
public class Task implements Iterable<SubTask> {
private SubTask[] subTasks;
private int last = 0;
public Task(int maxsize) {
this.subTasks = new SubTasks[maxsize];
}
public Book getSubTaskAt(int index) {
return subTasks[index];
}
public void appendSubTask(SubTask subTask) {
this.subTasks[last] = subTask;
last++;
}
public int getLength() {
return last;
}
@Override
public Iterator<SubTask> iterator {
return new TaskIterator(this);
}
}
- μ 무μ ν΄λΉνλ ν΄λμ€λ€.
- μμ±μμ μΈμλ₯Ό ν΅ν΄ ν΄λΉ μ 무μ μ΅λ νμ μ 무 κ°μκ° μ ν΄μ§λ€.
- νλ μ κ·Όμ νμλ₯Ό
private
λ‘ μ μΈνμ¬ μΈλΆμμ μ κ·Όνμ§ λͺ»νλλ‘ λ°©μ§νλ€. getSubTaskAt(int index)
λ©μλλ₯Ό ν΅ν΄ νμ¬ μΈλ±μ€κ° μ΄λ€ νμ μ 무λ₯Ό κ°λ¦¬ν€λ μ§ μ μ μλ€.appendSubTask(SubTask subTask)
λ©μλλ₯Ό ν΅ν΄ νμ μ 무λ₯Ό μΆκ°ν μ μλ€.getLength()
λ©μλλ₯Ό ν΅ν΄ νμ¬ νμ μ 무μ κ°μλ₯Ό μ μ μλ€.iterator()
λ©μλλ₯Ό ν΅ν΄ νμ μ 무λ₯Ό μ°¨λ‘λλ‘ μννλ©° μ²λ¦¬ν μ μλTaskIterator()
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Iterator;
import java.util.NoSuchElementException;
public class TaskIterator implements Iterator<Book> {
private Task task;
private int index;
public TaskIterator(Task task) {
this.task = task;
this.index = 0;
}
@Override
public boolean hasNext() {
if (index < task.getLength()) {
return true;
} else {
return false;
}
}
@Override
public SubTask next() {
if (!hasNext) {
throw new NoSuchElementException();
}
SubTask subTask = task.getSubTaskAt(index);
index++;
return subTask;
}
}
- μ 무 λ°λ³΅μμ ν΄λΉνλ ν΄λμ€λ€.
Task
νλλ νμ¬ λμμΌλ‘ νλ μ 무μ΄λ©°,index
νλλ κ°λ¦¬ν€κ³ μλ νμ μ 무μ μμλ₯Ό μλ―Ένλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main {
public static void main(String[] args) {
Task task = new Task(3);
task.appendSubTask(new SubTask("μ€κ³", "νλ‘μ νΈ μ€κ³λ₯Ό μλ―Ένλ€."));
task.appendSubTask(new SubTask("ꡬν", "μ€κ³λλ‘ κ΅¬ννλ€."));
task.appendSubTask(new SubTask("ν
μ€νΈ", "ꡬνν λΆλΆμ ν
μ€νΈνλ€."));
// λͺ
μμ μ¬μ©
Iterator<SubTask> it = task.iterator();
while (it.hasNext) {
SubTask subTask = it.next();
System.out.println(subTask.getName());
System.out.println(subTask.getDescription());
}
// νμ₯ forλ¬Έ μ¬μ©
/*
for (SubTask subTask : Task) {
System.out.println(subTask.getName());
System.out.println(subTask.getDescription());
}
*/
}
}
- νλ‘κ·Έλ¨μ λ©μΈ ν΄λμ€μ΄λ€.
- λͺ
μμ μ¬μ© μ½λμ
for-each
λ¬Έμ μ¬μ©ν μ½λλ μμ ν κ°μ λμμ μννλ€. - μΌλ°μ μΌλ‘ μλ°μ
for-each
λ¬ΈμIterator
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€μ κ²½μ°, λ΄λΆμ μΌλ‘Iterator
λ₯Ό μ¬μ©νμ¬ μ²λ¦¬νλ€.
μ²΄ν¬ ν¬μΈνΈ
β
μ΄λ»κ² ꡬννλ Β Iterator
λ₯Ό μ¬μ©ν μ μλ€.
1
2
3
4
5
6
Iterator<SubTask> it = task.iterator();
while (it.hasNext) {
SubTask subTask = it.next();
System.out.println(subTask.getName());
System.out.println(subTask.getDescription());
}
Iterator
ν¨ν΄μ μ¬μ©ν¨μΌλ‘μ¨ κ΅¬νκ³Ό λΆλ¦¬νμ¬ λ°λ³΅ν μ μλ€.- μκΈ° μ½λμμΒ
while
λ¬Έμ μ 무 ν΄λμ€ κ΅¬νμ μμ‘΄νμ§ μλλ€. - μ
무 μΈμ€ν΄μ€μ
subTasks
νλλ₯Ό λ°°μ΄μμΒjava.util.ArrayList
λ‘ λ³κ²½νλ€κ³ νμ. - μ
무 ν΄λμ€λ₯Ό μ΄λ»κ² λ³κ²½νλ
iterator()
Β λ©μλλ₯Ό κ°κ³ μκ³ ,ΒhasNext()
μΒnext()
κ° λ°λ₯΄κ² ꡬνλ μ¬λ°λ₯ΈΒIterator<SubTask>
μ λ°ννλ©΄Βwhile
λ¬Έμ λ³κ²½νμ§ μμλ λμνλ€. - μ΄λ¬ν μμ‘΄μ± λΆλ¦¬λ μ½λ μ¬μ¬μ©μ μ΄μ§νλ€.
β μΆμ ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ.
- ꡬ체μ μΈ ν΄λμ€λ§ μ¬μ©νλ©΄ ν΄λμ€ μ¬μ΄μ κ²°ν©μ΄ κ°ν΄μ Έ λΆνμΌλ‘ μ¬μ¬μ©νκΈ° μ΄λ ΅λ€.
- κ²°ν©μ μ½ννκ³ μ¬μ¬μ©νκΈ° μ½κ² νκ³ μ μΆμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό λμ ν΄μΌ νλ€.
β λ°λ³΅μμ μ§ν©μ²΄ μμ‘΄
TaskIterator
ν΄λμ€λ μ 무 ν΄λμ€κ° μ΄λ»κ² ꡬνλμ΄ μλμ§ μκ³ μμκΈ° λλ¬ΈμΒgetSubTaskAt(int index)
λ©μλλ₯Ό νΈμΆνμ¬ λ€μ νμ μ 무λ₯Ό κ°μ Έμ¬ μ μμλ€.- μ΄λ μ
무 ν΄λμ€μ ꡬνμ λ°κΎΌλ€λ©΄
TaskIterator
ν΄λμ€λ₯Ό μμ ν΄μΌ λλ€λ λ§μ΄ λλ€. Iterable<E>
ν΄λμ€μIterator<E>
ν΄λμ€κ° μ§μ μ΄λ£¨λ―Task
ν΄λμ€μTaskIterator
ν΄λμ€λ μ§μ μ΄λ£¬λ€.- μ¬μ€ μμ μ½λμ λ©μλ λͺ
μ νΌλνκΈ° μ½λ€.
next()
Β λ©μλλ νμ¬ μ²λ¦¬νλ μμλ₯Ό λ°ννλμ§, λ€μ μμλ₯Ό λ°ννλμ§ λͺ¨νΈνλ€.- μ νν νννλ©΄
CurrentElementAndAdvanceToNextPosition()
λ©μλκ° λ§λ€.
β 볡μμ λ°λ³΅μ
- νμ¬ μ΄λκΉμ§ μ‘°μ¬νλμ§ κΈ°μ΅νλ ꡬ쑰λ₯Ό μ§ν©μ²΄ μν μΈλΆμ λλ κ²μ΄Β
Iterator
Β ν¨ν΄μ νΉμ§ μ€ νλλ€. - μ΄λ° νΉμ§μ λ°λΌ νλμ ꡬ체μ μΈ μ§ν©μ²΄ μν μ λν΄ μ¬λ¬ κ°μ ꡬ체μ μΈ λ°λ³΅μ μν μ λ§λ€ μ μλ€.
β
deleteIterator()
λ©μλλ νμ μλ€.
Java
μμ μ¬μ©λμ§ μλ μΈμ€ν΄μ€λGarbage-collection
μ μν΄ μλμΌλ‘ μμ λλ€.
νκ³
Java
μfor-each
λ¬Έ λ°°νμμλ μ°λ¦¬κ° μμ±νIterator
ν¨ν΄μ΄ μ¬μ©λλ€λ μ μ κΈ°μ΅ν΄μΌκ² λ€.
This post is licensed under CC BY 4.0 by the author.