Java 코딩 테스트 준비 - 배열과 리스트 차이, 변환 방법

기운찬곰·2023년 10월 1일
0
post-thumbnail

Overview

간혹 보면 C, C++, C#, Java 언어로만 코테를 볼 수 있다는 제한이 있는 경우가 있다. 나는 Python, JavaScript 둘 중 하나라도 된다면 그나마 편하게 볼 수 있는 편인데... C 계열 언어는 내가 거의 해본적이 없거나 너무 오래되었고... 그나마 Java인데 이 녀석은 외울게 겁나 많다. 익숙해지지 않으면 도전할 수 조차 없다.

그렇다고 아까운 기회를 날릴 수는 없으니, 그리고 자바를 내가 아예 안한건 아니니까 정리만 잘하고 외우기만 하면 풀 수는 있다. 그래서 이참에 필수 지식을 정리해보려고 한다.


자바 배열 혹은 리스트

배열과 리스트의 차이

자바에서 배열이라고 하면 정말 정적인 배열이 있고, 또 하나는 동적인 리스트가 있다. 메모리 측면에서 비교하자면 배열은 스택 영역, 리스트는 힙 영역에서 관리될 것이다. 따라서 배열은 크기가 고정되어있다. 리스트는 크기가 변할 수 있다는 차이가 있다.

배열 생성

가장 간단한 방법이다. 크기는 해당 원소 개수로 고정이 되어 생성된다. 개인적으로 이 방식이 마음에 든다.

// int 배열
int[] arr = { 1, 2, 3 };

// String 배열
String[] strs = {"alpha", "beta", "charlie"};

두번째 정의 방법은 크기를 지정한 후, 개별로 세팅하는 방법이다. 데이터 값을 모를 때 사용하는 방법이다.

int[] arr = new int[3]; // 크기가 3인 배열 생성, 기본 0으로 초기화 되어있음
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

마지막으로 아래와 같이 혼합해서 사용해볼 수도 있다.

int[] arr = new int[]{1, 2, 3, 4, 5};

참고로 2차원 배열을 생성하는 법은 다음과 같다.

int[][] arr = {{-1,0},{1,0},{0,-1},{0,1}};

리스트 생성

리스트를 말하려고 하면 설명할 게 많지만... 간단하게 말해서 자바에서 List는 인터페이스이다. 그리고 ArrayList, LinkedList 같은 것이 클래스(구현체)이다. 그 중 ArrayList가 가장 많이 사용된다.

ArrayList는 Array와 List의 특징이 합쳐졌다고 보면 된다. 중복을 허용하고 순서를 유지하면서 인덱스로 원소를 관리한다는 점에서 배열과 상당히 유사하다. 하지만, 배열과는 다르게 배열을 추가, 삭제할 수 있는 메서드들도 존재한다. 정확히는 추가했을때 배열이 동적으로 늘어나는 것이 아니라 용량이 꽉 찼을 경우 더 큰 용량의 배열을 만들어 옮기는 작업을 한다.

따라서 보통 아래처럼 사용한다.

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);

초기화까지 같이 하려면 Arrays.asList를 사용할 수 있다. 다만 주의할 점이 있다...

List<Integer> list = Arrays.asList(1, 2, 3, 4);

Arrays.asList가 리턴하는건 Arrays의 private 정적 클래스인 ArrayList를 리턴한다고 함. 이게 주의할 점이 java.util.ArrayList 클래스와는 다른 클래스이다. java.util.Arrays.ArrayList 클래스는 set(), get(), contains() 메서드를 가지고 있지만 원소를 추가하는 메서드는 가지고 있지 않기 때문에 사이즈를 바꿀 수 없다.

만약 추가/삭제도 가능하게 만들려주려면 new ArrayList로 감싸주면 된다.

List<Integer> A = new ArrayList<>(Arrays.asList(9, 9, 9, 9));

참고로, Arrays.asList() 대신 List.of()를 사용할 수도 있다. 차이점이라고한다면 더 엄격한 Immutable한 Collection 라고 보면 될 듯...

List<Integer> A = List.of(1, 2, 3);

배열에서 리스트로 변환하는 방법

Arrays.asList

java.util.Arrays 클래스에는 다양한 유틸리티 함수가 존재하는데... 그 중 하나가 바로 asList이다. 배열을 리스트로 변환해준다.

String[] strs = {"alpha", "beta", "charlie"};
List<String> list = Arrays.asList(strs);
List<Integer> list = Arrays.asList(1, 2, 3);
System.out.println(list);

다만 주의할 점이 있다. 아래는 불가능 하다. 처음에 나는 되게 의아했다. String 배열은 되는데 int 배열은 안된다고? 사실 이는 Integer가 아니라서 그런듯 하다. int랑 Integer는 엄연히 다르다... 참고 : https://hianna.tistory.com/552

int[] arr = new int[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(arr);
System.out.println(list);

어쨌거나 이를 해결하려면 for문 돌리거나, Stream을 사용해야 한다.

반복문 사용하기

// int 배열
int[] arr = { 1, 2, 3 };

// int -> List
List<Integer> intList = new ArrayList<>();
for (int element : arr) {
    intList.add(element);
}

// List 출력
System.out.println(intList.size()); // 3
System.out.println(intList); // [1, 2, 3]

Stream을 이용한 방법

Stream에 대한 내용은 별도 파트에서 자세히 다룰 예정이다.

import java.util.stream.Collectors;

// int 배열
int[] arr = { 1, 2, 3 };

// int -> List
List<Integer> intList 
        = Arrays.stream(arr)
                .boxed()
                .collect(Collectors.toList())
  1. Arrays.stream을 통해 배열을 스트림으로 형변환을 해준다.
  2. boxed 메서드를 통해 int에서 Integer로 형변환을 해준다.
  3. collect에서 Collectors.toList()를 통해 리스트로 결과를 반환하게 한다.

리스트에서 배열로 변환하는 방법

String 일 때

toArray에 new String[0]을 넣어주면 String 배열로 변환이 가능하다.

List<String> list = Arrays.asList("NYC", "New Delhi");
String[] array = list.toArray(new String[0]);

다른 방법으로는 Stream을 사용하면 된다. stream으로 변환한다음, toArray를 사용하면 된다.

List<String> list = Arrays.asList("NYC", "New Delhi");
 
String[] array = list.stream()
                     .toArray(String[]::new);

Integer 일때

Integer는 int로 변환하고 toArray를 해주면 된다. 여기서 toArray는 아무것도 안넣어줘도 되네…

List<Integer> integerList = Arrays.asList(20,30,50,88,100);
int[] mapToInt = integerList.stream().mapToInt(x->x).toArray(); // Integer -> int(primitive type)
// mapToInt(x->x)는 mapToInt(Integer::intValue)로도 가능한듯

참고. 배열, 리스트를 활용하는 코테 문제 예시

profile
부계정

0개의 댓글