분류 전체보기 (199)
ººº::Development™:: (66)
ººº::Learning™:: (31)
ººº::Information™:: (37)
ººº::Note™:: (11)
ººº::Photo™:: (50)
ººº::zEtc™:: (3)
rss

믹시
tistory 티스토리 가입하기!
2008. 11. 21. 00:17
지금까지 내가 코딩을 하면서 얼마나 무식하게 코딩을 했는지 요즘 처절하게 느끼고 있다. 팀장님의 코딩 실력과 이사님의 개발자적 시각.. 아주 많이 부족하다는걸 느끼는 가운데 안되겠다 싶어서 공부를 시작한다. 그 첫번째로 패턴...이전에 포스팅에서 얼랭을 공부한다고 했는데 얼랭은 아주 천천히 시간 날때마다 보는 것으로 미루고( 이러면 안되는걸 알면서도 ) 지금당장 공부하는게 급하다!ㅠㅠ;

그 첫번째로 패턴..앞으로 지금 보고 있는 책을 바탕으로 하나하나 패턴에 관해 정리를 해봐야겠다. 이곳에 포스팅 되는 내용은 개인적인 내용도 있고, 지금 보는 책의 내용도 함깨 있음을 미리 밝힌다.

1. Iterator 패턴
모든 언어에서 배열의 요소를 찾기 위해서 for구문과 같은 Loop문을 사용해 요소를 하나하나 찾는다. 이와 같이 첫번째 요소부터 마지막 요소까지 하나하나 찾아 나가는 방법을 일반화한 것이 Iterator 패턴이다. 다시 말해 어떠한 무언가가 모여있는 것들은 단순하게 검색하는 것을 의미한다.

Iterator패턴은 컬랙션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 모요있는 모든 요소에 접근할 수 있게 해주는 방법을 제공한다.

public interface Aggregate { public abstract Iterator iterator(); }

public interface Iterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

public class Book {
    private String    name;   
    public Book( String name ) { this.name = name; }
    public String getName() { return name; }
}

import java.util.ArrayList;

public class BookShelf implements Aggregate
{
    private    Book[]    books;
    private int        last    = 0;
    private    ArrayList<Book>    arrayList;
   
    public BookShelf() { arrayList    = new ArrayList<Book>(); }
    public BookShelf( int maxsize ) { this.books    = new Book[maxsize]; }
   
    public Book getBookIndex( int index ) {
        return ( arrayList != null ) ? (Book)arrayList.get( index ) : books[index];
    }
    public Book getBookAt( int index ) {
        return ( arrayList != null ) ? arrayList.get( index ) : books[index];
    }
   
    public void appendBook( Book book ) {
        if( arrayList != null )   
            arrayList.add( book );
        else if( arrayList == null && last >= 0 )
        {
            books[last]    = book;       
            last++;
        }
    }
   
    public int getLength() { return ( arrayList != null ) ? arrayList.size() : last; }   
    public Iterator iterator() { return new BookShelfIterator( this ); }
}

public class BookShelfIterator implements Iterator
{
    private    BookShelf    bookShelf;
    private    int            index;
   
    public BookShelfIterator( BookShelf bookShelf ) {
        this.bookShelf    = bookShelf;
        this.index        = 0;
    }
   
    public boolean hasNext() {
        if( index < bookShelf.getLength() ) return true;
        else return false;
    }

    public Object next() {
        Book    book = bookShelf.getBookAt( index );
        index++;       
        return book;
    }
}

위에 상당히 많은 코드들이 보이는데 위 코드들은 서가(BookShelf)안에 책(Book)을 넣고, 그 책의 이름을 차례대로 표시하는 프로그램으로 Size가 정해진 서가와 가변 Slze의 서가가 존재하는 프로그램이다.

public class Main
{
    public static void main(String[] args)
    {
        BookShelf    bookShelf    = new BookShelf( 4 );
        bookShelf.appendBook( new Book( "Around the World in 80 days" ) );
        bookShelf.appendBook( new Book( "Bible" ) );
        bookShelf.appendBook( new Book( "Cinderella" ) );
        bookShelf.appendBook( new Book( "Daddy-Long-Legs" ) );
       
        Iterator    it = bookShelf.iterator();
        while( it.hasNext() )
        {
            Book    book = (Book)it.next();
            System.out.println( book.getName() );
        }
       
        BookShelf    bookShelf2    = new BookShelf();
        bookShelf2.appendBook( new Book( "Around the World in 80 days--" ) );
        bookShelf2.appendBook( new Book( "Bible--" ) );
       
        it = bookShelf2.iterator();
        while( it.hasNext() )
        {
            Book    book = (Book)it.next();
            System.out.println( book.getName() );
        }
    }
}

위 프로그램을 실제 테스트 하는 코드로 첫번째서가는 책을 4권만 넣을 수 있는 서가이지만 아래쪽의 코드는 ArrayList를 사용하는 서가이기 때문에 책의 숫자에 상관없이 저장할 수 있다.

코드들을 보다보면 추상 클랙스, 혹은 인터페이스를 많이 사용한다. 나도 아직 잘 사용해 보지 않은 방식이지만 앞으로 하나씩 보면서 몸에 익혀 보도록 해야겠다.

:: 그럼 이글을 읽는 모든 분들에게 오늘 하루 즐겁고, 행복많이 가득하기를 ::