JAVA day 9

lee·2021년 12월 3일
0

JAVA

목록 보기
9/14

learning

수업내용 링크

저장소 : GitHub Repositories leeconomy1121/java-study

Enum(Enumeration) 열거형

  • Enum 이란?
    관련이 있는 상수들의 집합입니다. 자바에서는 final로 String과 같은 문자열이나 숫자들을 나타내는 기본 자료형의 값을 고정할 수 있습니다. 이렇게 고정된 값을 상수라고합니다. 영어로는 constant입니다. 어떤 클래스가 상수만으로 작성되어 있으면 반드시 class로 선언할 필요는 없습니다. 이럴 때 class로 선언된 부분에 enum이라고 선언하면 이 객체는 상수의 집합이다. 라는 것을 명시적으로 나타냅니다.

  • Enum을 사용해 가위바위보 게임 수정하기

App class

package application;

import game.Game;

public class App {

	public static void main(String[] args) {
		// 여기부터 프로그램 시작
//		Game game = new Game();
//		game.run();
		new Game().run();
		// 클래스 불러오기 할 때 Ctrl + 스페이스 or Ctrl + Shift + o (여러 개를 한꺼번에)
		
	}

}

Game class

package game;

import java.util.Random;
import java.util.Scanner;

import game.oject.GameObject;

public class Game {
	// 사용 할 가위, 바위, 보 객체를 생성
	GameObject[] objects = GameObject.values(); // enum의 상수들을 리턴
	Random random = new Random();
	Scanner scanner = new Scanner(System.in);
	
	public void run() {
		System.out.println("삼세판 게임시작 ...");
		int wins = 0;
		
		for (int i = 1; i <= 3; i++) { // i는 1부터 3까지 3번 반복
			// 유저의 선택
			System.out.println("가위(0), 바위(1), 보(2) 중 숫자로 선택 : ");
			
			// int num = scanner.nextInt(); 
			// int num = random.nextInt(objects.length);
			// GameObject ob = objects[num];
			// 간소화 하기
			GameObject ob1 = objects[scanner.nextInt()];
			GameObject ob2 = objects[random.nextInt(objects.length)];
			
			System.out.println("당신의 선택은 : " + ob1);
			System.out.println("컴퓨터 선택은 : " + ob2);
			
			int result = ob1.copare(ob2);
			wins += result;
			if (result > 0) {
				System.out.println(i + "round Win! ✌");
			} else if (result < 0) {
				System.out.println(i + "round Lose! 👎");
			} else {
				System.out.println(i + "round Draw! 🙌");
			}
		}
		
		// 3번 가위바위보 끝난후
		// 총점 wins로 전체 결과를 출력
		System.out.println("삼세판 결과는 : ");
		if (wins > 0) {
			System.out.println("당신의 승리! 🚀");
		} else if (wins < 0) {
			System.out.println("당신의 패배! ☄");
		} else {
			System.out.println("비겼습니다! Draw! 🌊");
		}
		
	}
}

game.object
Gameobject class

package game.oject;

public enum GameObject {
	
	가위, 바위,;
	
	private int[][] comparison = {
			//				가위	바위	보
			/* 가위(0) */ {   0,     -1,     1    },
			/* 바위(1) */ {   1,      0,    -1    },
			/* 보(2) */   {  -1,      1,     0    }
	};
	
	// 상대의 (가위,바위,보)와 비교해서 결과 리턴
	public int copare(GameObject ob) {
		return comparison[this.ordinal()][ob.ordinal()]; // enum 끼리 비교해서 인덱스 번호로 비교
	}
	
}

수정 후 실행 결과 동일함

예외 처리

  • 자바 예외(Excpetion)
    프로그램 실행과정에서 발생하는 비정상적인 상활을 '예외(Exception)'라고 합니다. 예를 들어 존재하지 않는 파일을 오픈하려고 한다던가, 설정되지 않은 객체의 메소드를 호출하려고 하는 경우 예외가 발생합니다.
    프로그램 실행 중에 발생하는 예외를 잘 처리해주는 것을 '예외처리(Exception Handling)'이라고 합니다. 예외 상황에서 벗어나도록 코드를 작성하던가 시스템을 망가트리지 않는 상황에서 자연스럽게 프로그램이 종료되도록 처리해줘야 합니다.

  • 쓰레드란?
    OS에서 크롬을 이용해 인터넷을 하면서 한글문서를 작성하기도 하고 동영상을 시청하기도 한다. 동시에 여러 프로그램이 실행이되어도 CPU는 시간을 분할하여 프로세스마다 우선권을 주어 작업을 처리하기 떄문이다. 이런 운영체제에서 실행되는 하나의 프로그램 단위를 프로세스라고 한다. 쓰레드는 프로세스 내에서 실행되는 세부작업 단위이다. 프로세스가 하나 이상의 쓰레드를 사용한다면 멀티 쓰레드라고 부르게 된다.

    프로세스 = 운영체제에서 실행되는 하나의 프로그램 단위이다(ex. 크롬, 한글, 엑셀)
    쓰레드 = 프로세스 내에서 실행되는 세부 작업단위

  • 오류와 예외
    프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원일을 프로그램 오류(error)라고 한다.

    발생 시점에 따라
    컴파일 오류(compile-time error) : 컴파일 시에 발생하는 에러
    실행 오류(runtime error) : 실행 시에 발생하는 에러

    컴파일 오류는 개발 환경에서 대부분 원인을 알 수 있다. (이클립스에서 미리 표시됨)
    발생한 컴파일 오류를 모두 수정해야 프로그램이 정상적으로 실행되므로, 문법적으로 오류가 있다는 것을 바로 알 수 있다.
    하지만 프로그램 실행 중에 발생하는 오류는 예측하기 어려운 경우가 많고, 프로그램이 비정상 종료되면서 갑자기 멈춰 버린다. 자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 '시스템 오류(error)'와 '에외(exception)' 두 가지로 구분하였다.

    시스템 오류(Error)
    프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    예외(Exception)
    프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

  • 예외 (Error vs Exception)
    오류(Error)는 시스템에 비정상적인 상황이 생겼을 때 발생한다. 시스템 레벨에서 발생하여 심각한 수준의 오류를 말한다. 이런 오류는 개발자가 미리 예측할 수 없기 때문에, 오류에 대한 처리를 신경 쓰지 않아도 된다. 프로그램에 오류가 있을 때 발생되도록 의도된 오류이다.
    예외(Exception)는 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있기 떄문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.

    예외 클래스
    Exception 앞에 Runtime을 붙이고 throws Exception 모두 제거해도 문법 에러가 나지 않는다.

  • try-catch 예제 프로그램
    App class

package try_catch_finally;

public class App {

	public static void main(String[] args) {
		
		Person p1 = new Person();
		
		try {
			p1.setName("펭수");
			System.out.println("예외 발생 시 여기는 실행안됨");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		} finally {
			// 여기는 예외가 발생하든 안하든 무조건 실행됨
			System.out.println("finally 무조건 실행");
		}
		
		System.out.println("프로그램 종료");

	}

}

Person class

package try_catch_finally;

public class Person {
	private String name;
	public void setName(String name) throws Exception {
		if(name == null) {
			throw new Exception("이름에 널값을 입력할 수 없습니다.");
		}
		this.name = name;
		System.out.println("이름은 " + name);
	}
}

결과

profile
Hello, world!

0개의 댓글