본문 바로가기
Java

[Java] Thread와 Swing으로 디지털 시계 만들기

by teamnova 2023. 7. 16.

안녕하세요! 오늘은 Java에서 Swing과 Thread를 이용해 디지털 시계를 구현해보겠습니다.

우선 Thread 와 Swing에 대해 설명하겠습니다.

 

Thread란?

우선 예시를 들어 설명하면 한 사람이 음악을 들으며 책을 읽는 상황이라고 가정할 때 음악 듣기와 책을 읽는 것은 동시에 진행되는 별개의 작업이라고 할 수 있습니다. 이때 음악 듣기와 책 읽기를 각각 한명의 사람이 처리한다고 생각하면 쉽습니다. 자바의 스레드도 마찬가지입니다. 하나의 프로세스 안에서 여러 개의 스레드가 동시에 실행될 수 있습니다. 각 스레드는 독립적으로 작업을 수행하면서 프로세스의 자원을 공유합니다. 스레드는 동시에 처리되어야 하는 작업을 분리해 독립적으로 실행함으로써 프로그램의 호율성을 높이는 역할을 합니다. 또는 다양한 상황에서 동시성과 병렬성을 구현하는 데에 사용됩니다. 이렇게 스레드는 동시에 여러 작업을 처리하고자 할 때 사용되며, 이를 통해 프로그램의 응답성을 높이고 작업을 효율적으로 분배할 수 있습니다.

 

Swing이란?

Java의 GUI(Graphical User Interface) 프레임워크 중 하나로 사용자 인터페이스를 구축하는 데 도움이 되는 도구 모음입니다. Swing은 다양한 그래픽 컴포넌트를 제공해 창,버튼,텍스트 상자 등을 만들고 조작할 수 있게 해줍니다.

 

자 그럼 본격적으로 구현시작하겠습니다.

============================================================================================

import javax.swing.*;
import java.awt.*;
import java.util.Calendar;
//java.util 패키지의 Calendar 클래스를 가져옵니다. Calendar 클래스는 날짜와 시간 정보를 다룰 수 있는 유용한 클래스입니다.

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class DigitalClock extends JFrame implements Runnable{
    //DigitalClock 클래스를 선언합니다. 이 클래스는 JFrame을 상속하고 Runnable 인터페이스를 구현합니다.
    private Thread thread;
    // Thread 객체를 저장할 thread 변수를 선언합니다.
    private JLabel label;
    //JLabel 객체를 저장할 label 변수를 선언합니다. 이 라벨은 디지털 시계의 시간을 표시하는 데 사용됩니다.

    public DigitalClock(){
        //DigitalClock 클래스의 생성자를 정의합니다. 이 생성자는 디지털 시계 프레임을 초기화하고 설정합니다.
        super("디지털 시계");
        //부모 클래스인 JFrame의 생성자를 호출하여 프레임의 제목을 "디지털 시계"로 설정합니다.

        setLayout(new FlowLayout());
        //프레임의 레이아웃 매니저를 FlowLayout로 설정합니다. FlowLayout는 컴포넌트를 왼쪽에서 오른쪽으로 배치하는 간단한 레이아웃입니다.

        label = new JLabel();
        //JLabel 객체를 생성하여 label 변수에 할당합니다. 이 라벨은 시간을 표시하는 데 사용됩니다.
        label.setFont(new Font("Serif",Font.PLAIN, 20));
        //label의 폰트를 "Serif"로 설정하고, 폰트 스타일을 일반(Font.PLAIN)으로, 크기를 20으로 설정합니다.

        if(thread == null){
            //thread가 null인 경우에만 아래의 코드를 실행합니다. 이는 스레드가 아직 실행되지 않은 경우에만 스레드를 생성하고 시작하기 위함입니다.

            //this의 의미는 Runnable이 구현된 객체를 뜻함(DigitalClock)
            thread = new Thread(this);
            thread.start();
        }
        add(label);
        //label을 프레임에 추가합니다. 이로써 디지털 시계의 시간이 표시되는 라벨이 화면에 나타납니다.
        setBounds(100,100,400,100);
        //프레임의 위치와 크기를 설정합니다. (100, 100)은 프레임의 위치를 나타내고, (400, 100)은 프레임의 폭과 높이를 나타냅니다.
        setVisible(true);
        //프레임을 화면에 표시합니다.
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //프레임이 닫힐 때 프로그램을 종료하도록 설정합니다.
    }
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        //프레임의 외관을 변경할 수 있는 룩 앤 필(Look and Feel)을 설정합니다. 이 코드는 기본적으로 Java Look and Feel을 사용하도록 설정합니다.
        new DigitalClock();
    }
    public void run(){
        while(true){
            Calendar cal = Calendar.getInstance();
            //Calendar 클래스의 getInstance() 메서드를 사용하여 현재 시간을 나타내는 cal 객체를 생성합니다.
            String now = cal.get(Calendar.YEAR)+"년"+
                    (cal.get(Calendar.MONTH)+1)+"월"+
                    cal.get(Calendar.DATE)+"일"+
                    cal.get(Calendar.HOUR)+"시"+
                    cal.get(Calendar.MINUTE)+"분"+
                    cal.get(Calendar.SECOND)+"초";
            //cal 객체에서 현재 연도, 월, 일, 시, 분, 초를 가져와 now 문자열에 저장합니다. 이렇게 생성된 문자열은 디지털 시계의 현재 시간을 표시합니다.
            label.setText(now);
            try{
                Thread.sleep(1000);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

 

============================================================================================

코드를 모두 작성하고 run하게 되면 다음과 같은 gui가 나오게 되고 현재 날짜와 시분초까지 보여주는 디지털 시계를 확인할 수 있습니다.