본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


적당한 인터페이스 자료형이 있다면 인자나 반환값, 변수 그리고 필드의 자료형은 클래스 대신 인터페이스로 선언하자. 객체의 실제 클래스를 참조할 필요가 있는 순간은 생성자를 생성할 때다.


아래 예제를 보면 ArrayList를 생성할 때 인터페이스 자료형(List)를 사용하는 좋은 예와, 클래스 자료형(ArrayList)를 사용하는 나쁜 예가 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person {
    private String name;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}
 
public class Test {
        
    public static void main(String[] args) {
        //인터페이스를 자료형으로 사용하고 있는, 바람직한 예제
        List<Person> arrayList1 = new ArrayList<Person>();
        
        //클래스를 자료형으로 사용하고 있는, 나쁜 예제
        ArrayList<Person> arrayList2 = new ArrayList<Person>();
    }
}



인터페이스를 자료형으로 쓰는 습관을 들이면 프로그램은 더욱 유연해진다. 가령 어떤 객체의 실제 구현을 다른 것으로바꾸고 싶으면 호출하는 생성자 이름만 다른 클래스 이름으로 바꾸거나, 아니면 호출하는 정적 팩터리 메서드만 다른 것으로 바꿔주면 된다. 위에서 List Vector로 간단하게 변경만 해도 사용할 수 있다.


1
List<Person> arrayList1 = new Vector<Person>();



적당한 인터페이스가 없는 경우에는 객체를 클래스로 참조하는 것이 당연하다.  String과 BigInteger 같은 값 클래스의 예를 살펴보면 다양한 구현을 염두에 두고 이런 클래스를 만드는 일은 거의 없다. final인경우가 많고 대응되는 인터페이스도 거의 없다. 그런 값 클래스는 당연히 인자나 변수, 필드 반환값의 자료형으로 사용할 수 있다. 일반적으로 말해서 연관된 인터페이스가 없는 객체 생성 가능 클래스의 경우 그 클래스가 값 클래스인지의 여부에는 상관없이, 그 객체는 클래스를 통해 참조해야 한다.