[Java] 배열 출력, 배열 정렬, 배열을 List로 바꾸기, ArrayList로 바꾸기
이런 String 배열이 있을 때
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry", "donut"};
System.out.println(arr);
}
}
이 배열을 출력하면
이렇게 이상한 글자가 출력된다.
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry", "donut"};
System.out.println(arr.toString());
}
}
이렇게 arr.toString()을 출력해도 결과는 똑같다. toString()을 출력하는 것은 어떤 변수를 그냥 출력했을 때와 같다.
일반 배열은 그냥 출력하면 이렇게 이상하게 출력된다.
그럴 때 사용하는 것이 Arrays 클래스의 static 메소드 toString()이다.
import java.util.Arrays;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry", "donut"};
System.out.println(Arrays.toString(arr));
}
}
그러면 이렇게 우리가 원하는 대로 출력되는 것을 볼 수 있다.
Arrays와 같이 s로 끝나는 클래스들은 대부분 유용한 static 메소드들이 들어있는 유틸리티 클래스이다.
Arrays 클래스에서 자주 쓰이는 유용한 정적 메소드 중 하나가 sort() 메소드이다.
static 메소드이기 때문에 메소드 앞에 클래스이름.을 꼭 붙여서 Arrays.sort() 이렇게 사용해야 한다.
String[] arr = {"cherry", "Banana", "apple", "donut"};
이렇게 문자열들이 다 섞여있는 배열을 Arrays.sort() 메소드를 이용해서 정렬해보자.
import java.util.Arrays;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"cherry", "Banana", "apple", "donut"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
정렬이 되긴 했지만 대문자가 소문자보다 유니코드 값이 더 작기 때문에 Banana가 가장 앞에 온다.
대소문자를 구분하지 않고 정렬하고 싶다면 Arrays.sort() 메소드의 두 번째 인자에 Comparator 객체를 비교기준으로 넣어주면 된다.
import java.util.Arrays;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"cherry", "Banana", "apple", "donut"};
Arrays.sort(arr, String::compareToIgnoreCase);
System.out.println(Arrays.toString(arr));
}
}
그러면 이렇게 대소문자를 무시하고 알파벳 순서대로 정렬된 것을 볼 수 있다.
위 코드는 메소드 참조를 이용한 것이고 람다식을 이용하고 싶다면 다음과 같이 하면 된다.
import java.util.Arrays;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"cherry", "Banana", "apple", "donut"};
Arrays.sort(arr, (a, b) -> a.compareToIgnoreCase(b));
System.out.println(Arrays.toString(arr));
}
}
이 코드를 실행해도 결과는 같다.
람다식과 메소드 참조를 잘 모른다면 아래 두 글을 먼저 읽어보는 것을 추천한다.
https://breakcoding.tistory.com/4
https://breakcoding.tistory.com/183
람다식이나 메소드 참조를 이용하고 싶지 않다면 Comparator 클래스를 구현한 클래스를 만들어서 객체를 생성해서 sort() 메소드의 두 번째 인자로 넣어줄 수도 있다.
import java.util.Arrays;
import java.util.Comparator;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"cherry", "Banana", "apple", "donut"};
Arrays.sort(arr, new MyComparator());
System.out.println(Arrays.toString(arr));
}
}
class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.compareToIgnoreCase(o2);
}
}
이렇게 해도 결과는 똑같다.
그런데 역시 정적 배열이라서 출력할 때도 귀찮고 중간에 원소를 삭제하고 싶을 때 곤란하다. 따라서 이런 정적 배열을 동적배열(리스트)로 바꾸고 싶다면 어떻게 해야 할까?
이것 역시 유틸리티 클래스인 Arrays에 있는 static 메소드 asList() 메소드를 이용하면 된다.
import java.util.Arrays;
import java.util.List;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry", "donut"};
List<String> list = Arrays.asList(arr);
}
}
이렇게 하면 배열을 동적 배열인 List로 쉽게 바꿀 수 있다.
이 List를 ArrayList로 바꾸고 싶다면 다음과 같이 하면 된다.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArrayTest {
public static void main(String[] args) {
String[] arr = {"apple", "banana", "cherry", "donut"};
List<String> list = Arrays.asList(arr);
ArrayList<String> arrayList = new ArrayList<>(list);
}
}
이렇게 ArrayList의 생성자의 인자로 넣어주면 된다.
동적 배열 ArrayList로 바꾸고 나면 정적 배열이었을 때보다 훨씬 할 수 있는 것들이 많다. 특히 스트림을 이용해서 굉장히 편리하게 처리할 수 있는 것들이 많아진다.