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() {
            ...
        }
    }
}
  • 마찬가지로 중첩 클래스 포함한 메소드들 오버라이딩 애노테이션를 붙인다.

의존관계 주입

의존관계에 주입할 수 있도록 인터페이스를 모두 설정하였다.

다음 작성 글에서 의존 관계가 코드로 어떻게 표현하는지 확인한다.