고급자바_1223-1
enum(열거형)에 대하여 알아보자
enum(열거형) ==> 서로 관련 있는 상수들의 집합을 나타낸다.
==> 클래스처럼 보이게하는 상수
- 만드는 위치 ==> 열거형은 클래스처럼 독립된 java파일에 만들 수 있고,
하나의 java파일에 클래스와 같이 만들 수 있고,
클래스 안에 내부 클래스처럼 만들 수 있다.
- 열거형의 속성 및 메서드
* name() ==> 열거형 상수의 이름을 문자열로 반환한다.
* ordinal() ==> 열거형 상수가 정의된 순서값(index값)을 반환한다.(0부터 시작)
* valueOf("열거형상수이름") ==> 지정된 열거형에서 '열거형상수이름'과 일치하는 열거형상수를 반환한다.
* 열거형이름.상수이름 ==> valueOf()메서드와 같다.
- 열거형 선언하기
방법1)
enum 열거형이름{상수이름1, 상수이름2, 상수이름3,...}
예시를 보자면
public class EnumTest {
public enum Color {RED, GREEN, BLUR}
public enum Count {ONE, TWO, THREE} // ';' 생략
public static void main(String[] args) {
Color mycol = Color.valueOf("GREEN"); // Color.GREEN 과 같다.
Count mycnt = Count.ONE; // Count.valueOf("ONE") 과 같다.
System.out.println("mycol: " + mycol.name());
System.out.println("mycnt: " + mycnt.name());
System.out.println();
System.out.println("mycol ordinal: " + mycol.ordinal()); //index값
System.out.println("mycnt ordinal: " + mycnt.ordinal());
System.out.println();
/*
서로 다른 종류의 열거형 끼리의 비교는 불가능하다.
if(Color.RED == Count.TWO) {
System.out.println("....");
}*/
if(mycol == Color.GREEN) {
System.out.println("같다....");
}else {
System.out.println("다르다..");
}
System.out.println("-------------------------------");
}
}
보시다시피 서로 다른 열거형 끼리의 비교는 불가능한 것을 알 수 있다.
추가로 열거형이름.values()라는 메서드가 있는데 이것은 모든 열거형 상수들을 배열로 가져옵니다.
for(Color col : Color.values()) {
System.out.println(col);
System.out.println(col.name());
}
향상된 for문을 이용하여 알 수 있습니다.
그리고 열거형을 switch문에서도 사용할 수 있는데
switch(mycnt) {
case ONE : System.out.println("하나"); break;
case TWO : System.out.println("두울"); break;
case THREE : System.out.println("세엣"); break;
}
mycnt에 Count.ONE으로 초기화 해놓아서 "하나"가 출력되는 것을 알 수 있다.
열거형을 선언하는 두번째 방법을 알아보자
enum 열거형이름{
상수이름1(값들...),
상수이름2(값들...),
...
상수이름n(값들...); //여기는 세미콜론(;) 붙어야함
'값들'이 저장될 변수들 선언한다.
private 자료형이름 변수명1;
...
열거형의 생성자를 만든다.
열거형의 생성자는 '열거형 상수'에 설정될 '값들'을 변수에 셋팅하는 역할을 수행한다.
열거형의 생성자는 묵시적으로 'private'이다.
'변수명'의 개수는 '값들'과 같고 자료형도 맞아야 된다.
private 열거형이름(자료형이름 변수명, ... ){
위에 선언된 변수들을 초기화 한다.
....
}
위에서 구성된 '값들'을 외부에서 불러올 수 있는 getter메서드를 작성한다.
예시코드를 보자면
public enum Season{
//상수이름(값들..)형식의 선언
봄("3월부터 5월까지", 12),
여름("6월부터 8월까지", 32),
가을("9월부터 11월까지", 23),
겨울("12월부터 2월까지", -11);
// '값들'이 저장될 변수들 선언
private String span;
private int temp;
// 생성자
Season(String span, int temp){ // ==> private Season(String span, int temp) 이랑 같다
// 변수들 초기화
this.span = span;
this.temp = temp;
}
// getter메서드 작성
public String getSpan() {
return span;
}
public int getTemp() {
return temp;
}
}
형식을 만들고 변수를 선언한다음에 생성자와 getter메서드를 작성합니다.
Season ss = Season.valueOf("봄");
System.out.println("name: " + ss.name());
System.out.println("ordinal: " + ss.ordinal());
System.out.println("span: " + ss.getSpan());
System.out.println("temp: " + ss.temp);
System.out.println();
for(Season s : Season.values()) {
System.out.println(s.name() + "==" + s + "--> 평균온도: " + s.getTemp() );
}
확인을 해보면
결과를 알 수 있다.
스레드에 대하여 공부해보자
스레드란 어떠한 프로그램내에서 특히 프로세스 내에서 실행되는 흐름의 단위입니다.
- 메모리를 할당받아 실행 중인 프로그램을 프로세스라고 합니다.
- 프로세스 내의 명령어 블록으로 시작점과 종료점을 가진다.
- 실행중에 멈출 수 있으며 동시에 수행 가능하다.
- 어떠한 프로그램내에서 특히 프로세스 내에서 실행되는 흐름의 단위입니다.
멀티 쓰레드 프로그램을 사용하는 방법은 2가지가 있는데
1. hread클래스를 상속한 class를 작성하고 이 class의 인스턴스를 생성한 후
이 인스턴스의 start()메서드를 호출해서 실행한다.
2. Runnable 인터페이스를 구현한 class를 작성하고 이 class의 인스턴스를 생성한다.
그리고 Thread클래스의 인스턴스를 생성할 때 Runnable을 구현한 클래스의 인스턴스를 생성자에
넣어서 생성한다. 이때 Thread클래스 인스턴스의 start()메서드를 호출해서 실행한다.
예시 코드를 보자
// 방법1 ==> Thread클래스를 상속한 class를 작성
class MyThread1 extends Thread{
@Override
public void run() {
// 이 run()메서드를 재정의하는데 이 메서드에는 쓰레드가 처리할 내용을 기술하면 된다.
for(int i = 1; i <=200; i++) {
System.out.println("바");
try {
// Thread.sleep(시간)메서드는 주어진 시간동안 작업을 잠시 멈춘다.
// '시간'은 밀리세컨드 단위를 사용한다.(즉, 1000은 1초를 의미한다.)
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
//방법2 ==> Runnable 인터페이스를 구현한 class를 작성
class MyRunner1 implements Runnable{
@Override
public void run() {
//쓰레드가 처리할 내용을 작성한다.
for(int i = 1; i <=200; i++) {
System.out.print("보");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
실행을 할때는
MyThread1 th1 = new MyThread1();
th1.start();
MyRunner1 r = new MyRunner1();
Thread th2 = new Thread(r);
th2.start();
실행하면 된다.