Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

선진이네

[JAVA] Collection - List 본문

Language/JAVA

[JAVA] Collection - List

악마선진 2023. 1. 26. 10:56

특징

  • 순서가 있는 데이터의 집합
  • 순서가 있으므로 데이터의 중복을 허락
  • 초기에 크기 설정 불필요, 때에 따라 배열을 자연스럽게 늘려줌

주요 메서드

  • 추가 : add(int index, E element), addAll(int index, Collection<? extends E> c)
  • 조회 : get(int index), indexOf(Object o), lastIndexOf(Object o), listIterator()
  • 삭제 : remove(int index)
  • 수정 : set(int index, E element)
  • 기타 : subList(int fromIndex, int toIndex)
import java.util.ArrayList;
import java.util.List;

public class ListTest {
    // 문자열을 저장할 List, 구현체는 ArrayList
    List<String> friends = new ArrayList<>();

    public static void main(String[] args) {

        ListTest alt = new ListTest();
        alt.createTest();
        alt.retrieveTest();
        alt.updateTest();
        alt.deleteTest();
    }

    public void createTest() {
        friends.add("김선진");
        friends.add("김갑동");
        friends.add("김선진");
        friends.add(0, "용용이");
        System.out.println("추가 후 내용 출력: " + friends);
    }

    public void retrieveTest() {
    	System.out.println("List의 size ? : " + friends.size());
    	for (int i = 0; i < friends.size(); i++) {
			System.out.println(friends.get(i));
		}
    	for(String friend : friends) {
    		System.out.println(friend);
    	}
    	System.out.println(friends.contains("김선진"));
    	System.out.println(friends.indexOf("김갑동"));
    }

    public void updateTest() {
        int idx = friends.indexOf("김선진");
        if(idx >= 0) {
        	friends.set(idx, "선진킴");
        }
    }

    public void deleteTest() {
    	friends.remove(0);
    	friends.remove("김갑동");
        // END:
        System.out.println("삭제 후 : " + friends);
        System.out.println("초기화 후 : " + friends);
    }
}
  • 기본적으로 추가는 맨 뒤에 삽입 개념, 옵션 준다면 위치 설정 가능
  • Collection은 수정이 안됐지만, List는 set메서드를 통해 수정 가능

배열과 ArrayList

  • 배열의 장점
    • 가장 기본적인 형태의 자료 구조로 간단하며 사용이 쉬움
    • 접근 속도가 빠름
  • 배열의 단점
    • 크기를 변경할 수 없어 추가 데이터를 위해 새로운 배열을 만들고 복사해야함
    • 비 순차적인 데이터의 추가, 삭제에 많은 시간이 걸림
  • 배열을 사용하는 ArrayList도 태생적으로 배열의 장-단점을 그대로 가져감

LinkedList 와 ArrayList의 용도

  • 특정 클래스가 좋고 나쁨이 아니라 용도에 적합하게 사용해야 함
  • 소량의 데이터를 가지고 사용할 경우에는 큰 차이가 없음
  • 정적인 데이터 활용, 단순한 데이터 조회용 : ArrayList
  • 동적인 데이터 추가, 삭제가 많은 작업 : LinkedList

자료 삭제 시 주의 사항

  • index를 이용한 for 문
List <Integer> nums = new ArrayList<>();
Random rand = new Random();

for(int i = 0; i < 10; i++){
	nums.add(rand.nextInt(20));
System.out.println("전체 : " + nums);

for(int i = 0; i < nums.size(); i++){
	if(nums.get(i) % 2 == 0){
		nums.remove(i);
		i--;
	}	
}
System.out.println("짝수 삭제 후 : " + nums);
  • 삭제가 올바르게 안 일어나는 예시
    • 요소가 삭제되면 size가 줄어들기 때문에 index 차감 필요
    • 거꾸로 접근하면 자연스럽게 해결
    for(int i = nums.size() - 1; i >= 0; i--){
    	if(nums.get(i) % 2 == 1){
    		nums.remove(i);
    	}
    }
    
  • forEach 문장은 Collection 크기가 불변해야함!
    • 따라서 forEach문을 사용하면 삽입 삭제는 안 하는게 좋음!