LinkedList는 지난번에 알아봤던 ArrayList와 마찬가지로 List interface를 implements하는 Collection framework의 class 중 하나입니다.
ArrayList와 다른 점은 list 내부 요소의 추가와 삭제를 효율적으로 할 수 있다는 것입니다.
각각의 요소가 값 뿐만 아니라 link도 같이 가지고 있는데요, 데이터가 중간에 추가 또는 삭제될 때 뒤의 다른 데이터들이 자리를 옮길 필요없이 link의 연결만 수정해주면 되기 때문에 훨씬 효율적입니다.
LinkedList의 선언과 초기화는 ArrayList와 유사합니다. <> 다이아몬드 표시 안에 타입을 넣어주면 됩니다.
LinkedList<String> placeToVisit = new LinkedList<String>();
사용하는 method도 ArrayList에서 사용하는 것과 거의 비슷한데요, 차이가 있는 부분 위주로 몇가지 살펴보겠습니다.
LinkedList가 가진 methods를 공부해보니, 기능이 유사하거나 아예 일치하는 것들이 중복되는 것을 알 수 있었습니다. 아래에 나오지만 add()와 addLast(), remove()와 removeFirstOccurrence()등 이름만 다를 뿐 기능은 똑같은 메서드들이 있습니다. 구글링을 해보니 LinkedList가 List 인터페이스와 Deque 인터페이스 두개를 모두 implements하면서 생긴 일이라고 합니다.
1. 요소 추가하기
요소를 추가할 때는 .add(element)를 사용해줍니다.
placeToVisit.add("Sydney");
placeToVisit.add("Melbourne");
placeToVisit.add("Brisbane");
역시나 원하는 index에 넣고 싶다면 .add(index, element)를 사용해서 원하는 자리에 넣어줄 수도 있습니다.
ArrayList와 method 이름은 동일하지만 Java 내부에서 이뤄지는 과정은 다르겠죠? 중간에 데이터를 add하게 되면, ArrayList는 뒷부분의 데이터를 모두 하나씩 옮기게 되고, LinkedList에서는 link가 가리키는 요소만 변동되게 됩니다. 예를 들어서, 위 그림에서 A와 B 사이에 E를 넣는다면 (.add(1, "E")) A -> B 이던 화살표가 A -> E 이렇게 바뀌게 되고, E는 B와 연결(E -> B)되게 됩니다.
.addAll(collection)을 사용하면 Collection을 implements하는 객체 자체를 추가할 수도 있습니다. placeToVisit에 다른 LinkedList를 추가할 수도 있고, ArrayList도 collection을 implements하므로 추가가 가능합니다.
//placeToVist2라는 새로운 LinkedList 생성
LinkedList<String> placeToVisit2 = new LinkedList<>(){{
add("NewYork");
add("LA");
add("Florida");
}};
//addAll()을 사용하여 placeToVisit에 넣어주기
placeToVist.addAll(1, placeToVisit2); //1번째에 넣어줍니다
System.out.println(placeToVist);
//Prints [Sydney, NewYork, LA, Florida, Melbourne, Brisbane]
//stringArrayList라는 새로운 ArrayList 생성
ArrayList<String> stringArrayList = new ArrayList<>(){{
add("ArrayListElement1");
add("ArrayListElement2");
add("ArrayListElement3");
}};
//addAll() 사용하여 placeToVist에 넣어주기
placeToVisit.addAll(stringArrayList); //따로 index를 명시하지 않았으니 맨 뒤에 넣어줍니다
System.out.println(placeToVist);
//Prints [Sydney, NewYork, LA, Florida, Melbourne, Brisbane, ArrayListElement1, ArrayListElement2, ArrayListElement3, ArrayListElement4]
add와 addAll은 ArrayList에도 있는 method인데,
LinkedList는 추가적으로 addFirst()와 addLast()도 있습니다.
addFirst는 List의 가장 앞에 요소를 넣는 것이고, addLast는 가장 마지막에 넣는 것입니다. 사실 add()도 addLast와 같은 기능을 하는데, 왜 따로 있는지를 찾아보니
add()는 Collection interface에, addLast()는 Deque interface에 선언되어 있는데, LinkedList가 두 interface를 모두 implements하기 때문에 두개의 method를 모두 갖는 것이라고 합니다.
2. 요소 가져오기
특정 인덱스의 요소를 가져오는 방법은 역시 .get(index)를 사용합니다. LinkedList에는 추가적으로 .getFirst()와 .getLast()가 있는데,
위의 예시를 이용해보면 이렇게 값을 반환하게 됩니다.
System.out.println(placeToVist.getFirst());
//Prints Sydney
System.out.println(placeToVist.getLast());
//Prints ArrayListElement4
유사한 기능을 가진 method에 peek(), peekFirst(), peekLast()가 있습니다. get과의 차이는, list안에 아무런 요소가 없을 때 어떻게 핸들링이 되느냐에 있습니다. get 종류는 list가 비어있는 경우에는 java.util.NoSuchElementException 에러를 발생시키는 반면, peek 은 null을 반환합니다.
LinkedList<String> emptyList = new LinkedList<>();
//String a = test.getFirst();
String b = emptyList.peekFirst();
String c = emptyList.peek();
//System.out.println(a); //java.util.NoSuchElementException error
System.out.println(b); //Returns null
System.out.println(c); //Returns null
3. 요소 삭제하기
요소를 삭제하기 위해서는 .remove() 관련 methods를 사용하면 됩니다.
아래처럼 사용해볼 수 있습니다. 문서에는 removeAll(Collection c)은 나와있지 않지만, List interface의 기본 method이기 때문에 LinkedList에서도 사용이 가능합니다.
LinkedList<String> placeToVisit2 = new LinkedList<>(){
{
add("NewYork");
add("LA");
add("Florida");
add("LA");
add("Seattle");
add("Chicago");
add("NewYork");
add("Boston");
add("Seattle");
add("NewYork");
}};
//첫번째 요소 삭제
placeToVisit2.remove();
//[LA, Florida, LA, Seattle, Chicago, NewYork, Boston, Seattle, NewYork]
//처음으로 나타나는 해당 object 삭제
placeToVisit2.remove("LA");
//[Florida, LA, Seattle, Chicago, NewYork, Boston, Seattle, NewYork]
//파라미터로 받은 index에 있는 요소 삭제
placeToVisit2.remove(3);
//[Florida, LA, Seattle, NewYork, Boston, Seattle, NewYork]
//첫번째 요소 삭제
placeToVisit2.removeFirst();
//[LA, Seattle, NewYork, Boston, Seattle, NewYork]
//마지막 요소 삭제
placeToVisit2.removeLast();
//[LA, Seattle, NewYork, Boston, Seattle]
LinkedList에 담긴 요소를 다룰 수 있도록 해주는 방법들을 methods를 통해 알아보았습니다. ArrayList와 상당히 유사하죠? 아무래도 둘 다 List를 implements하고 있어서 그런 것 같습니다.
List, Set, Map 이렇게 큼지막한 틀부터 잘 이해하고 있으면 파생된 친구들은 사용이 어렵지는 않을 것이라는 생각이 듭니다 ☺️
보완한 사항이 있다면 꼭 댓글로 알려주세요 감사합니다 ☺️☺️
참고자료
공식문서
https://docs.oracle.com/javase/8/docs/api/
https://www.codekru.com/java/linked-list-addfirst-and-addlast-methods
remove()와 poll()의 차이점
https://docs.oracle.com/javase/7/docs/api/java/util/Queue.html
'Java > CollectionFramework' 카테고리의 다른 글
Collection framework - Map (0) | 2022.05.15 |
---|---|
ArrayList (0) | 2022.05.03 |