반응형
이전 공부글
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() {
임계 영역; // 단 하나의 스레드만 실행
}
- 스레드가 동기화 메서드를 실행하는 즉시 객체에는 잠금이 일어나는데, 스레드가 동기화 메서드를 종료하면 잠금이 풀림
- 한 객체에 동기화 메서드가 여러 개 있을 경우,
스레드가 한 동기화 메서드를 실행할 때 모든 동기화 메서드 실행 불가(다른 스레드에서 일반 메서드는 실행 가능)
반응형
'자바(JAVA) > 미니 프로젝트 & 기초 공부' 카테고리의 다른 글
Java 기초 또 다시 공부하기 19일차 - 컬렉션 프레임워크2(LIFO와 FIFO 컬렉션), 입출력 스트림(I/O 스트림) (0) | 2025.07.08 |
---|---|
Java 기초 또 다시 공부하기 18일차 - 스레드(스레드 제어), 컬렉션 프레임워크 (1) | 2025.07.07 |
Java 기초 또 다시 공부하기 16일차 - 기본 API 클래스(java.lang 패키지) (0) | 2025.06.20 |
Java 기초 또 다시 공부하기 15일차 - 예외 처리(예외 클래스, 예외 처리) (1) | 2025.06.18 |
Java 기초 또 다시 공부하기 14일차 - 중첩 클래스와 중첩 인터페이스(중첩 클래스와 중첩 인터페이스 개요, 익명 객체) (0) | 2025.06.17 |