2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바]Arraylist,LinkedList 사용방법

2022. 11. 26. 17:23ㆍJAVA 기초

ArrayList와 LinkedList를 알기전 우리는 컬렉션프레임 워크를 알아야 합니다.


컬렉션이란?

컬렉션은 모으다 라는 뜻입니다.

프레임워크란?

프레임워크는 무슨 뜻일까요?
응용프로그램이나 앱 등을 쉽고 빠르게 만들기 위해서 제공하는 컴파일러
편집기,라이브러리 등을 모아놓은 곳 입니다.

컬렉션프레임워크

즉 컬렉션프레임워크란 뜻은 응용프로그램등을 빠르게 만들기 위해서 모아놓은 자료구조 입니다.

그렇다면 컬렉션프레임워크에는 어떤 것 들이 있을까요?


  • SET
  • LIST
  • MAP

이 세 개가 컬렉션프레임워크에 대표적인 자료구조 입니다.
저희는 오늘 List를 알고자 합니다.

List란?

리스트에는 여러가지 자료구조가 있지만 대표적으로 가장 많이 쓰는
두 가지 자료구조를 소개 할려합니다.

  • Arraylist
  • LinkedList

Arraylist는 어떤 것 일까요?


저희는 이때까지 수 많은 배열을 사용해왔습니다.
하지만 배열을 사용하면 불편한 문제점들이 있습니다.

  • 배열의 크기가 고정되어있다.
  • 삽입과 삭제가 어렵고 오래걸린다.
  • 이를 위한 연산작업이 수행되어 비효율적이다.
  • 자료의 수에 비례하여 성능이 떨어지게 된다.
  • 메모리의 재사용이 불가능하다.

이러한 여러문제점들이 존재합니다.
이 단점을 보완한 것이 자료구조 Arraylist입니다.
가장 큰 문제점을 보완한 배열의 크기를 자유롭게 사용 할 수 있다는 것이 가장 큰 장점입니다.
저희는 이 자료구조를 배우면 더 이상 일반적인 배열을 사용할 필요가 없어집니다.

ArrayList

ArrayList를 사용하기 위해선 아래 구문을 먼저 추가해야 합니다.

이 구문을 추가하였다면 저희는 이제 Arraylist에 객체를 생성해서 사용 할 수 있게됩니다.


사용 방법은


ArrayList 타입으로 list참조 변수를 만들어 Arraylist 객체를 만들어 사용합니다.
이렇게 만들면 ArrayList의 담길 타입의 제한을 없앨 수 있습니다.
이게 무슨 뜻이냐한다면 이때까지 저희들은 배열을 담을때 같은 타입만 배열에 담았습니다.
하지만 이렇게 선언한다면 타입의 제한 없이 배열에 넣을 수 있습니다.
예시로 한번 봅시다.


정말 간단한 예제입니다. list안에 다양한 타입의 변수를 집어 넣었습니다.
원래 배열의 경우 같은 타입만 들어가기 때문에 런타임오류를 일으킵니다.
과연 답이 어떻게 나올까요?

배열의 타입이 다르지만 값이 잘 들어간걸 확인 할 수 있습니다.

이 방법이 아닌 제네릭으로 생성 하는 방법도 있습니다.

※ 제네릭 (Generic)
- 컬렉션 객체를 생성할 때 저장되는 데이터의 타입을 미리 지정하는 기능 - 제네릭으로 지정한 타입 외에는 담길 수 없도록 함


제네릭으로 생성하는 방법 입니다.
이 방법은 String타입을 지정했기 때문에 지정된 타입 이외에는 배열의 값에 들어올 수 없게 됩니다.


다른 타입을 넣으니 값이 안들어 가는걸 확인 할 수 있습니다.

또 다른 방법은 Collection를 타입으로 두어 사용하는 방법 입니다.


이 방법이 가장 좋은 방법 입니다.
Arraylist는 Collection를 상속받았기 때문에 타입에 Collection을 지정하는 것이 가능합니다.
그렇기에
Arraylist list = new Arraylist를 만들었지만 이 자료구조를 사용하지 않고 다른 자료구조를 사용 해야 할 경우
이 객체생성은 쓰지 못합니다. 하지만 Collection을 타입으로 둔다면 객체 값만 바꾸면 사용 할 수 있습니다.
그렇기에 이 방법이 가장 좋은 방법입니다.


결론적으로
Arraylist를 생성 하는 방법은

  • Arraylist list = new Arraylist() //타입 지정 X
  • Arraylist<type> list = new Arraylist // 제네릭으로 타입지정
  • Collection list = new Arraylist 타입을 컬렉션으로 두어 범용성을 넓힘
  • Collection<type> list = new Arraylist


이제 생성 방법을 알았으니 주요 메서드를 알아야 합니다.
자료구조의 메서드는 다르기 일반 배열과 넣는 방법이 다르기 때문에
이 메서드를 사용해서 써야 합니다.

[ add() ]

  • 순서대로 리스트를 추가
  • 배열 사이즈 초과 시 초기 설정된 사이즈만큼 자동으로 사이즈가 증가함
  • 인덱스를 추가로 지정해주면 해당 인덱스에 값을 삽입
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("대전");
		list.add("대구");
		list.add("부산");
		list.add(1, "LA"); // 1번 인덱스에 값 삽입
		
		System.out.println(list); // [서울, LA, 대전, 대구, 부산]
	}
}


[ get() ]

  • 인덱스를 제공하면 해당 값을 반환
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		System.out.println(list.get(0)); // "서울"
	}
}



[ set() ]

  • 인덱스, 바꿀 값을 제공하면 해당 인덱스의 값을 바꿔줌
package study.first;

import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("사과");
		list.add("배");
		list.add("포도");
		
		list.set(0, "감");
		System.out.println(list);  // [감, 배, 포도]
	}

}



[ indexOf() / lastIndexOf() ]

  • 값을 제공하면 해당 값의 인덱스를 반환
  • indexOf()는 0부터 순서대로 검색해서 첫 번 째 값의 인덱스를 반환
  • lastIndexOf()는 반대 순서로 검색
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		System.out.println(list.indexOf("LA"));     // 1
		System.out.println(list.lastIndexOf("LA")); // 3
	}
}



[ remove() ]

  • 인덱스 제공 시 해당 인덱스의 값 삭제
  • 값 제공 시 첫번 째 검색 값 삭제
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");
		
		list.remove(0);    // "서울" 삭제
		list.remove("LA"); // "LA" 삭제
		
		System.out.println(list); // [대전, LA, 부산]
	}
}



[ contains () ]

  • 값을 제공하면 해당 값이 배열에 있는지 검색해서 true / false 반환
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		System.out.println(list.contains("LA"));   // true
		System.out.println(list.contains("제주도")); // false
	}
}



[ toArray() ]

  • ArrayList 타입의 인스턴스를 일반 배열 타입으로 반환
  • 저장할 배열 타입에 맞춰 자동 형변환
  • 배열 크기 또한 자동으로 맞춰서 바꿔줌
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

	ArrayList<String> list = new ArrayList<String>();

	list.add("서울");
	list.add("LA");
	list.add("대전");
	list.add("LA");
	list.add("부산");

	String[] arr = list.toArray(new String[list.size()]);
	
    for (String num : arr)
		System.out.print(num + " ");  // 서울 LA 대전 LA 부산
	}
}



[ clear() / isEmpty() ]

  • clear() : 배열의 값 모두 삭제
  • isEmpty() : 배열이 비었으면 true, 하나라도 값이 있으면 false 반환
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();

		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		list.clear();
		System.out.println(list.isEmpty());	// clear 했으므로 true
	}
}



[ addAll() ]

  • 두 컬렉션을 합침
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		ArrayList<String> list2 = new ArrayList<String>();
		list2.add("김치");
		list2.add("멸치");
		list2.add("국수");
		list2.add("비빔면");

		list.addAll(list2);	// 두 컬렉션 합치기
		System.out.println(list);
		// [서울, LA, 대전, LA, 부산, 김치, 멸치, 국수, 비빔면]
	}
}



[ containsAll() ]

  • argument로 제공한 컬렉션의 모든 값이 포함되어 있는지 여부를 true / false로 반환
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		ArrayList<String> list2 = new ArrayList<String>();
		list2.add("김치");
		list2.add("멸치");
		list2.add("국수");
		list2.add("비빔면");

		System.out.println(list.containsAll(list2)); // 합치기 전 false
		
		list.addAll(list2);	// 두 컬렉션 합치기
		System.out.println(list.containsAll(list2)); // 합친 후 true
	}
}




[ retainAll() ]

  • argument로 제공한 컬렉션 내에 들어있는 값을 제외하고 모두 지워줌
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		ArrayList<String> list2 = new ArrayList<String>();
		list2.add("LA");
		list2.add("대전");

		list.retainAll(list2);     // LA, 대전 빼고 모두 삭제
		System.out.println(list);  // [LA, 대전, LA]		
	}
}



[ removeAll() ]

  • argument로 제공한 컬렉션 내에 들어있는 값과 일치하는 값을 모두 지워줌
  • retainAll() 메소드와 반대
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		ArrayList<String> list2 = new ArrayList<String>();
		list2.add("LA");
		list2.add("대전");

		list.removeAll(list2);    // list2에 포함된 값 모두 삭제
		System.out.println(list); // [서울, 부산]		
	}
}



[ size() ]

  • 현재 저장돼 있는 값의 갯수 반환
package study.first;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {

		ArrayList<String> list = new ArrayList<String>();
		list.add("서울");
		list.add("LA");
		list.add("대전");
		list.add("LA");
		list.add("부산");

		System.out.println(list.size());  // 5	
	}
}

LinkedList

LinkedList도 마찬가지 입니다.
Arraylist와 동일하게 작성하면 됩니다.

더보기
LinkedList linkedList = new LinkedList();
LinkedList<String> list2 = new LinkedList<>();
Collection list = new LinkedList();
Collection<String> list1 = new LinkedList<>();

여기서 사용하고자 하는 부분을 편하게 작성하면 됩니다/

ArrayList vs LinkedList


Arraylist와 LinkedList의 차이는 무엇이있나요?



쉽게 이 사진 한장만 기억하면 됩니다.
Arraylist는 배열로 되어있습니다. 그렇기에 인덱스 번호마다 값이 들어갑니다.
하지만 Arraylist를 지울때는 어떻게 지워질까요?


만약에 23의 값을 지우고 싶다면 6번의 인덱의 인덱스를 찾아서 삭제 합니다.
하지만 그 6번의 공간이 없기 때문에 7,8,9번의 인덱스를 한칸씩 옮겨줘야 합니다.
그렇기에 배열이 작다면 문제가 되진 않지만 배열이 크다면 성능의 저하로 이어질 수 있습니다.

LinedList


하지만 LinkedList의 경우는 이름 그대로 Link로 이어져있기 때문에 삭제를 하면 그
링크를 끊어 버리고 다음 주소의 있는 배열의 주소 값과 연결합니다. 그렇기에
성능의 저하가 일어나지 않습니다.
그렇기에 여러분들이 판단하는대로 List의 자료구조를 사용 하시면 됩니다.