Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Server
- Junit 5
- JPQL
- ExceptionResolver
- Coputer Science
- Test
- backend
- Spring
- ObjectMapper
- mapstruct
- 공룡책
- enumSet
- Test code
- MySQL
- Test Doulbe
- Service 계층 테스트
- OS
- 인프콘2023
- Java
- RequestBody
- db
- 테크쇼
- 일상
- 소프티어
- JPA
- softeer
- proxyFactory
- modelmapper
- 자바
- FCM
Archives
- Today
- Total
공부내용공유
Java Array, List 차이, 사용법 본문
서론
지금까지 알고리즘 문제를 python으로만 해서 문제를 풀 때 자료형에 관해서 크게 고민을 하면서 푼적이 없었다.
요즘 자바로도 코딩 테스트 연습을 하고 있는데 array 와 list 를 언제 쓰고 어떻게 쓰는지에 대해 이해도가 부족함을 느껴 정리하고자 이 글을 작성하였다.
목차
- Array 란
- List 란
- 장,단점
- 활용법
본론
Array 란?
- 여러 데이터들이 index (식별자) 와 값으로 구성된 자료구조
- index 는 유일한 식별자이다.
- 논리적 저장 순서와 물리적 저장 순서가 동일하다
- index를 통한 접근이 O(1) 이다.
- 캐시 hit 가 일어나기 좋다
- 초기에 크기를 정하고 , 컴파일 이후 크기 변경이 불가능 하다.
- 연속된 메모리 공간으로 이루어져 있다.
List 란?
- 순서가 있는 엘리먼트의 모임으로 배열과 다르게 빈 엘리먼트를 허용하지 않는다.
- 인덱스는 배열과 달리 유일한 식별자라기 보단 순서정도를 나타낸다.
- 순차성을 보장하지 않는다.
- 캐시 hit 이 일어날 확률이 적다.
- 크기를 동적으로 정할 수 있다.
- 불연속적인 메모리 공간으로 이루어져 있다.
장,단점
Array
- 장점
- 메모리 공간이 연속적이여서 관리가 편하다.
- 인덱스를 사용한 검색이 빠르다.
- 단점
- 컴파일 이후 크기 변화가 불가능 하다.
- 데이터가 삭제되도 공간은 남아있기 때문에 비효율적이다.
- 정적이여서 배열의 크기를 컴파일 이전에 정해줘야 한다.
List
- 장점
- 포인터가 바로 다음 데이터를 가르키기 때문에 삽입, 삭제 연산이 빠르다.
- 크기 할당을 동적으로 할 수 있다.
- 데이터 삭제시 포인터가 해당 공간을 안가르키기 때문에 효율적이다.
- 단점
- 검색 성능이 좋지 않다. (5번째 객체를 검색하려면 1,2,3,4,5 의 순서를 거쳐야 한다.)
- 기본 타입을 담을 수 없다(객체 타입만 가능 Wrapper class 사용해야 함)
- 포인터를 통해 데이터를 가르키므로 추가적인 메모리 공간이 발생한다.
결론
- 배열: 데이터의 크기가 변하지 않고, 추가적인 삽입이나 삭제가 잘 안일어나고 조회가 많이 발생하는 경우 효과적이다.
- 리스트: 데이터의 크기가 가변적이고, 삽입 삭제 연산이 많이 발생하며 조회가 적게 발생되는 경우 효과적이다.
활용법
Array 활용법
//크기 할당 & 초기화 없이 배열 참조변수만 선언
int[] arr;
int arr[];
// 선언과 동시에 배열 크기 할당
int[] arr = new int[510];
String[] arr = new String[10];
// 기존 배열의 참조 변수에 초기화 할당하기
int[] arr;
arr = new int[5]; //5의 크기를 가지고 초기값 0으로 채워진 배열 생성
// 선언과 동시에 배열의 크기 지정 및 값 초기화
int[] arr = {1,2,3,4,5};
int[] arr = new int[] {1,3,5,2,4};
String[] friuts= {"사과","배","복숭아","망고"};
// 2차원 배열 선언
int[][] arr = new int[4][3]; //4행 3열의 2차원 배열 선언
int[][] arr = { {2, 5, 3}, {4, 4, 1}, {1, 7, 3}, {3, 4, 5}}; // 선언 후 값 바로 넣어주기
초기화를 할때 배열 안에 값이 primitive 이면 초기값이 있지만 (int 의 경우는 0)
참조타입의 배열을 선언할 경우 엘리먼트의 초기값은 null 임을 주의해야 한다.
int[] arr = {1,2,3,4,5};
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
for(int number : arr) {
System.out.println(number);
}
//결과
//1
//2
//3
//4
//5
List 활용법
자주 사용되는 ArrayList는 List interface의 구현체이다.
특징
- 처음에 설정한 용량으로 만들어지나 데이터가 추가적으로 들어와 용량이 더 필요하면 배열 크기를 1.5 배 증가시킨다.
- primitive 는 담지 못함 객체 타입인 Wrapper 를 이용해야함
- 표준 배열보다는 느림
활용법
//선언
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> list2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Product> pList = new ArrayList<>(); // 타입으로 클래스도 가능
//삭제
list.remove(2); // 2번 인덱스 삭제 => remove(index)
list.clear(); // 리스트의 모든 값 삭제
list.remove(list.indexOf(2)); // 리스트에 2를 포함한 인덱스 리턴 후 삭제
// 값 조회
int index = list.indexOf(2); // 원하는 값의 인덱스를 리턴, 없으면 -1 리턴
boolean b = list.contains(2); // 원하는 값의 존재 유무
while(list.indexOf(2) == -1) { // 리스트에 원하는 값 모두 삭제
list.remove(list.indexOf(2));
}
//리스트 출력
System.out.println(list); // 리스트 전체 출력
System.out.println(list.get(2)); // 2번 인덱스 출력
for(int i : list) {
System.out.println(i);
}
Iterator iter = list.iterator(); // 반복자 사용
while(iter.hasNext()){
System.out.println(iter.next());
}
참고 블로그
https://velog.io/@adam2/Array%EC%99%80-List%EA%B7%B8%EB%A6%AC%EA%B3%A0-Java-List
https://crazykim2.tistory.com/558
https://brownbears.tistory.com/520
'Server > Java' 카테고리의 다른 글
java, kotlin에서 null 처리 (0) | 2024.03.31 |
---|---|
java hashMap 살펴보기 (feat: red black tree) (2) | 2024.03.15 |
Enum 활용하기 (feat : EnumSet, EnumMap) (0) | 2024.03.08 |
Wrapper class 의 비교 연산자 (0) | 2023.08.02 |
Java Deque / ArrayDeque, LinkedListDeque, ConcurrentLinkedDeque, LinkedBlockingDeque 특징 (0) | 2023.07.14 |