[Java] 움직이는 크리스마스 트리 만들기

🎄심심해서 만들어본 동적 크리스마스 트리🎄

지난 겨울에 부트캠프에서 강사님이 오너먼트가 초 단위로 움직이는 크리스마스 트리를 보여주신 적이 있었는데 그때는 자바를 배운지도 코딩테스트 준비를 시작한지도 얼마 되지 않았기 때문에 배운 내용만 가지고 어떻게 구현하는지 방법을 몰랐다.

그러다가 주말에 갑자기 생각나서 중첩 for문과 Thread.sleep을 사용해 1초마다 오너먼트의 위치가 바뀌는 트리를 만들어보았다.

인텔리제이에서는 콘솔창이 지워지지 않고 새로운 트리가 계속해서 출력되는데 VSCode에서는 잘 나온다. 설명은 코드에 주석으로 달아뒀다.

코드:

import java.util.Random;

public class DynamicChristmasTree {
    public static void main(String[] args) throws InterruptedException {
        Random rand = new Random();
        char[] ornaments = {'@', '%', '^', '#'};
        int height = 10;  // 트리 높이

        while (true) {
            StringBuilder tree = new StringBuilder();

            // 트리를 만드는 for문
            for (int i = 0; i < height; i++) {
                // 왼쪽 공백
                for (int j = height - i; j > 1; j--) {
                    tree.append(" ");
                }
                // 트리의 한 층 만들기
                for (int j = 0; j <= i; j++) {
                    if (rand.nextInt(3) == 0) {  // 랜덤하게 오너먼트를 배치
                        tree.append(ornaments[rand.nextInt(ornaments.length)]);
                    } else {
                        tree.append("*");
                    }
                    tree.append(" ");  // 별과 별 사이의 공백
                }
                tree.append("\n");
            }
            // 트리 밑동
            for (int i = 0; i < 2; i++) {
                for (int j = 0; j < height - 1; j++) {
                    tree.append(" ");
                }
                tree.append("||\n");
            }

            // 콘솔을 지우고 트리를 출력
            System.out.print("\033[H\033[2J");
            System.out.flush();
            System.out.print(tree.toString());

            // 1초 대기
            Thread.sleep(1000);
        }
    }
}

영상으로 결과 확인하기

맥북 녹화 기능을 처음 써봤기 때문에 영상은 허접하다. 😓