BaseListObject.java
  Dashboard > Java와 JEE > Home > BaseListObject.java
Community
  Java와 JEE Log In | Sign Up   View a printable version of the current page.  
Added by 박재성, last edited by 박재성 on 4월 30, 2007  (view change)
Labels: 
(None)

BaseListObject.java의 필요성

  • 게시판 목록이나 글의 목록을 가져오는 경우 일반적으로 List Collection에 저장을 많이 하게 된다. 이 경우 단순하게 목록 데이터만을 가지는 경우라면 List Collection을 바로 이용하지만 대부분의 경우 목록 데이터 이외에 다른 정보나 비지니스 로직을 포함하는 경우가 많다.
  • 이 경우 ArrayList Collection을 상속하여 추가적인 속성이나 메써드를 추가하는 것이 아니라 다음과 같은 형태로 List Collection을 Association형태로 가지도록 구현하여 사용해왔다.
BaseListObject.java가 없을 경우의 구현 방식
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class CodeList {
	private List codes;
	
	public void addCode(Code code) {
		if( codes == null ) {
			codes = new ArrayList();
		}
		
		codes.add(code);
	}
	
	public List list() {
		return codes;
	}
	
	public int size() {
		if( codes == null ){
			return 0;
		}
		
		return codes.size();
	}
	
	public Iterator iterator() {
		if( codes == null ) {
			return null;
		}
		
		return codes.iterator();
	}
}
  • 목록을 가지는 거의 모든 객체를 위와 같은 방식으로 구현하였다. 사실 이 작업은 상당히 짜증나는 작업이 아닐 수 없다. 단순 반복적인 작업의 전형적인 모습이다.
  • 이 작업을 Java Generics 기능까지 포함해서 구현하면 다음과 같다.

BaseListObject.java

  • 먼저 BaseListObject.java가 지원해야하는 인터페이스를 정의한다.
Listable.java
import java.util.Iterator;
import java.util.List;

public interface Listable<E> extends Iterable<E>{
	void add(E object);

	List<E> getList();

	Iterator<E> iterator();

	E get(int i);

	int size();
	
	void setList(List<E>list);
}
  • 위 API에서 필요한 기능이 추가할 때마다 더하는 것이 가능하다.
BaseListObject.java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * @author javajigi
 */
public class BaseListObject<E> implements Listable<E> {
	private List<E> objectList;

	public void add(E object) {
		if( objectList == null ) {
			objectList = new ArrayList<E>();
		}
		
		objectList.add(object);
	}
	
	public void setList(List<E> objectList) {
		this.objectList = objectList;
	}
	
	public List<E> getList() {
		return this.objectList;
	}
	
	public Iterator<E> iterator() {
		if( objectList != null ) {
			return objectList.iterator();
		}
		
		return null;
	}
	
	public E get(int i) {
		return objectList.get(i);
	}
	
	public int size() {
		if( objectList != null ) {
			return objectList.size();
		}
		
		return 0;
	}
}
  • 사실 위와 같이 구현하는 작업은 한번 뿐이지만 이를 상속하는 모든 클래스들은 List Collection을 내부적으로 가지고 있기 때문에 추가적인 구현을 하지 않아도 되는 장점을 가지게 된다.
  • BaseListObject.java 클래스를 상속하는 클래스를 보면 다음과 같다.
BaseListObject.java를 사용하는 클래스
public class ContentList<E> extends BaseListObject<E> {
	private Long postNo;

	public void setPostNo(Long postNo) {
		this.postNo = postNo;
	}
	
	public Long getPostNo() {
		return postNo;
	}
}

논의할 부분

  • 위와 똑같은 기능을 구현하기 위하여 ArrayList API를 상속하면 되지 굳이 List Collection에 대한 API를 별도로 제공하느냐고 의문을 제기하는 개발자들이 있을 것이다.
  • 개인적으로 API를 구현할 때 특정 API에 종속적이지 않도록 구현하는 것으로 좋아한다. 만약 위 예의 경우 ArrayList API를 상속하고 있다면 상속하고 있는 ArrayList의 변경에 자유롭지 못하게 된다. 그러나 위 예와 같이 Association 관계를 가지고 있다면 외부 API가 변경될 때 BaseListObject.java만 변경해주면 된다.
  • 또한 ArrayList API를 상속하게 될 경우 너무 많은 API를 사용자에게 노출하는 것도 상속을 사용하지 않는 이유이다. 사실 List Collection API는 범용적으로 사용하기 위하여 너무도 많은 API를 포함하고 있다. 그러나 내가 사용하고 싶은 API는 5-6개 전부이기 때문에 위와 같은 Association을 통하여 일부 API만을 외부로 공개하는 방식으로 종종 사용한다.

Site running on a free Atlassian Confluence Open Source Project License granted to JavaJiGi Project. Evaluate Confluence today.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.3.1 Build:#643 1월 22, 2007) - Bug/feature request - Contact Administrators