본문 바로가기
카테고리 없음

자바 버블 정렬 애니메이션 구현방법(스윙, 타이머, 쓰레드)

by info95686 2025. 10. 4.

자바 버블 정렬 애니메이션 구현방법
자바 버블 정렬 애니메이션 구현방법

정렬 알고리즘은 프로그래밍 학습 과정에서 가장 먼저 접하게 되는 중요한 주제입니다. 특히 버블정렬(Bubble Sort)은 단순한 비교와 교환 과정을 반복하는 구조 덕분에 시각적으로 표현하기 쉽습니다. Java는 GUI를 위한 Swing과 동작 제어를 위한 Timer, 그리고 멀티쓰레딩 지원을 통해 이러한 알고리즘 과정을 애니메이션으로 구현하기에 적합합니다. 본문에서는 Java로 버블정렬 애니메이션을 만드는 방법을 Swing, Timer, Thread의 관점에서 설명하고 코드 예시와 함께 구현 전략을 소개합니다.

버블정렬 알고리즘과 시각화 기본 구조

버블정렬은 인접한 두 요소를 비교하여 잘못된 순서라면 서로 교환하는 방식입니다. 한 번 순회가 끝나면 가장 큰 값이 배열의 끝으로 이동하며, 이를 반복하면 전체 배열이 정렬됩니다. 평균과 최악의 경우 시간 복잡도는 O(n²)이고, 최선의 경우 이미 정렬된 상태라면 O(n)입니다.

애니메이션 시각화를 위해 필요한 기본 요소는 다음과 같습니다.

  • 배열을 막대(bar)로 표현해 값의 크기를 높이로 나타내기
  • 비교 중인 요소는 빨간색, 교환된 요소는 파란색 등 색상 차별화
  • Swing의 JPanel을 사용하여 그래픽으로 막대 그리기
  • Timer나 Thread.sleep()을 통해 일정 간격으로 단계 실행

이러한 요소들을 조합하면 알고리즘의 비교와 교환 과정을 직관적으로 볼 수 있어 교육적인 효과가 높습니다.

Java Swing과 Timer를 활용한 구현

Swing은 자바에서 GUI 애플리케이션을 작성하기 위한 기본 툴킷으로, 버블정렬 시각화에 적합합니다. 핵심은 JPanel을 확장해 배열을 시각화하고 Timer로 단계별 정렬을 진행하며 UI를 주기적으로 갱신하는 것입니다.

  • JPanel 활용: paintComponent(Graphics g)를 오버라이드하여 배열 값을 막대 형태로 그립니다.
  • Timer 사용: javax.swing.Timer를 이용해 일정 주기마다 정렬의 한 단계를 수행합니다.
  • UI 갱신: repaint() 호출로 배열의 변경 사항을 다시 그립니다.
public class BubbleSortPanel extends JPanel {
    private int[] array;
    private int i = 0, j = 0;
    public BubbleSortPanel(int[] array) {
        this.array = array;
        Timer timer = new Timer(200, e -> step());
        timer.start();
    }
    private void step() {
        if (i < array.length - 1) {
            if (j < array.length - i - 1) {
                if (array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
                j++;
            } else {
                j = 0;
                i++;
            }
            repaint();
        }
    }
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int k = 0; k < array.length; k++) {
            g.fillRect(k * 20, getHeight() - array[k], 15, array[k]);
        }
    }
}

메인 프레임은 JFrame을 이용해 다음과 같이 실행합니다.

public class BubbleSortDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Bubble Sort Animation");
        int[] array = {50, 30, 80, 20, 70, 60, 10, 90, 40};
        BubbleSortPanel panel = new BubbleSortPanel(array);
        frame.add(panel);
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

이 구조는 Timer가 한 단계씩 정렬을 수행하고 repaint()로 결과를 갱신하는 방식으로 애니메이션을 구현합니다.

쓰레드 활용과 추가 기능 확장

Timer만으로도 동작하지만, UI와 정렬 로직이 같은 스레드에서 실행되면 화면이 멈추는 현상이 생길 수 있습니다. 별도의 쓰레드에서 정렬을 수행하고, UI 갱신은 이벤트 디스패치 스레드에서 실행하면 더욱 안정적입니다.

  • 쓰레드 분리: 정렬 알고리즘을 Thread에서 실행
  • UI 갱신: SwingUtilities.invokeLater()로 안전하게 repaint 호출
  • 속도 제어: Thread.sleep(ms)로 지연을 설정해 애니메이션 속도 조절
new Thread(() -> {
    for (int i = 0; i < array.length - 1; i++) {
        for (int j = 0; j < array.length - i - 1; j++) {
            if (array[j] > array[j+1]) {
                int tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
            }
            SwingUtilities.invokeLater(this::repaint);
            try { Thread.sleep(200); } catch (InterruptedException ex) {}
        }
    }
}).start();

추가 기능으로는 다음이 있습니다.

  • 애니메이션 속도 조절 슬라이더
  • 일시정지/재개 버튼
  • 랜덤 배열 생성 기능
  • 삽입정렬, 선택정렬 등 다른 알고리즘과 비교 기능

이런 기능을 추가하면 단순한 정렬 시각화에서 학습용 도구로 확장할 수 있습니다.

결론: 학습과 시각화를 동시에 잡는 버블정렬 애니메이션

버블정렬은 단순하지만 정렬 알고리즘의 기본 원리를 학습하기에 좋은 예시입니다. 이를 Swing과 Timer, Thread를 통해 애니메이션으로 구현하면 비교와 교환 과정이 직관적으로 드러나 교육적인 효과가 큽니다. Timer를 사용하면 간단히 구현할 수 있고, Thread를 활용하면 성능과 안정성이 높아집니다. 또한 속도 제어, 일시정지, 다른 알고리즘과 비교 기능을 추가하면 실습과 학습에 더욱 유용한 도구가 됩니다. 결국 버블정렬 애니메이션 프로젝트는 자바의 GUI, 이벤트, 멀티쓰레딩을 종합적으로 학습할 수 있는 훌륭한 예제라 할 수 있습니다.