열거형
관련된 상수들을 같이 묶어 놓은 것. Java에는 타입에 안전한 열거형을 제공
열거형 정의 방법
- enum 열거형 이름 { 상수명 1, 상수명 2,...}
열거형 상수의 비교는 == 과 compareTo() 사용 가능
모든 열거형은 Enum의 자손이며, 아래의 메서드를 상속받는다.
메서드 | 설명 |
Class<E> getDeclaringClass() | 열거형의 class 객체를 반환 |
String name() | 열거형 상수의 이름을 문자열로 반환 |
int ordinal() | 열거형 상수가 정의된 순서를 반환(0부터 시작) |
T valueOf(Class<T> enumType, String name) | 지정된 열거형에서 name과 일치하는 열거형 상수를 반환 |
불연속적인 열거형 상수의 경우, 원하는 값을 괄호() 안에 적는다.
- enum Direction { EAST(1), SOUTH(5), WEST(-1)}
괄호를 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
enum Direction {
EAST(1), SOUTH(5), WEST(-1);
private final int value; // 정수를 저장할 필드(인스턴스 변수)를 추가
Direction(int value) {
this.vlaue = value; // 생성자를 추가
}
public int getValue() {
return value;
}
}
열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체 생성 불가
메타 애너테이션
메타 애너테이션은 애너테이션을 위한 애너테이션
메타 에너테이션은 java.lang.annotation 패키지에 포함
애너테이션 | 설명 |
@Target | 애너테이션이 적용가능한 대상을 지정하는데 사용 |
@Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. |
@Inherited | 애너테이션 자손 클래스에 상속되도록 한다. |
@Retention | 애너테이션이 유지되는 범위를 지정하는데 사용한다. |
@Repeatable | 애너테이션을 반복해서 적용할 수 있게 한다. |
@Target
대상 타입 | 의미 |
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(맴버변수, enum상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
@Retention
유지 정책 | 의미 |
SOURCE | 소스 파일에만 존재, 클래스파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재, 실행시 사용 불가 , 기본 값 |
RUNTIME | 클래스 파일에 존재, 실행시에 사용 가능 |
컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE이다.
실행 시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.
프로세스
실행 중인 프로그램, 자원과 스레드로 구성
쓰레드
프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 스레드를 가지고 있다.
멀티 스레드의 장단점
장점
- 시스템 자원을 보다 효율적으로 사용할 수 있다.
- 사용자에 대한 응답성이 향상된다.
- 작업이 분리되어 코드가 간결해진다.
단점
- 동기화에 주의해야 한다.
- 교착상태가 발생하지 않도록 주의해야 한다.
- 각 스레드가 효율적으로 고르게 실행될 수 있게 해야 한다.
쓰레드 구현과 실행
- Thread 클래스를 상속
- Runnable 인터페이스를 구현
스레드의 실행
스레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작한다.
ThreadEx1_1 t1 = new ThreadEx1_1(); // 쓰레드 t1을 생성한다.
ThreadEx1_1 t2 = new ThreadEx1_1(); // 쓰레드 t2을 생성한다.
t1.start(); // 쓰레드 t1을 실행시킨다.
t2.start(); // 쓰레드 t2를 실행시킨다.
main 쓰레드
main 메서드의 코드를 수행하는 쓰레드
스레드는 사용자의 쓰레드와 데몬 쓰레드 두 종류가 있다.
스레드의 우선순위
작업의 중요도에 따라 스레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있다.
setPriority(숫자);
쓰레드 그룹
서로 관련된 스레드를 그룹으로 묶어서 다루기 위한 것
모든 스레드는 반드시 하나의 쓰레드 그룹에 포함되어 있어야 한다.
쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 main 쓰레드 그룹에 속한다.
자신을 생성한 스레드(부모 쓰레드)의 그룹과 우선순위를 상속받는다.
데몬 쓰레드
일반 스레드의 작업을 돕는 보조적인 역할을 수행
일반 스레드가 모두 종료되면 자동적으로 종료된다.
가비지 컬렉터, 자동 저장, 화면 자동갱신 등에 사용된다.
무한루프와 조건문을 이용해서 실행 후 대기하다가 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.
boolean isDaemon() - 스레드가 데몬 스레드인지 확인한다.
void setDaemon(boolean on) - 스레드를 데몬 스레드로 또는 사용자 쓰레드로 변경, 매개변수 on을 true로 지정하면 데몬 스레드가 된다.
setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 IllegalThreadStateException이 발생한다.
스레드의 상태
상태 | 설명 |
NEW | 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 |
RUNNABLE | 실행 중 또는 실행 가능 상태 |
BLOCKED | 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태) |
WAITING, TIMED_WAITING | 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태. TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 |
TERMINATED | 쓰레드의 작업이 종료된 상태 |
sleep()
현재 스레드를 지정된 시간 동안 멈추게 한다.
예외처리를 해야 한다.(InterruptedException이 발생하면 깨어남)
interrupt()
대기상태인 스레드를 실행 대기 상태로 만든다.
'개발 > Java' 카테고리의 다른 글
자바의 정석 - 기초편 [Optional] (0) | 2022.07.18 |
---|---|
자바의 정석 - 기초편 [join(), yield() ~ 스트림] (0) | 2022.07.16 |
자바의 정석 - 기초편 [HashSet(2) ~ 제네릭] (0) | 2022.07.13 |
자바의 정석 - 기초편 [컬렉션프레임웍과 핵심 인터페이스 ~ HashSet(1)] (0) | 2022.07.13 |
자바의 정석 - 기초편 [연결된예외 ~ 래퍼클래스] (0) | 2022.07.11 |