IT story

다형성 : 왜“ArrayList list = new ArrayList”대신“List list = new ArrayList”를 사용합니까?

hot-time 2020. 6. 23. 07:24
반응형

다형성 : 왜“ArrayList list = new ArrayList”대신“List list = new ArrayList”를 사용합니까? [복제]


가능한 중복 :
Java 클래스의 인터페이스를 선호해야하는 이유는 무엇입니까?

언제 사용해야합니까

List<Object> list = new ArrayList<Object>();

ArrayList에서 상속받습니다.에 List일부 기능 ArrayList이없는 경우 List의 기능 중 일부를 잃어 버렸을 것입니다 ArrayList. 그리고 컴파일러는 이러한 메소드에 액세스하려고 할 때 오류를 알 수 있습니까?


이 작업을 수행하는 주된 이유는 코드를 특정 인터페이스 구현에서 분리하기위한 것입니다. 다음과 같이 코드를 작성할 때 :

List list = new ArrayList();  

나머지 코드는 data가 type이라는 것만 알고 List있습니다 List. 인터페이스 의 다른 구현간에 쉽게 전환 할 수 있기 때문에 바람직합니다 .

예를 들어, 상당히 큰 타사 라이브러리를 작성 중이고 라이브러리의 핵심을으로 구현하기로 결정했다고 가정하십시오 LinkedList. 라이브러리가이 목록의 요소에 액세스하는 데 크게 의존하는 경우 결국 디자인 결정이 잘못되었음을 알 수 있습니다. (O (n) 액세스 시간을 제공 ArrayList하는) 대신 (O (1) 액세스 시간을 제공 하는)을 사용해야한다는 것을 알게 될 것 LinkedList입니다. 인터페이스로 프로그래밍했다고 가정하면 쉽게 변경할 수 있습니다. 당신은 단순히 인스턴스 바꿀 것 List,에서를

List list = new LinkedList();

List list = new ArrayList();  

List인터페이스에서 제공하는 계약을 따르기 위해 코드를 작성했기 때문에 이것이 작동한다는 것을 알고 있습니다.

반면에을 사용하여 라이브러리의 핵심을 구현 LinkedList list = new LinkedList()했다면 코드의 나머지 부분이 LinkedList클래스 고유의 메소드를 사용하지 않는다는 보장이 없으므로 변경하기가 쉽지 않습니다 .

대체로 선택은 단순히 디자인의 문제이지만 ...이 종류의 디자인은 (특히 큰 프로젝트에서 작업 할 때) 매우 중요합니다. 나중에 기존 코드를 위반하지 않고 구현 별 변경을 수행 할 수 있기 때문입니다.


이것을 인터페이스 프로그래밍이라고합니다. 이것은 나중에 다른 List 구현으로 이동하려는 경우에 유용합니다. 몇 가지 메소드를 원하면 ArrayList구현을 프로그래밍해야합니다 ArrayList a = new ArrayList().


공용 인터페이스를 노출 할 때도 유용합니다. 이와 같은 방법이 있다면

public ArrayList getList();

그런 다음 변경하기로 결정했습니다.

public LinkedList getList();

하고 있던 사람은 ArrayList list = yourClass.getList()코드를 변경해야합니다. 반면에, 그렇게하면

public List getList();

구현을 변경해도 API 사용자에게는 아무런 변화가 없습니다.


@tsatiz의 대답은 대부분 옳다고 생각합니다 (구현이 아닌 인터페이스로 프로그래밍). 그러나 인터페이스에 프로그래밍하면 기능이 손실되지 않습니다 . 설명하겠습니다.

변수를 a로 선언 List<type> list = new ArrayList<type>하면 실제로 ArrayList의 기능을 잃지 않습니다 . 당신이해야 할 일은 당신에게 list아래로 캐스팅 하는 것 ArrayList입니다. 예를 들면 다음과 같습니다.

List<String> list = new ArrayList<String>();
((ArrayList<String>) list).ensureCapacity(19);

궁극적으로 ArrayList로 캐스팅하면 더 이상 인터페이스로 코딩하지 않으므로 tsatiz가 정확하다고 생각합니다. 그러나 초기에 인터페이스에 코딩하고 나중에 필요할 경우 구현해야 할 경우 코딩하는 것이 좋습니다.

희망이 도움이됩니다!


이를 통해 다음과 같은 내용을 작성할 수 있습니다.

void doSomething() {
    List<String>list = new ArrayList<String>();
    //do something
}

나중에 다음과 같이 변경할 수 있습니다.

void doSomething() {
    List<String>list = new LinkedList<String>();
    //do something
}

나머지 방법을 변경할 필요가 없습니다.

그러나 CopyOnWriteArrayList예를 들어을 사용하려는 경우 추가 메소드를 사용하려는 경우 List 아니라 선언해야 합니다 (예 : addIfAbsent).

void doSomething() {
    CopyOnWriteArrayList<String>list = new CopyOnWriteArrayList<String>();
    //do something, for example:
    list.addIfAbsent("abc");
}

I use that construction whenever I don't want to add complexity to the problem. It's just a list, no need to say what kind of List it is, as it doesn't matter to the problem. I often use Collection for most of my solutions, as, in the end, most of the times, for the rest of the software, what really matters is the content it holds, and I don't want to add new objects to the Collection.

Futhermore, you use that construction when you think that you may want to change the implemenation of list you are using. Let's say you were using the construction with an ArrayList, and your problem wasn't thread safe. Now, you want to make it thread safe, and for part of your solution, you change to use a Vector, for example. As for the other uses of that list won't matter if it's a AraryList or a Vector, just a List, no new modifications will be needed.


I guess the core of your question is why to program to an interface, not to an implementation

Simply because an interface gives you more abstraction, and makes the code more flexible and resilient to changes, because you can use different implementations of the same interface(in this case you may want to change your List implementation to a linkedList instead of an ArrayList ) without changing its client.


In general you want to program against an interface. This allows you to exchange the implementation at any time. This is very useful especially when you get passed an implementation you don't know.

However, there are certain situations where you prefer to use the concrete implementation. For example when serialize in GWT.

참고URL : https://stackoverflow.com/questions/9852831/polymorphism-why-use-list-list-new-arraylist-instead-of-arraylist-list-n

반응형