[Java]::Remind - Collection (List) - 1 -

Gentlee's Self-Study Log·2023년 5월 10일
0

Java Reminder

목록 보기
9/19
post-thumbnail

Java Collection Framework

Java에서 배열에 비효율적인 문제 중 하나는 크기가 고정적이라는 것이다. 배열의 크기는 생성될 때, 크기가 정해지고 정해진 크기 이상으로 데이터를 저장할 수 없기 때문에 문제가 발생합니다. 이를 해결하기 위해 자바에서는 객체와 데이터들을 효율적으로 관리할 수 있는 자료구조를 라이브러리로 제공하는데 이것이 Collection Framework이다.


(출처-https://coding-factory.tistory.com/550)

List Colletion

List 컬렉션은 객체를 배열과 비슷하게 일렬로 늘어놓은 구조를 가지고 있으며, 인덱스를 사용하여 객체를 관리한다. 크기가 정해져 있는 배열과는 다르게 List는 객체를 저장할 때, 인덱스가 자동으로 부여되고, 해당 인덱스는 데이터가 저장되어 있는 참조값을 가지고 있다.

흔히 List Collection에는 대표적으로 세가지가 있다.

  • ArrayList
  • Vector
  • LinkedList

ArrayList

ArrayList는 List 인터페이스를 상속받는 클래스로 크기가 가변적으로 변하는 선형구조이다. 배열과 같이 객체를 저장할때 순서가 있으며 인덱스로 데이터를 관리할 수 있다. 하지만 생성될 때 크기가 정해지는 배열과 다르게 ArrayList는 일정 capacity(저장용량)에 객체를 저장하다가 초과될 때 자동으로 capacity가 늘어난다.

ArrayList - 생성자

ArrayList list1 = new ArrayList(); //타입선언없이 생성하면 Object타입
ArrayList<String> list2 = new ArrayList<String>(); // String 타입
ArrayList<Integer> list3 = new ArrayList<>(); //타입 파라미터 생략가능
ArrayList<Integer> list4 = new ArrayList<>(10); //초기 capacity 지정

ArrayList - 메서드

add(1) : 1 값을 추가하는 메서드
add(1, 3) : 1값을 인덱스 3에다가 추가
add(null) : null값 추가

- 인덱스 중간에 값을 추가하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 뒤로 밀려난다.

isEmpty() : 리스트가 비어있는지 체크하는 메서드
clear() : 리스트 안에 객체를 싹 다 지운다.
remove("MY") : 값을 찾아서 지운다.
remove(3) : 3 인덱스를 지운다.
size() : 리스트에 자료 개수
capacity() : 리스트에 물리적 크기
Arrays.asList("서울","대구","부산") : 서울, 대구, 부산 값을 갖는 리스트를 생성한다.
get(3) : 3 인덱스의 값을 출력한다.

ArrayList - Iterator

ArrayList 안에 있는 데이터를 하나하나 접근할 때, iterator를 사용한다.
커서의 개념이다.

ArrayList<String> list = new ArrayList<>();
Iterator<String> iter = list.iterator(); //iterator 객체로 생성
while(iter.hasNext()){  		// hasNext() = 커서 다음의 값이 있는지 
	System.out.println(iter.next());	//next() = 커서 다음의 값 출력 후, 커서 이동
}

Vector

Vector는 ArrayList와 비슷한 구조이다. 둘 다 추가되는 값에 따라 자동으로 크기가 조절된다. 다른 점은 Vector는 동기화된 메서드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행하지 못하고, 하나의 스레드가 실행 완료된 후, 다른 스레드들이 실행될 수 있다. 그래서 Vector는 멀티스레드안에서 안전하게 객체의 추가와 삭제가 가능하다.

Vector는 항상 동기화가 되는 장점이자 단점이 있다. 스레드가 1개일때도 동기화를 하기 때문에 ArrayList보다 성능이 떨어진다.

Vector - 생성자

Vector v = new Vector(); //타입 선언없이 생성하면 Object로 선언된다.
Vector<String> v1 = new Vector<String>(); //String타입
Vector<Integer> v2 = new Vector<>(); //타입 파라미터 생략가능
Vector<Integer> v3 = new Vector<Integer>(10); // 초기 용량 지정 가능

Vector - 메소드

add(1) : 1 값을 추가하는 메서드
add(1, 3) : 1값을 인덱스 3에다가 추가
add(null) : null값 추가

  • 인덱스 중간에 값을 추가하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 뒤로 밀려난다.

remove(1) : index 1 제거
removeAllElements() : 모든 값 제거
clear() : 모든 값 제거
size() : 리스트에 자료 개수
capacity() : 리스트에 물리적 크기

Vector - Enumeration

Vector 안에 있는 데이터를 하나하나 접근할 때, Enumeration를 사용한다.
Iterator와 똑같은 역할을 하지만 차이점은 동기화가 되어 있는 차이이다.
예를 들어 A가 객체에 접근하고 있을 때, B가 객체중 일부를 삭제하거나 수정하면 Iterator는 오류가 나지만, 동기화 처리되어 있는 Enumeration은 오류가 나지 않는다.

Vector<String> v = new Vector<>();
Enumeration<String> en = v.elements();  //enumeration객체 생성
whiel(en.hasMoreElements()){  //커서 다음의 값이 있는지
	String city=en.nextElement(); //커서 다음의 값을 출력 후, 커서 이동
    System.out.println(city);
}

LinkedList

LinkedList는 ArrayList나 Vector 같이 데이터가 순차적으로 이루어지는 공간구조가 아닌 아래 사진처럼 한 공간안에 데이터가 저장되어 있다. 각각의 데이터는 서로 다음번에 올 데이터의 주소값을 가지는 형식으로 이루어져 있다.

LinkedList는 앞서 설명했듯이 인덱스로 관리하는것이 아닌 각각의 노드가 데이터와 다음번에 올 노드의 주소값을 가지는 포인터를 가지고 있기 때문에 ArrayList나 Vector같이 객체가 추가되거나 삭제될 때 전체의 객체가 한칸씩 밀리거나 당기어질 필요가 없어서 추가와 삭제 측면에서는 주소값을 가지는 포인터만 수정하면 되기때문에 다른 List보다 편하게 추가/삭제가 가능한다. 하지만, 인덱스로 관리를 하지 않기 때문에 탐색을 할 때 순차적으로 해야함으로 속도적인 측면에서는 다른 List 보다 효율이 떨어진다.

LinkedList - 생성자

LinkedList v = new LinkedList(); //타입 선언없이 생성하면 Object로 선언된다.
LinkedList<String> v1 = new LinkedList<String>(); //String타입
LinkedList<Integer> v2 = new LinkedList<>(); //타입 파라미터 생략가능
LinkedList<Integer> v3 = new LinkedList<Integer>(10); // 초기 용량 지정 가능

LinkedList - 메소드

add(1) : 1 값을 추가하는 메서드
addFirst() : 가장 앞에 추가
addLast() : 가장 뒤에 추가
add(1, 3) : 1값을 인덱스 3에다가 추가
add(null) : null값 추가
remove(1) : index 1 제거
removeFirst() : 가장 앞에 삭제
removeLast() : 가장 뒤에 삭제
clear() : 모두 삭제
size() : 크기 구하기
get(n) : n번째 데이터 출력
contains(n) : list에 n이 있는지 검색
indexOf(n) : n이 있는 인덱스 반환/없으면 -1반환

LinkedList - Interator

Iterator<Integer> iter = list.iterator(); //Iterator 선언 
while(iter.hasNext()){//다음값이 있는지 체크
    System.out.println(iter.next()); //값 출력
}
profile
https://github.com/SamGentlee

0개의 댓글