1. iterator 패턴이란


개발을 하면서  array나 List, Set, Map과 같은 interface 들을 많이 사용합니다. 이것들의 특징은 어떤 데이터들의 집합체라는 겁니다. 

원래 집합체란 게 속에 뭐가 들었냐가 중요하죠. 

그래서 집합체들을 다룰 때는 얘들이 가지고 있는 개별 원소에 대해서 이런 저런 작업들을 할 일이 많습니다. 

iterator를 쓰게 되면, 집합체와 개별 원소들간에 분리시켜 생각할 수가 있습니다. 심지어는 그 집합체가 어떤 클래스의 인스턴스인지 조차 신경쓰지 않아도 됩니다.


2. 예제

// iterator 인터페이스를 만든다.
   

// NameRepository 클래스를 iterator 인터페이스를 이용하게 만든다.
   

 // 테스트
   

 //결과
 



3. Iterator관련 interface


iterator  인터페이스를 만드는 대신에 구현되어 있는 java 의 iterable 인터페이스를 사용해도 됩니다.


private class NameIterator implements   Iterable<String> {

위와같은 식으로 구현되어 있는걸 사용해도 되지만 iterator  패턴이 어떤건지 알기 위하여 구현을 임의로 한것입니다.


4. JAVA API에 있는 Iterator


우리가 알고 있는 일반적인 집합체들은 전부 Iterator를 제공합니다. Set, List 등은 Collection 을 상속 받는데, Collection이 Iteratable을 상속 받기 때문입니다.

위에서 청록색 부분을 list.iterator() 라고 쭐여버려도 됩니다. 걍 있는 거 안 쓰고 굳이 구현한 건 예제 파일을 함 보여줄라고 한 겁니다. 사실은 예제 전체가 억지로 만들어낸 겁니다. 일반적인 집합체를 구현해서 쓰는 일은 거의 없고, JDK 안에 들어 있는 애들을 가져다 쓰는데, 걔들은 거의 대부분 Iterator를 제공하거든요.(Map은 한 다리 건너서 제공합니다.) 그래서 Iterator를 직접 구현할 일은 거의 없습니다. 가져다가 쓸 일이 있을 뿐이죠.


이제 Map은 왜 Iterator를 제공하지 않는 지를 살펴보죠. Map은 Set이나 List와는 달리 key-value의 구조입니다. key에 대한 Iterator인지 value에 대한 Iterator인지 구별할 방법이 없죠. 그래서 아예 제공을 안 합니다. 그러나 Map에는 key에 대해서는 Set<K> keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection<V> values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.



블로그 이미지

낭만가을

,

1. Factory  패턴 이란


아주 중요한 패턴중에 하나 입니다. Factory 패턴은 creational pattern  에 속하는 패턴입니다.

Factory 패턴은 객체생성로직 없이 객체를 만들어 내는 패턴입니다.. 인터페이스를 통해 만들어진 객체를 참조 하죠.


쉽게 설명해드리겠습니다.  factory 는 한국어로 공장이란 뜻이죠.  즉 객체를 만들어내는 공장 입니다.  

객체 선언은 보통 new 객체() 이런식으로 하죠. factory는 내부에서 그런 일을 해줍니다. 즉 factory를 가져다가 쓰는 부분에서는 new 객체()와 같은 식으로 변수를 선언할 필요가 없습니다. Abstract class나 인터페이스에 대해서 다양한 하위 구현체가 있을 경우에 사용하면 좋습니다. 사용법은 Factory.create(인자는 맘대로) 와 같이 됩니다. 


실무에서 자주 쓰이는 패턴중 하나이니 아래와 같이 천천히 따라해보도록 하죠.


2. 따라하기


// animal 인터페이스를 만듭니다. 기본이 되는 interface 죠. 모든 디자인 패턴은 interface 를 사용한다 해도 과언이 아닙니다.


// Cat 클래스를 만듭니다.


// Cow 클래스를 만듭니다.


// Dog 클래스를 만듭니다.


// animal 을 만들어내는  AnimalFactory 클래스를 만든다. 

//( 이 class 가 핵심 입니다. factory 패턴을 구현한곳이죠. 이해하기 힘드시다면 이 class 만 30번 보시면 이해가 되실겁니다.)


// 자 테스트를 한번 해볼까요.

 

//결과


3. Factory 의 이해 

위의 결과와 같이 Animal interface 를 이용해서 각자 다른 소리를 내는 3개의 클래스를 만들어 봤습니다.

AnimalFactory 클래스에서는 각 동물들의 이름을 받아서 클래스를 만들어 냈습니다. 즉 팩토리 패턴을 구현해 놓은 클래스 입니다.


테스트를 실행하는 main 클래스 안에는 new 라는 구문 자체가 없습니다 팩토리 패턴은. 정확히 어떤 클래스의 인스턴스인지 신경쓰지 않고 구현할 수 있는 장점이 있습니다. 객체 타입이 굉장히 유연해 질 수 있죠.


이것으로 아주 쉽게 배우는 factory 패턴을 마치고자 합니다. 



블로그 이미지

낭만가을

,