'Iterator'에 해당되는 글 1건

  1. 2009.07.14 자바 기초의 완성 - Iterator.

기본형/참조형 변수, 각종 기초문법(if, for, while, switch 등), 배열, 상속, 오버라이딩, 오버로딩, 인터페이스, 추상클래스 등 정도 학습을 하게 되면 어느정도 자바 프로그래밍에 대한 평가를 받아봐야 합니다.

프로그래밍의 감각 내지는 이해도 공부 정도를 평가해야 할 때 입니다. 쉽게 말해 기초 내공이겠지요.

그 것중에 가장 대표적으로 좋은 평가 예제가 Iterator 패턴 입니다. 자바에서는 많은 패턴이 존재하지만 그 중에서도 Iterator이 가장 쉬우면서도 기초 평가에는 아주 제격이죠.

아마 많은 자바 프로그래밍 교재에서도 Iterator 패턴은 적어도 한 줄 이상은 언급을 할 것이라고 생각합니다. 저 역시 자바를 처음 접하면서 Iterator을 해봤죠..(시험 시간에 멍 때린 기억이...)

그럼 이제 본론으로 들어가봅시다.

일단 Iterator 패턴을 프로그래밍 하기 전에 간단한 UML을 알아보고 진행하도록 합시다.
블로그를 통해서 UML에 관한 글을 별도로 준비하지 않은 이유는 지식이 너무도 부족해서 입니다. 그래도 간단한 설계도를 그려 보면 코딩하는 과정은 복잡해지지 않고 클래스 간의 연관성을 쉽게 파악할 수 있는 장점이 생깁니다.

가장 먼저 상속의 관계를 그려 봅시다.

A클래스를 B클래스가 상속한다.(추상 클래스도 상관은 없습니다.)
A와 B의 관계는 상속 관계입니다. B가 A를 상속할 때는 화살표 모양이 삼각형으로 하면 됩니다.
인터페이스간의 상속도 이와 같이 하면 됩니다.
class A {
        ......
}
class B extends A{
        ......
}


인터페이스를 구현하는 그림

상속과는 비슷하지만 구현 관계는 점선으로 표시 합니다.
B클래스가 A 인터페이스를 구현.

interface A {
        ......
}
class B implements A {
        ......
}


집약 그림

class A {
        ......
}
class B {
        private A a;
        ......
}
집약 관계는 B 클래스에서 A 클래스의 객체를 맴버로 갖고 있는 경우를 말합니다. 말 그대로 객체를 갖고 있는 경우를 집약이라고 하는 것 입니다. 표현은 갖고 있는 쪽이 마름모, 대상이 화살표 입니다.

클래스의 관계 그림

B 클래스는 A 클래스를 사용한다라고 해서 "◀ User" 라고 표시 합니다. 이 외에도 생성하는 관계라면 "◀ Creates", 통지(아마 값을 전달하는 관계를 말하는 것 같음) "◀ Notifies" 단어를 이용해서 표시 하면 됩니다. 솔직히 말씀 드리면 이 부분에 대해서는 저도 사용을 어떤식으로 해야 하는지 자세히 모르기 때문에 설명을 분명히 못하겠습니다.

 

 

그 외에도 맴버변수, 생성자, 메소드 등에 대한 표기법과 클래스, 추상클래스, 인터페이스 표기법, 접근제어자에 따른 표기법이 존재합니다. 일단 지금은 UML을 자세히 알기 위한 글이 아니니 이 부분은 따로 준비를 해서 알려드리도록 하겠습니다.

그럼 이제 위에서 잠시 소개 했던 UML은 다음의 Iterator 예제 문제를 제시 한 뒤에 설계를 위해 이용하도록 합시다.

인수에 대한 언급이 없으면 인수는 없도록 한다, 모든 메소드는 public 사용, 맴버변수는 private 사용을 하도록 한다.

1. Iterator 인터페이스
반환형이 boolean형인 메소드 hasNext를 보유, 반환형이 Object형인 메소드 next를 보유

2. Aggregate 인터페이스
반환형이 Iterator형인 메소드 iterator를 보유

3. Book 클래스
책이름을 저장하는 맴버변수 name를 보유, 문자열을 인수로 받아 name에 책이름을 저장하는 생성자를 보유,
책이름을 반환하는 메소드 getName을 보유.

4. BookShelf 클래스
Aggregate 인터페이스를 구현, Book형 배열 books[]와 int형 변수 last를 맴버변수로 보유(last는 선언과 동시에 0으로 초기화 할 것), 배열 books의 크기를 지정하는 값을 인수로 받아서 books의 크기를 설정하는 생성자를 보유, 인수 int index를 이용해서 books[]의 지정된 위치의 객체를 반환하는 메소드 GetBookAt를 보유, Book 객체를 인수로 받아 books[last] 위치에 전달 받은 객체를 저장하고 last를 1 증가시키는 appendBook 메소드를 보유, last를 반환하는 getLength 메소드를 보유, BookShelfIterator 객체를 생성하여(인수는 this를 사용한다.) 반환하도록 iterator 메소드를 오버라이딩 한다.

5. BookShelfIterator 클래스
Iterator 인터페이스를 구현, BookShelf 형 객체 bookshelf와 int형 index를 맴버변수로 보유, BookShelf형 객체를 인수로 받아 bookshelf에 대입하고 index를 0으로 초기화 하는 생성자를 보유, bookshelf에서 index의 위치에 가져올 객체가 존재하는지에 따라 true/false를 반환하도록 hasNext 메소드를 오버라이딩 한다. bookshelf에서 index의 위치의 객체를 가져온 뒤 index를 1증가 시키고 가져온 객체는 반환하도록 next 메소드를 오버라이딩 한다.

6. Main 클래스
BookShelf형 객체를 만들어 Book 객체 3개를 BookShelf 객체에 저장한다.(책은 국어책, 수학책, 영어책으로 한다.) 이 후 Iterator 객체에 BookShelf의 객체를 대입한 뒤 while문과 hasNext메소드, next메소드 등을 이용해서 화면에 출력한다.

실행 화면


생각보다 복잡하고 어려울 수 있습니다. 그러나 좀 전에 이야기 한 것 처럼 UML을 이용하면 생각보다 어렵지 않다는 것을 알 수 있습니다. 그리고 문제를 이해하는 것 또한 중요합니다. 문제 전체를 이해 하려 하지 말고 각 문제당 제시한 조건을 개별적으로 이해한 뒤에 조합을 해보면 쉽게 프로그래밍 할 수 있습니다.

단순하게 클래스다이어그램을 그려 보면(UML을 이용해서 그런 것을 말함)

메소드와 인터페이스 등의 특징을 표시 하지 않고 아주 간략하게 그린 것 입니다.(틀렸을지도 ~) UML에 대한 지식이 부족하므로 일단은 자신이 알아볼수 있도록 그리는 것이 중요할 것 입니다. (메인은 제외 시켰음)

그럼 이 것만으로 프로그래밍 하기에는 어려운 점도 있을 것이니 약간의 힌트를 알려드리겠습니다.

1, 2, 3번은 문제에서 제시한 그대로를 코딩으로 옴기면 됩니다.

3번의 경우 약간 주의해야 할 것은 문자열이라는 것과 반환형입니다.

4번 부터 슬슬 난이도가 있네요. 오버라이딩이라는 것은 구현 또는 상속 관계에서 반드시 해야 하는 것입니다. 부담 갖지 마세요.

배열을 선언하는 것과 그 크기를 지정하는 것은 다릅니다.
선언과 동시에 초기화 한다는 것은 변수를 선언하면서 값을 지정한다는 것입니다.

인수라는 것은 메소드 뒤에 오는 소괄호 안에 들어가는 매개변수(인수와 같은 의미)를 말합니다.
인수는 값을 전달받기 위해서 사용됩니다. 반환한다는 것은 return문을 사용해야 한다는 것을 말합니다.

반환에 대한 언급이 없으면 반환형은 void 입니다.
변수값을 반환 할 때는 반환형과 변수의 유형에 주의해야 합니다.

인수를 this로 한다는 것은 자신을 가리키는 것입니다.(여기서 this의 의미는 객체입니다.)
생성자에도 소괄호가 존재하고 이 곳은 매개변수(인수) 라고 하며 값을 전달하는데 사용합니다.

객체를 인수로 전달 받는다는 것은 어떤 형태로 전달 받을 것인가를 말합니다.(인수의 형태)

return문은 어디에 위치하느냐에 따라 한 메소드에서 여러번 사용할 수 있습니다.

반환형과 반환될 객체가 다른 경우에 둘 사이에 관계가 어떤 관계인가를 살피도록 합시다.

형변환/캐스팅을 알고 있어야 합니다.

Main 클래스에서는 Vector 클래스 사용법을 알고 있으면 쉽게 구성할 수 있습니다.

이 정도면 충분할 것 같습니다. 프로그램이 완성된 소스는 Java 예제 소스 카테고리에 있습니다.

본인 실력으로 풀어보시는 것이 중요합니다. 이 문제를 풀 수 있느냐 없느냐에 따라 자신의 기초 실력과 객체지향 프로그래밍 개념에 대한 이해도가 나타나기 때문입니다.
Posted by 철냄비짱
,