자바 interface
자바 interface는 메서드 집합을 의미한다.
java.lang 패키지에 정의된 Comparable interface의 소스코드는 다음과 같다.
public interface Comparable<T> {
public int compareTo(T o)
}
이 interface는 타입 파라미터인 T를 사용하여 Camparable이라는 제네릭 타입을 정의한다. 이 interface를 구현하려면 클래스는 다음과 같아야 한다.
- T 타입을 명시해야 한다.
- T 타입의 객체를 인자로 받고 int를 반환하는 compareTo() 메서드를 제공해야 한다.
List interface
JCF(Java Collection Framework)는 List라는 interface를 정의하고 ArrayList와 LinkedList라는 두 구현 클래스를 제공한다.
interface는 List가 된다는 의미가 무엇인지를 정의한다. 이 interface를 구현하는 클래스는 add, get, remove와 약 20가지 메서드를 포함한 특정 메서드 집합을 제공해야 한다.
ArrayList와 LinkedList 클래스는 이러한 메서드를 제공하므로 상호교환할 수 있다. List로 동작하는 메서드 ArrayList와 LinkedList 또는 List를 구현하는 어떤 객체와도 잘 동작한다.
예제 코드
(ListExample.java)
import java.util.LinkedList;
import java.util.List;
public class ListExample {
@SuppressWarnings("rawtypes")
private List list;
@SuppressWarnings("rawtypes")
public ListExample() {
list = new LinkedList();
}
@SuppressWarnings("rawtypes")
public List getList() {
return list;
}
public static void main(String[] args) {
ListExample lce = new ListExample();
@SuppressWarnings("rawtypes")
List list = lce.getList();
System.out.println(list);
}
}
ListExample 클래스는 유용한 동작을 하지 않지만, List를 캡슐화하는 클래스의 필수 요소를 가지고 있다. 즉, List형의 인스턴스 변수를 가지고 있다.
생성자는 새로운 LinkedList 객체를 만들어 리스트를 초기화한다. getList 메서드는 게터 메서드로 List 객체에 대한 참조를 반환한다. main은 테스트 코드이다.
여기서 중요한 내용은 필요한 경우가 아니면 LinkedList나 ArrayList 같은 구현 클래스를 사용하지 않고 가능한 한 List 인터페이스를 사용한다는 점이다. 예를 들어, 인스턴스 변수는 List 인터페이스로 선언하고 getList 메서드로 List형을 반환하지만 구체적인 클래스는 언급하지 않는다.
만약, ArrayList 클래스를 사용하고자 한다면 생성자만 바꾸면 되고 그 외에는 그대로 두면 된다.
이러한 스타일을 인터페이스 기반 프로그래밍(interface-based programming) 또는 간단하게 인터페이스 프로그래밍이라고 한다. 여기서 인터페이스는 자바 interface가 아닌 일반적인 개념의 인터페이스를 말한다.
라이브러리를 사용할 때 코드는 오직 List와 같은 인터페이스만 의존하고 ArrayList 클래스와 같은 특정 구현에 의존해서는 안된다. 이러한 방식으로 하면 나중에 구현이 변경되어도 인터페이스를 사용하는 코드는 그대로 사용할 수 있다.
Tip.
아마 위 소스코드 그대로 실행한다면 List에 타입을 명시하라고 경고창이 뜰 것이다. List나 LinkedList 선언부에 타입을 명시해주면 된다.
'학습 > CS' 카테고리의 다른 글
연결 자료구조 & 객체 다이어그램 (1) | 2023.02.02 |
---|---|
ArrayList 클래스 2 & amortized analysis(분할 상환 분석) (1) | 2023.02.02 |
ArrayList 클래스 (1) | 2023.02.02 |
big O notation(빅오 표기법) (0) | 2023.02.02 |
analysis of algorithm(알고리즘 분석) (0) | 2023.02.02 |