자바

고급자바_1223-1

정재화니 2022. 12. 23. 12:45

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();

실행하면 된다.