내맘대로 정리.
디자인패턴들 중 가장 대표적인 패턴인 Iterator 패턴.
클래스들의 집합을 구현한 클래스에서 순환탐색을 필요로 할 때
이터레이터를 사용하면 편리하게 접근 할 수 있게된다.
좋은점은..
클래스가 다르더라도 항상 같은 형식으로 호출 할 수 있게 되므로,
1. 대상이 되는 클래스의 구현 방법을 노출 시키지 않으므로 지저분하지 않고 깔끔한 코딩을 할 수 있게 된다. (캡슐화)
2. 컬렉션이 되는 클래스의 구조를 모르더라도 그 안에 Iterator만 구현 되어 있고,
사용자가 Iterator 패턴에 대한 지식만 있다면 쉽게 컬렉션의 요소들을 참조 할 수 있게 된다. (다형성)
2. 컬렉션이 되는 클래스의 구조를 모르더라도 그 안에 Iterator만 구현 되어 있고,
사용자가 Iterator 패턴에 대한 지식만 있다면 쉽게 컬렉션의 요소들을 참조 할 수 있게 된다. (다형성)
결국 궁극적으로 지향하는 점은 객체지향의 특징들인 다형성과 캡슐화를 위해서 개발된 패턴이라고 한다더라..
아래는 Iterator패턴 구현을 위한 인터페이스들..
Iteratable.java
public interface Iteratable{
Iterator.java
public interface Iterator{
public interface Iteratable{
public Iterator iterator(); // 컬렉션 클래스에 Iteratable을 위임하여 iterator() 메서드를 구현한다.
}
Iterator.java
public interface Iterator{
public Object next(); // 현재 인덱스의 노드를 리턴하고 다음 인덱스를 가리키는 역할을 한다.
public boolean hasNext(); // 현재 인덱스와 컬렉션의 크기를 비교하여 크기보다 작다면 true를 리턴.
public boolean hasNext(); // 현재 인덱스와 컬렉션의 크기를 비교하여 크기보다 작다면 true를 리턴.
}
Iterator 패턴을 이용하기 위한 인터페이스를 구현하였다.
위에서 Iterator.java를 보면 next() 와 hasNext()라는 메소드가 들었는데.. 일단 순환하며 자료형을 참조하기 위한
최소의 메소드만 넣어 놓았다. 저 위에 자료형을 참조하는 다른 메소드들을 첨가시켜도 상관은 없다.
다음은 위 패턴들을 구현하기위한 예제 소스이다.
data.java
public class data{
dataSet.java
public class dataSet implements Iteratable{ // Iteratable 인터페이스를 위임.
public class Test{
public class data{
private int num; // 캡슐화를 하여 데이터를 보호한다.
public data(int num){
public data(int num){
this.num = num;
}
public int getNum(){
public int getNum(){
return num;
}
}
dataSet.java
public class dataSet implements Iteratable{ // Iteratable 인터페이스를 위임.
private data[] set;
public dataSet(int size){
public dataSet(int size){
set = new data[size];
for(int i=0; i<data.length; i++)
for(int i=0; i<data.length; i++)
data[i] = new data(i);
}
public setData(int index, data d){
public setData(int index, data d){
set[index] = d;
}
public getData(int index){
public getData(int index){
return set[index];
}
private int index;
public Iterator iterator(){ // iterator 메소드를 명시한다.
private int index;
public Iterator iterator(){ // iterator 메소드를 명시한다.
index = 0;
Iterator i = new Iterator(){
public Object next(){
return set[index++];
}
public boolean hasNext(){
public boolean hasNext(){
return (index < set.length)?true:false;
}
}
return i;
return i;
}
}
Test.javapublic class Test{
public static void main(String [] args){
dataSet testSet = new dataSet(10);
Iterator i = testSet.iterator(); // iterator로 컬렉션 요소 참조할 때..
while(i.hasNext()){ // 다음의 요소가 있는지 확인
Iterator i = testSet.iterator(); // iterator로 컬렉션 요소 참조할 때..
while(i.hasNext()){ // 다음의 요소가 있는지 확인
data d = i.next(); // 현재의 요소를 리턴하고 다음 인덱스로 넘어감.
System.out.println(d.getNum());
System.out.println(d.getNum());
}
}
}
위의 예제에서는 iterator()메소드를 안에다 내부클래스로 다시 선언을 하여 리턴을 하였다.
사실 위와 같은 방법은 조금 위험부담이 커진다. Iterator를 구현하기 위해선 객체를 참조하고 있는 인덱스 변수를
따로 구현해 주어야 하는데 위에선 dataSet 안에 그냥 같이 집어넣어 버렸다. -,.-;;
저럴땐 dataSet을 위한 Iterator 클래스를 따로 만들어서 사용하는게 가장 바람직한 방법이 아닐까한다....아니면말고.
역시 직접 해 보면서 몸으로 느끼시길...
P.S. Iterator를 처음 배울때 '저걸 왜 쓰나?' 싶었는데.. 남이 구현해 놓은 컬렉션 클래스로 만지작 만지작 하다 보면
'아 이래서 쓰는구나' 하게 된다.
'Software Development' 카테고리의 다른 글
JAVA - FileInputStream FileReader 차이점. (0) | 2011.10.25 |
---|---|
VHDL - 예약어, 연산자 요약 (0) | 2011.03.15 |
VHDL - 개요와 역사 요약 (0) | 2011.03.15 |
디자인 패턴의 이해 (0) | 2010.06.15 |
리팩토링의 중요성 (0) | 2010.02.26 |