이런 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

 

[Java] 람다식(lambda expression)과 메소드 참조(method reference)

C/C++에는 함수포인터라는 개념이 있어 함수를 다른 함수로 전달하고 싶을 때에는 함수 포인터를 사용하면 된다. 그런데 자바는 C/C++보다 더 객체지향적인 언어이기 때문에 메소드(C/C++로 따지면 함수)는 무조건..

breakcoding.tistory.com

https://breakcoding.tistory.com/183

 

[Java] 메소드 참조 (Method Reference)

이 글에 이어지는 글이다. (↓링크) [Java] 람다식(lambda expression)과 메소드 참조(method reference) C/C++에는 함수포인터라는 개념이 있어 함수를 다른 함수로 전달하고 싶을 때에는 함수 포인터를 사용..

breakcoding.tistory.com

람다식이나 메소드 참조를 이용하고 싶지 않다면 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로 바꾸고 나면 정적 배열이었을 때보다 훨씬 할 수 있는 것들이 많다. 특히 스트림을 이용해서 굉장히 편리하게 처리할 수 있는 것들이 많아진다.

+ Recent posts