5. 자바 정렬 메서드 활용

한승록·2023년 5월 6일
0

자바 활용

목록 보기
5/9
post-thumbnail

1) sort()

흔히 프로그래밍 언어에서 정렬은 'stack''queue'를 많이 들어보셨을 겁니다. 하지만 간단한 정렬이라도 직접 함수를 만들어 쓰기에는 어려움이 있습니다.
이를 개선하기 위해 Java에서는 sort()메서드가 java.util 패키지에 내장되어 있습니다.
해당 메서드의 사용방법에 대하여 정수가 담긴 배열과 컬렉션을 통해 말씀드려볼까 합니다.
		Integer[] arr = { 4, 8, 2, 7, 6 };
        
        for (int i = 0; i < arr.length; i++) {
			System.out.printf("정렬하지 않은 배열 arr[%d] : %d\n", i, arr[i]);
		}
		
		Arrays.sort(arr);

		for (int i = 0; i < arr.length; i++) {
			System.out.printf("정렬된 배열 arr[%d] : %d\n", i, arr[i]);
		}
        

<※ 결과는 다음과 같습니다.>

		System.out.println("정렬하지 않은(ArrayList) : " + list);
		
		list.sort(null);
		System.out.println("정렬한 (ArrayList) : " + list);

<※ 결과는 다음과 같습니다.>

보시는 바와 같이 sort의 기본값오름차순 입니다. 그런데 여기서 일반 배열과 컬렉션사이의 차이점이 몇 개 보이실겁니다.
바로 메서드의 ()사이에 'null'이 들어간다는 것입니다.

이는 Integer comparable속성이 존재하기 때문입니다.




2) Comparable / Comparator

ComparableInteger, Double, String에 인터페이스를 구현하고 있습니다.
따라서 해당 자료형의 제네릭을 가지는 컬렉션이나 배열은 자동정렬이 가능한 것입니다.
그렇다면 구현 되어 있지 않다면 자동 정렬이 불가능 할까요?
의외로 정답은 '불가능'하다 입니다.

하지만 방법이 아예없는 것은 아니죠
바로 Comparator를 통해 개별적으로 구현해주는 것입니다.
class Coffee implements Comparable<Coffee>{
	String name;
	int price;
	
	public Coffee(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	@Override
	public String toString() {
		return String.format("%s : %,d", name, price);
	}
	
	@Override
	public int compareTo(Coffee o) {
		return this.price - o.price;
	}
}
 
public class Ex02 {
	public static void main(String[] args) {
		Coffee ob1 = new Coffee("아메리카노", 2000);
		Coffee ob2 = new Coffee("디카페인 아메리카노", 2300);
		Coffee ob3 = new Coffee("헤이즐넛 아메리카노", 2500);
		Coffee ob4 = new Coffee("콜드브루 라떼", 4000);
		Coffee ob5 = new Coffee("콜드브루 돌체라떼", 4500);
		
		Coffee[] arr = { ob4, ob1, ob3, ob5, ob2 };
		ArrayList<Coffee> list = new ArrayList<Coffee>(Arrays.asList(arr));
		list.forEach(c -> System.out.println(c));
		System.out.println();
		
		
		list.sort(null);	// Comparator는 전달하지 않았음
		list.forEach(c -> System.out.println(c));
		System.out.println();
		
		// comparable에서 지정한 방식이 아닌, 다른 형태로 정렬을 수행하려면 Comparator를 사용한다
		Comparator<Coffee> comp = new Comparator<Coffee>() {
			
			@Override
			public int compare(Coffee o1, Coffee o2) {
				return o1.name.compareTo(o2.name);
			}
		};
		
		list.sort(comp);	// comp는 이름 기준 오름차순 정렬의 규칙이다
		list.forEach(c -> System.out.println(c));
		System.out.println();
		
		Comparator<Coffee> comp2 = (o1, o2) -> o2.name.compareTo(o1.name);
		list.sort(comp2);	// comp2는 이름 기준 내림차순 정렬의 규칙이다
		list.forEach(c -> System.out.println(c));
		System.out.println();
	}
	
}

<※ 결과는 다음과 같습니다.>

profile
개발 학습

0개의 댓글