본문 바로가기

Language/JAVA

[JAVA] Thread(스레드)를 활용한 간단한 Counter(카운터) 프로그램 만들기 with IntelliJ

JAVA 자바 Thread(스레드)를 활용한 간단한 Counter(카운터) 프로그램 만들기 with IntelliJ

 

Thread 스레드를 활용한 간단한 카운터 프로그램을 만들어보겠습니다.

 

💡확인하기
  • OS : Windows 11
  • JDK : 17
  • IDE : IntelliJ

 


 

Thread를 사용하여 초 단위로 카운터 프로그램을 작성해 봅시다.

JAVA 간단한 카운트 프로그램 실행 결과

 

요구사항

  • 카운팅 할 시간(초 단위)를 사용자에게 입력받습니다.
  • 사용자가 시간을 입력하지 않으면 기본값을 할당합니다.
  • Thread를 확장한 클래스를 작성합니다.
  • main에서 Thread 서브 클래스의 인스턴스를 생성하고 호출하는 방식으로 실행합니다.

 

👇👇 전체 소스는 하단에 👇👇

 


 

구현하기

1. Thread 서브 클래스 작성

Thread를 확장한 클래스를 작성합니다.

class CounterThread extends Thread {

}

카운팅할 초를 저장할 정수형 멤버변수를 생성합니다.

int seconds;

 

생성자

초는 인스턴스 생성 시 기본값으로 초기화 작업을 하기 위해 기본 생성자를 작성합니다.

public CounterThread() {
	this.seconds = 20;	// 기본값 자유
}

사용자가 입력한 시간을 파라미터로 받아 초기화하는 커스텀 생성자를 작성합니다.

public CounterThread(int seconds) {
	this.seconds = seconds;
}

기본 생성자와 커스텀 생성자는 값이 다를 뿐 seconds 변수를 초기화하는 로직은 동일하네요.

기본 생성자에서 seconds 변수를 직접 초기화하지 않고 커스텀 생성자를 호출하여 초기화하도록 변경합니다.

public CounterThread() {
	this(20);
}

 

Overriding run() - 재정의하기

run() 메소드를 override 하겠습니다.

run 내부는 thread에서 동작하는 실제 로직이 들어가는 부분이죠.

seconds 초가 0이 될 때까지 반복하는 루프를 작성합니다.

루프의 마지막에 seconds 변수 값을 변경시킵니다.

@Override
public void run() {
	while (this.seconds > 0) {
    	System.out.println(this.seconds + "초 전");	// 확인하기 위한 출력
    	this.seconds--;
    }
}

 

이 상태로 실행시킨다면, while 문은 엄청나게 빨리 끝나버리겠죠..

while 문은 초 단위로 실행돼야 하므로, thread의 sleep 메소드를 호출하여 1초 동안 일시정지합니다.

try {
	sleep(1000);
} catch (Exception e) {

}

 

2. main 클래스 작성

사용자에게 카운팅 할 시간을 입력받습니다.

시간은 0보다 큰 값이어야 하고, 시간을 입력하지 않았을 경우 기본값으로 설정합니다.

String str = scan.nextLine();
int sec = Integer.parseInt(str);
if (sec <= 0) {
	System.out.print("시간은 0보다 커야 합니다. ");
}

입력한 시간으로 위에서 작성한 CounterThread 클래스의 인스턴스를 생성합니다.

CounterThread t = str.equals("") 
	? new CounterThread()
    : new CounterThread(cnt)
    ;

 

스레드를 시작합니다.

t.start();

 

실행결과

JAVA 카운터 프로그램 실행 결과

 


반응형

 

전체소스 보기

더보기
// CounterThread.class
public class CountThread extends Thread {
    int seconds;

    // constructor
    /**
     * 초기화 - 초 기본설정
     */
    public CountThread() {
        this(20);   // 다른 생성자 호출
    }

    /**
     * 초기화
     * @param sec   초
     */
    public CountThread(int sec) {
        this.seconds = sec;
    }

    @Override
    public void run() {
        
        System.out.println("========= START Count =========");
        System.out.println(this.seconds + "초 카운트를 시작합니다.");
        // 날짜 출력 포맷 설정
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.KOREAN);

        while (this.seconds > 0) {
            System.out.println(formatter.format(new Date()) + "\t\t" + this.seconds + "초 전");
            this.seconds--;

            // 1초간 멈춤
            try {
                sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }   // END while

        System.out.println("========= END Count =========");
    }   // END run
}

 

// main
public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    // 카운팅 시간 변수
    int sec = -1;

    System.out.print("카운팅할 시간을 초단위 정수로 입력하세요(기본값 20초 사용하려면 빈값) > ");
    while (true) {
        String str = scan.nextLine();
        if (str.equals("")) {
            // 기본값
            break;
        } else {
            try {
                sec = Integer.parseInt(str);
                if (sec <= 0) {
                    throw new Exception("시간은 0보다 커야 합니다");
                }
                break;
            } catch (NumberFormatException e1) {
                System.out.print("\t정수를 입력하세요 > ");
            } catch(Exception e2) {
                System.out.print("\t" + e2.getMessage() + " > ");
            }
        }

    }   // END while


    // 카운트
    CountThread t = sec < 0 ? new CountThread() : new CountThread(sec);
    t.start();
}

 

728x90