본문 바로가기

issue & tip

인터페이스 기반 프로그래밍

반응형


package com.example.demo.jcf;


import java.util.LinkedList;

import java.util.List;


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형의 인스턴스 변수를 가지고 있다.


ListClientExample 클래스의 생성자는 새로운 LinkedList 객체를 만들어 리스트를 초기화한다.

getList() 메서드는 List 객체에 대한 참조를 반환한다.

main() 메서드는 이 메서드를 테스트하는 코드를 포함한다.


중요한 내용은 필요한 경우가 아니면 LinkedList나 ArrayList 같은 구현 클래스를 사용하지 않고 가능한 한 List 인터페이스를 사용하는 점이다.

인스턴스 변수는 List 인터페이스로 선언하고 getList 메서드도 List 형으로 반환하지만 구체적인 클래스는 언급하지 않는다.


ArrayList 클래스를 사용할 경우 생성자만 바꾸면 된다.

다른건 수정하지 않는다.


이러한 스타일을 인터페이스 기반 프로그래밍(interface-based programming) 또는  인터페이스 프로그래밍라고 한다.


라이브러리를 사용할 때 코드는 오직 List와 같은 인터페이스만 의존하고 ArrayList 클래스와 같은 특정 구현에 의존해서는 안된다.

이런방식으로 하면 나중에 구현이 변경되어도 인터페이스르 사용하는 코드는 그대로 사용할 수 있다.

반면 인터페이스가 변경되면 인터페이스를 의존하는 코드는 변경되어야한다.


라이브러리 개발자가 인터페이스를 변경하지 않는 이유이다.



반응형

'issue & tip' 카테고리의 다른 글

토비의 봄 TV 재사용성과 다이나믹 디스패치 그리고 더블디스패치  (0) 2018.06.01
결합도  (0) 2018.05.17
응집도  (0) 2018.05.09
파일 입출력  (0) 2018.04.25
래퍼클래스와 제네릭  (0) 2018.04.24