이 글에서는 Java에서 컬렉션(Collection)의 요소들을 무작위로 섞는(shuffle) 방법을 알아보겠습니다.
컬렉션 프레임워크는 객체 그룹을 저장하고 조작할 수 있는 아키텍처를 제공합니다. Java 컬렉션을 활용하면 검색, 정렬, 삽입, 조작, 삭제 등 데이터에 수행하는 거의 모든 작업을 손쉽게 처리할 수 있습니다.
요소를 섞을 때는 java.util.Collections 클래스가 제공하는 shuffle() 메서드를 사용합니다. 이 메서드는 리스트의 요소 순서를 무작위로 재배열하며, 필요에 따라 난수 생성기(Random)를 직접 지정할 수도 있습니다.
동작 예시
입력 리스트:
Input list: [Java, program, is, fun, and, easy]
실행 결과(출력은 매번 달라집니다):
The shuffled list is: [is, easy, program, and, fun, Java]
알고리즘
Step 1 - 시작 Step 2 - ArrayList인 input_list를 선언한다. Step 3 - 값을 정의한다. Step 4 - shuffle() 함수를 사용해 리스트의 요소를 섞는다. Step 5 - 결과를 출력한다. Step 6 - 종료
예제 1: main 함수에서 모든 로직 처리
첫 번째 예제는 모든 연산을 main 함수 안에서 한 번에 처리하는 방식입니다.
import java.util.*;
public class Demo {
public static void main(String[] args){
ArrayList<String> input_list = new ArrayList<String>();
input_list.add("Java");
input_list.add("program");
input_list.add("is");
input_list.add("fun");
input_list.add("and");
input_list.add("easy");
System.out.println("The list is defined as:" + input_list);
Collections.shuffle(input_list, new Random());
System.out.println("The shuffled list is: \n" + input_list);
}
}출력 결과
The list is defined as:[Java, program, is, fun, and, easy] The shuffled list is: [is, Java, fun, program, easy, and]
예제 2: 객체 지향 방식으로 함수 분리
두 번째 예제는 셔플 로직을 별도의 함수로 분리하여 객체 지향 프로그래밍(OOP) 스타일로 구현한 것입니다. 이렇게 하면 코드의 재사용성과 가독성이 향상됩니다.
import java.util.*;
public class Demo {
static void shuffle(ArrayList<String> input_list){
Collections.shuffle(input_list, new Random());
System.out.println("The shuffled list is: \n" + input_list);
}
public static void main(String[] args){
ArrayList<String> input_list = new ArrayList<String>();
input_list.add("Java");
input_list.add("program");
input_list.add("is");
input_list.add("fun");
input_list.add("and");
input_list.add("easy");
System.out.println("The list is defined as:" + input_list);
shuffle(input_list);
}
}출력 결과
The list is defined as:[Java, program, is, fun, and, easy] The shuffled list is: [fun, and, Java, easy, is, program]
정리
Collections.shuffle() 메서드를 사용하면 단 한 줄의 코드로 리스트의 요소를 무작위로 섞을 수 있습니다. 두 번째 인자로 Random 객체를 전달하면 난수 생성 방식을 직접 제어할 수 있으며, 시드(seed)를 고정하면 실행할 때마다 동일한 셔플 결과를 얻을 수도 있습니다. 카드 게임, 퀴즈 문항 순서 변경, 추천 항목 랜덤 노출 등 다양한 상황에서 유용하게 활용할 수 있습니다.