인터페이스
리스트가 두 종류인 이유
- 왜 자바는 List 인터페이스에 두 가지 구현을 제공?
- 둘 중에 어느 것을 선택?
- 어느 것이 더 좋을지는 수행하는 동작에 달려 있음
자바 interface
- 자바 interface는 메서드 집합을 의미
- ex) Comparable interface
public interface Comparable<T> { public int compareTo(T o); }
- interface는 타입 파라미터인 T를 사용하여 Comparable이라는 제네릭 타입을 정의
- 이 interface를 구현하려면 클래스는 다음과 같아야 함
- T 타입을 명시해야 함
- T 타입의 객체를 인자로 받고 int를 반환하는 compareTo() 메서드를 제공해야 함
- 이 interface를 구현하려면 클래스는 다음과 같아야 함
- interface는 타입 파라미터인 T를 사용하여 Comparable이라는 제네릭 타입을 정의
- ex
public int compareTo(Integer anotherInteger) { int thisVal = this.value; int anotherVal = anotherInteger.value; return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1)); }
- compareTo() 메서드를 구현할 때 종종 삼향 연산자 사용
- ex) Comparable interface
List interface
- JCF는 List라는 interface를 정의하고 ArrayList와 LinkedList라는 두 구현 클래스를 제공
- interfae는 List가 된다는 의미란?
- add, get, remove 등 약 20가지 메서드를 포함한 특정 메서드 집합을 제공해야 함
- ArrayList와 LinkedList 클래스는 이러한 메서드를 제공하므로 상호교환할 수 있음
- 예제코드
import java.util.LinkedList;
public class ListClientExample {
private List list;
public ListClientExample() {
list = new LinkedList<>();
}
private List getList() {
return list;
}
public static void main(String[] args) {
ListClientExample lce = new ListClientExample();
List list = lce.getList();
System.out.println(list);
}
}
- ListClientExample 클래스는 유용한 동작을 하지 않지만, List를 캡슐화하는 클래스의 필수 요소를 가지고 있음
- 즉, List형의 인스턴스 변수를 가지고 있음
- 이러한 스타일을 인터페이스 기반 프로그래밍 또는 인터페이스 프로그래밍이라고 함
- 인터페이스는 자바 interface가 아닌 일반적인 개념의 인터페이스를 말함
- 라이브러리를 사용할 때 코드는 오직 List와 같은 인터페이스만 의존하고 ArrayList 클래스와 같은 특정 구현에 의존해서는 안 됨
- 나중에 구현이 변경되어도 인터페이스를 사용하는 코드는 그대로 사용할 수 있음
- 인터페이스가 변경되면 인터페이스를 의존하는 코드는 변경되어야 함
- 라이브러리 개발자가 인터페이스를 변경하지 않는 이유