자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 17일차 - 기본 API 클래스(java.util 패키지), 스레드(멀티 스레드)

개발학생 2025. 7. 2. 14:33
반응형

이전 공부글

2025.06.20 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 16일차 - 기본 API 클래스(java.lang 패키지)

 

Java 기초 또 다시 공부하기 16일차 - 기본 API 클래스(java.lang 패키지)

*자바 API 도큐먼트API(Application Programming Interface): 라이브러리(library)라고도 하며, 프로그램 개발에 자주 사용되는 클래스/인터페이스의 모음을 의미-> String 클래스와 System 클래스도 모두 API에 속

keep-programming-study.tistory.com

 

1. 기본 API 클래스(java.util 패키지)

1) Date: 날짜와 시간 정보를 저장하는 클래스

  • Date 객체 안에 특정 시점의 연도/월/일/시간 정보가 저장됨
  • 현재 시각의 Date 객체 생성
Date now = new Date();
  • 원하는 날짜 형식의 문자열을 얻고 싶다면 java.text 패키지의 SimpleDateFormat 클래스와 함께 사용
    -> 자바 API Document의 SimpleDateFormat 클래스 참고
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");

// SimpleDateFormat 객체를 얻은 후, format() 메서드를 호추해서 원하는 형식의 날짜 정보를 얻음
String strNow = sdf.format(now);

2) Calendar: 달력을 표현한 클래스

  • Calendar 객체 안에 운영체제의 날짜와 시간(연도/월/일/요일/오전오후/시간) 정보가 저장됨
  • 추상 클래스이므로 new 연산자를 사용한 인스턴스 생성은 불가
    -> 정적 메소드 getInstance() 메서드를 이용하면
        현재 운영체제에 설정된 시간대(TimeZone)를 기준으로 한 Calendar 하위 객체를 얻을 수 있음
Calendar now = Calendar.getInstance();
  • Calendar 객체를 얻었다면 get() 메서드로 날짜와 시간에 대한 정보를 읽음
int year = now.get(Calendar.YEAR);  // 연도를 리턴
int month = now.get(Calendar.MONTH) + 1;  // 월을 리턴
int day = now.get(Calendar.DAY_OF_MONTH);  // 일을 리턴
String week = now.get(Calendar.DAY_OF_WEEK);  // 요일을 리턴
String amPm = now.get(Calendar.AM_PM);  // 오전/오후를 리턴
int hour = now.get(Calendar.HOUR);  // 시를 리턴
int minute = now.get(Calendar.MINUTE);  // 분을 리턴
int second = now.get(Calendar.SECOND);  // 초를 리턴

2. 스레드(멀티 스레드)

*사전 지식

  • 프로세스(process): 실행 중인 하나의 애플리케이션
    -> 사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행
  • 멀티 프로세스(multi process): 한 애플리케이션을 2개 이상 실행하면 2개 이상의 프로세스가 생성되는 것
  • 운영체제는 두 가지 이상의 작업을 동시에 처리하는 멀티 태스킹(multi tasking)을 할 수 있도록
    CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고 병렬로 실행시킴 

1) 스레드(thread)와 멀티 스레드(multi thread)

  • 스레드: 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드
  • 멀티 스레드: 한 프로세스 내에서 두 가지 이상의 작업을 처리하는 멀티 태스킹을 할 수 있도록 함
    -> 대용량 데이터의 처리 시간을 줄이기 위해 데이터를 분할해서 병렬로 처리하거나,
        UI를 갖고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용하거나,
        다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용

2) 메인 스레드(main thread)

  • 자바의 모든 애플리케이션은 이것이 main() 메서드를 실행하며 시작함
  • main() 메서드의 첫 코드부터 아래로 순차적으로 실행하며, 메서드 내 마지막 코드를 실행하거나 return 문을 만나면 실행 종료
  • 필요에 따라 작업 스레드들을 만들어서 병렬로 코드 실행(멀티 스레드를 생성해 멀티 태스킹 수행)
  • 싱글 스레드 애플리케이션 vs 멀티 스레드 애플리케이션
    -> 메인 스레드 종료 시 프로세스 종료 vs 실행 중인 스레드가 하나라도 있다면 프로세스는 계속 유지

싱글 스레드 애플리케이션, 멀티 스레드 애플리케이션 비교

3) 작업 스레드 생성과 실행 

  • 멀티 스레드로 실행하는 애플리케이션을 개발하려면, 먼저 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드 생성
  • 메인 스레드는 반드시 존재하므로, 메인 외 추가 병렬 작업 수만큼 스레드를 생성하면 됨
    -> 자바에서는 작업 스레드도 객체로 생성되므로 클래스 필요
        : java.lang.Thread 클래스를 직접 객체화 하거나, Thread를 상속한 하위 클래스를 만들어 생성
  • 모든 작업 스레드는 thread.start();와 같은 형식으로 start() 메서드를 호출해야 실행됨

작업 스레드 생성과 실행 도식화

(1) Thread 클래스로부터 직접 생성

  • Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용
Thread thread = new Thread(new Runnable() {
  public void run() {
    스레드가 실행할 코드
  }
});

(2) Thread 하위 클래스로부터 생성

  • Thread 익명 자식 객체로 작업 스레드 객체 생성
Thread thread = new Thread () {
  public void run() {
    스레드가 실행할 코드;
  }
}

(3) 스레드에 이름 설정하는 방법

  • 직접 생성한 스레드의 이름은 자동으로 'Thread-n'이라는 이름으로 설정(n은 스레드의 번호)
  • thread.setName("스레드 이름");으로 스레드 이름을 변경하고, thread.getName();으로 스레드의 이름을 가져옴

4) 동기화 메서드

  • 멀티 스레드 프로그램에서 스레드들이 공유 객체를 사용할 때,
    스레드 A가 사용하던 객체를 스레드 B가 상태 변경을 할 수 있으므로 스레드 A가 의도와는 다른 결과를 산출
  • 임계 영역(critical section): 멀티 스레드 프로그램에서 단 하나의 스레드만 실행 가능한 코드 영역
  • 동기화 메서드(synchronized method): 자바에서 임계 영역을 지정하기 위한 메서드 
    • 메서드 선언 시 synchronized 키워드를 붙이면 동기화 메서드 생성(인스턴스 메서드/정적 메서드 모두 가능)
public synchronized void method() {
  임계 영역;  // 단 하나의 스레드만 실행
}
  • 스레드가 동기화 메서드를 실행하는 즉시 객체에는 잠금이 일어나는데, 스레드가 동기화 메서드를 종료하면 잠금이 풀림
  • 한 객체에 동기화 메서드가 여러 개 있을 경우,
    스레드가 한 동기화 메서드를 실행할 때 모든 동기화 메서드 실행 불가(다른 스레드에서 일반 메서드는 실행 가능)
반응형