Java Abstract - 직접 구현한 연결, 배열 리스트 인터페이스 도입하기
직접 구현한 배열리스트와 연결리스트는 다형성과 OCP 원칙에 도입하기 좋은 구조이다.
리스트란?
- 데이터의 순서가 있음
- 데이터 값 중복 허용
리스트 구조
앞서 만든 배열리스트, 연결리스트는 내부 구현만 다를 뿐 같은 기능을 제공하였다. 내부 구현만 다르기에 상황에 따라서는 성능이 달라질 수 있다.
성능이 다르더라도 사용자 입장에서는 두 개 모두 기능이 충실하게 되어 있어 문제 없이 동작한다.
배열리스트의 연결리스트의 제공되는 기능이 동일하므로 공통 기능으로 인터페이스를 정의한다. 그리고 인터페이스를 추상화하여 다형성에 활용한다.
IList 인터페이스 정의
IList
+---------+
| size() |
| add() |
| get() |
| ... |
+----+----+
|
┌-----+-----┐
+----+----+ +----+----+
| size() | | size() |
| add() | | add() |
| get() | | get() |
| ... | | ... |
+----+----+ +----+----+
CList LinkedList
IList.class
public interface IList<E> {
int size();
void add(E e);
void add(int index, E e);
E get(int index);
E set(int index, E element);
E remove(int index);
int indexOf(E o);
}
- 공통으로 사용할 기능들을 정의한다.
CList.class
import java.util.Arrays;
public class CList<E> implements IList<E> {
...
@Override
public int size() {
...
}
@Override
public void add(E e) {
...
}
@Override
public void add(int index, E e) {
...
}
@Override
public E remove(int index) {
...
}
@SuppressWarnings("unchecked")
@Override
public E get(int index) {
...
}
@Override
public E set(int index, E element) {
...
}
@Override
public int indexOf(E o) {
...
}
@Override
public String toString() {
...
}
}
- 인터페이스로 설정한 메소드들을 오버라이딩한다.
CLinkedList.class
public class CLinkedList<E> implements IList<E> {
...
@Override
public void add(E e) {
...
}
@Override
public void add(int index, E e) {
...
}
@Override
public E remove(int index) {
...
}
@Override
public E set(int index, E element) {
...
}
@Override
public E get(int index) {
...
}
@Override
public int indexOf(E o) {
...
}
@Override
public int size() {
...
}
@Override
public String toString() {
...
}
private static class Node<E> {
...
@Override
public String toString() {
...
}
}
}
- 마찬가지로 중첩 클래스 포함한 메소드들 오버라이딩 애노테이션를 붙인다.
의존관계 주입
의존관계에 주입할 수 있도록 인터페이스를 모두 설정하였다.
다음 작성 글에서 의존 관계가 코드로 어떻게 표현하는지 확인한다.