☕JAVA/🐣 강의 [JAVA]

[JAVA][기초] Collection 인터페이스 - List / Set 인터페이스

디카페인라떼 2022. 11. 10. 17:17

[기초] 시리즈는 본강의를 수강후 정리한 글들 입니다.

Java for Beginner - YouTube

 

Java for Beginner

[교재 link] https://github.com/namoosori/java-for-beginner/tree/master/doc Java for Beginner 강의에서 다루는 내용은 다음과 같습니다. - Java 개요 : Java 언어가 어떤 언어이고 Java 언어를 이용해 프...

www.youtube.com


💡Collection 인터페이스

  •  java.util.Collection 인터페이스
    • 컬렉션 프레임워크의 최상위 인터페이스
    • 요소(객체)에 대한 삽입, 삭제, 탐색의 기능을 정의
  • 주요 메소드
add() 새로운 요소를 삽입. 중복요소를 허용하지 않는 경우 false 반환
clear() 모든 요소를 제거
contains()  파라미터로 전달되는 객체가 요소로 존재하는지를 반환
isEmpty() 해당 컬렉션이 포함하고 있는 요소가 0인지 반환
remove() 파라미터로 전달되는 개체를 제거. 전달되는 객체가 요소로 존재하지 않으면 false 반환
 size()  현재 포함하고 있는 요소의 개수 반환
iterator() 해당 컬렉션이 포함하고 있는 요소들을 순회하기 위한 iterator 객체를 반환
  • Java 8 버전 이후 Stream 관련 디폴트 메소드들이 추가됨. => Stream, Lamda 강의 시 추가로 
  • java.util.Collection 추가 기능과 같은 주요 메소드
addAll()  파라미터로 전달되는 컬렉션의 모든 요소를 추가
containsAll() 파라미터로 전달되는 컬렉션의 모든 요소를 현재 포함하고 있다면 true
 removeAll() 파라미터로 전달되는 컬렉션의 요소들과 일치하는 요소를 모두 제거
retainAll()   파라미터로 전달되는 컬렉션의 요소들과 일치하지 않는 요소들을 모두 제거 

  • 꺼내는 방식은 List, set 등이 모두 다르기 때문에 따로 없음.

 


💡List 인터페이스

  • List 인터페이스를 상속 받는 만큼 사용하는 방법은 동일하지만 내부적으로 어떤 식으로 이루어지는 지에대한 각각의 특징을 알아야 알맞은 타입을 선택할 수 있음. 
  • List 계열의 컬렉션은 저장요소를 순차적으로 관리하며 중복된 값과 null 값을 요소로 가질 수 있음.
  •  요소에 대한 접근은 배열과 마찬가지로 인덱스를 통해 접근
  •  배열 자료구조 형태로 저장할 때 저장 데이터의 특성에 따라 적절한 List 계열의 클래스들을 활용
  •  List 인터페이스를 구현한 대표클래스는 ArrayList, LinkedList, Vector 클래스가 있음.
    • => (Vector) 동기화처리에 따른 분류 
    • => 최근에는 멀티스레드 환경에서 ArrayList나 LinkedList를 동기화 처리하여 사용하는 것이 대부분

📌ArrayList 클래스

  • 내부에 배열을 가지고 있음. 따라서 고정 길이 저장 공간으로 요소들을 관리
  • capacity : ArrayList 클래스의 내부 배열이 요소를 담을 수 있는 용량
  •  내부 배열의 용량을 넘어 요소를 저장할 경우 내부적으로 용량을 늘린 새로운 배열을 만들어 요소를 담음.
    • => 길이의 제한을 두지 않고 배열을 사용 가능
  •  요소에 대한 접근은 배열과 마찬가지로 인덱스를 통해 접근
  •   ArrayList는 순차적으로 요소를 저장할 수 있는 메소드와 인덱스를 통해 저장할 수 있는 add() 메소드를 제공.
  •  특정 인덱스에 요소를 저장할 경우 기존에 저장된 요소들의 이동이 내부적으로 이루어짐.
  •  특정요소를 삭제하기 위해서는 해당 요소의 인덱스가 필요하며 이 경우에도 저장된 요소들의 이동이 발생
    •  ArrayList 가 갖는 이와 같은 특징 (용량, 요소의 이동)은 추가, 삭제가 빈번한 데이터의 관리에는 적합하지 않음. 

 

📌LinkedList 클래스

  • 집합하는 각 요소들을 노드로 표현하고, 각 노드들을 서로 연결하여 리스트를 구성 (단방향, 양방향 둘다 가능)
  • 요소를 갖는 각 노드들은 다음 노드에 대한 참조정보를 통해 접근
  • 노드는 필요할 경우 만들어서 연결하여 사용하기 때문에, 미리 정리된 용량 ( capacity )의 개념이 없음.
  • List 인터페이스를 구현한 다른 클래스들과 마찬가지로 인덱스를 통해 요소에 접근
  • 요소의 추가는 곧 노드의 추가를 의미하며 일반적인 추가 (add)는 순차적으로 링크를 연결하며 추가
  • 인덱스를 지정해 특정 지점에 요소를 추가할 경우에는 기존 노드의 연결을 끊고 새로운 노드를 연결하여 추가
  • 요소의 삭제는 삭제할 노드가 갖고 있는 다음 노드에 대한 포인트를 지언 노드가 포인트 할 수 있도록 하여 삭제
  • ArrayList와 달리 요소의 추가, 삭제에 대한 부하가 적은 반면 메모리의 사용은 더 많음.
    • => 데이터의 추가 삭제가 빈번할 경우 LinkedList가 성능에 더 좋음. 

 


💡Set 인터페이스

  • Set 인터페이스를 구현한 컬렉션 클래스들의 가장 큰 특징은 저장하는 요소의 중복을 허용하지 않음.
    • => 중복에 대한 결정은 사용자가 직접 지정. equals와 Hashcode를 재정의해주어야 함. 
    • => Generate로 equals and hashcode
  •  Set 인터페이스의 구현 클래스들은 equals() 메소드를 이용해 저장 요소의 중복을 검사
  • Set 인터페이스가 정의하고 있는 추상 메소드 중에는 단일 요소를 꺼내기 위한 get() 메소드가 존재하지 않음.
    • => 꺼낸다면 전체 요소들을 순회하면서 꺼내는 방법 밖에 없음. 
    • => iterator를 이용해야 함!
  •  주요클래스는 HashSet, LinkedHashSet, TreeSet 등이 있음.