Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

스포츠마케터의 초보 개발자 도전기

JAVA study 15 본문

develop/JAVA

JAVA study 15

teammate brothers 2024. 3. 18. 10:45

1. exception 예외처리

1) try_catch

자바에서 프로그램이 실행되는 도중 예외(오류, 에러, 버그)가 발생하면, 그 시점에서 강제적으로 종료된다.

이것은 올바른 판단이지만, 때로는 예상 할 수 있는 예외에 대해 프로그램을 종료하지 않고 이후의 작업을 이어 나가야할 때가 있다. 이때 예외 처리를 통해 프로그램의 비정상적인 종료를 줄일 수 있다.

package ex1_exception;

public class Ex1_try_catch {
	public static void main(String[] args) {

		// try-catch(예외처리)
		// 자바에서 프로그램이 실행되는 도중 예외(오류, 에러, 버그...)가 발생하면
		// 그 시점에서 강제적으로 종료된다. 이것은 올바른 판단이지만, 때로는 예상할 수 있는
		// 예외에 대해 프로그램을 종료하지 않고 이후의 작업을 이어 나가야 할때가 있다.
		// 예외 처리를 통해 프로그램의 비정상적인 종료를 줄일 수 있다.

		int result = 0;
		int[] arr = new int[2];

		// try는 하나밖에 만들지 못함
		// try 영역 밖에서 오류가 나면 코드 자체가 실행이 안됨
		try { 
			int n = 2; // try 영역에서 만든 변수는 지역 변수로서 catch에서도 사용 불가

			result = 10 / n; // try에서 오류가 나면 오류가 난 시점에서 아래 내용을 실행하지 않고 바로 catch로 빠져 나간다

			arr[1] = 100; // try영역에서는 최초 오류만 확인 가능하고 그 다음 생긴 오류에 대해서는 위 오류를 수정할때까지 확인 할 수 없다.
			System.out.println("안녕");

			// catch를 여러개 만들어 각 오류에 대해 대응할 수 있다.
			// 이때는 Exception의 명칭을 정확히 해주는 것이 좋다
		} catch (ArithmeticException e) { // try에서 오류가 나면 실행 되는 영역으로 오류가 없을 경우 실행된지 않는다
			// n = 10;
			System.out.println("0으로 나눌 수 없어요");
			// e.printStackTrace(); //오류의 문제 파악 (개발자 측면)

		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("존재하지 않는 index로 접근함");

		} finally {
			//예외 발생 여부와 관계 없이 반드시 실행되는 영역
			System.out.println("finally");
		}

		System.out.println(result);

	}// main
}

 

2) throws

package ex2_exception;

public class Exception1 {

	public void div1(int n) throws ArithmeticException {

		//throws를 통해 현재 메서드에서 발생한 오류를
		//다른 클래스에서 잡아 줄 수 있도록 넘길 수 있다.
		int num = 10 / n;
		System.out.println(num);
		
	}
}
package ex2_exception;

public class Exception2 {

	public void div2(int n) throws ArithmeticException {

		int num = 10 / n;
		System.out.println(num);

	}
}

--

package ex2_exception;

public class ExceptionMain {
	public static void main(String[] args) {
		
		Exception1 e1 = new Exception1();
		Exception2 e2 = new Exception2();
		
		try {
		e1.div1(0);
		e2.div2(0);
		}catch (Exception e) {
			System.out.println("0으로 나눌 수 없어요");
		}
		
		System.out.println("프로그램 종료");
		
	}//main
}

 

예제1)

package ex3_exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Ex1_exception {

	public static void main(String[] args) {
		
		//Scanner를 통해 키보드에서 정수를 입력받도록한다
		//정수를 받았을때는 그 값을 그대로 출력하되
		//정수가 아닐경우 '정수만 입력하세요'를 출력
		//-------------
		//정수 : 10
		//입력받은 수 :10 
		
		//정수 : a
		//정수만 입력하세요
		
		Scanner sc = new Scanner(System.in);
		System.out.println("입력 : ");
	
		try { 
			int num = sc.nextInt();
			System.out.println("입력받은 수 : " + num);
			
		}catch (Exception e) {
			System.out.println("정수만 입력하세요");
			
		}
		
	}//main
}

 

예제2)

package ex3_exception;

import java.util.Scanner;

public class Ex2_exception {
	public static void main(String[] args) {

		// 정수 : 100
		// 결과 : 100

		// 정수 : abc
		// abc는 정수가 아님

		Scanner sc = new Scanner(System.in);
		System.out.print("입력 : ");
		String number = sc.next();

		try {

			int n = Integer.parseInt(number);
			System.out.println("결과 : " + n);

		} catch (Exception e) {
			System.out.println(number + "는 정수가 아님");
		}

	}// main
}

 

2. thread

메인 스레드 이외 추가로 스레드가 하나 더 있으면 Single thread, 2개 이상이면 Multi thread

package ex4_thread;

public class ThreadTest extends Thread {
//스레드는 독립적인 실행 단위
// 한번에 두가지 이상의 프로세스를 실행 가능하게 해 준다

//Thread를 사용하려면 Thread를 부모 클라스에서 상속받은 후 run 메소드를 반드시 오버라이딩해서 스레드 사용
//run 밖에서는 순차적으로 실행되고 독립적으로는 실행되지 않는다	

	@Override
	public void run() {
		// 프로세스의 독립적인 수행을 위한 영역

		for (int i = 0; i < 10; i++) {
			System.out.println("스레드 실행중");

			try {
				Thread.sleep(1000); // try-catch에 반드시 씌워야함
			} catch (InterruptedException e) {

				e.printStackTrace();
			}

		} // for

	}

}

--

package ex4_thread;

public class ThreadMain {

	public static void main(String[] args) {

		ThreadTest tt = new ThreadTest();
		// start라는 메소드로 run()내부의 코드를 독립적으로 실행
		tt.start();

		System.out.println("메인스레드 종료");

	}// main
}

 

thread 특징

package ex5_thread;

public class T1 extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("1");
		}
	}
}
package ex5_thread;

public class T2 extends Thread {

	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println("2");
		}
	}
}

--

package ex5_thread;

public class TMain {

	public static void main(String[] args) {

		T1 t1 = new T1();
		T2 t2 = new T2();

		// 인접한 위치에서 호출된 스레드들은 누가먼저 실행될지 절대로 예측할 수 없다
		t1.start();

		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		t2.start();

	}

}

 

runnable

어떤 클래스가 이미 extends(상속) 되어있을때, runnable을 이용하여(implements) 스레드 사용 가능

package ex6_runnable;

public class RunnableTest implements Runnable {

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println(i);
		} // for
	}

}

--

package ex6_runnable;

public class RunMain {
	public static void main(String[] args) {

		RunnableTest rt = new RunnableTest();
		Thread t1 = new Thread(rt); //어떤 클래스가 이미 상속(extends) 되어 있을때 runnable을 이용하여(implements) 스레드 사용 가능. 어떤것을 run 시킬지 rt자리에 씀
		t1.start();
		
		System.out.println("메인종료");

	}// main
}

 

예제)

package ex7_thread;

public class TCount extends Thread {

	private int num = 0;

	public void setNum(int num) {
		this.num = num;
	}

	@Override
	public void run() {

		for (int i = num; i >= 0; i--) {
			System.out.println(i);

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}

	}

}

--

package ex7_thread;

import java.util.Scanner;

public class TMain {
	public static void main(String[] args) {

		// 스캐너를 통해 키보드에서 정수를 입력받는다
		// 입력받은 숫자가 1초에 1씩 감소되면서 출력되다가 0이 되었을때
		// 프로그램(스레드)을 종료하시오
		// ---------

		Scanner sc = new Scanner(System.in);
		System.out.println("입력 : ");
		int n = sc.nextInt();

		TCount t1 = new TCount();
		t1.setNum(n);
		t1.start();

	}// main

}

 

throws를 이용하여 강제로 try-catch를 만들어야하는 구문을 한곳으로 던져서 그곳에서 한번에 처리 가능

package ex8_throws;

public class T1 {

	public void showNum1() throws InterruptedException {

		for (int i = 0; i < 10; i++) {

			System.out.println("num1");
			Thread.sleep(1000);

		} // for
	}
}
package ex8_throws;

public class T2 {

	public void showNum2() throws InterruptedException {

		for (int i = 0; i < 10; i++) {

			System.out.println("num2");
			Thread.sleep(1000);

		} // for
	}
}

--

package ex8_throws;

public class TMain {

	public static void main(String[] args) {

		T1 t1 = new T1();
		T2 t2 = new T2();

		// throws로 넘겨받은 오류에 대해서
		// 한번에 처리하기 위해 main 메서드가 try-catch구문을 생성
		try {
			t1.showNum1();
			t2.showNum2();
		} catch (Exception e) {

		}

	}// main

}

 

daemon thread

package ex9_daemon;

public class Work extends Thread {

	@Override
	public void run() {

		while (true) {

			try {
				Thread.sleep(3000);
				System.out.println("자동저장 완료");

			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		} // while
	}

}

--

package ex9_daemon;

public class DaemonMain {

	public static void main(String[] args) throws InterruptedException {

		// 데몬스레드
		// 다른 스레드의 작업을 돕는 보조적인 역할을 수행
		// 데몬스레드를 호툴한 클래스가 종료되면 함께 종료된다

		Work dm = new Work();

		// Work 클래스를 데몬스레드로 지정. main에서 지정한 Daemon class에서 종료하면 다른 곳에서 while문으로 무한 반복하던
		// 영역도 종료
		dm.setDaemon(true);
		dm.start();

		for (int i = 1; i <= 15; i++) {
			Thread.sleep(1000);

			System.out.println(i);
		}

		System.out.println("게임종료");

	}// main
}

 

synchonized

package ex10_synchronized;

public class SyncEx implements Runnable {
//여러개 자원을 하나의 메소드에서 구현하려면 러너블이 구현되야함

	private int money = 10000;

	// 스레드 동기화
	// 특정 (여러개의) 스레드들이 하나의 자원을 공유하고 있을 때, 현재 자원을 사용중이지 않은 다른 스레드가
	// 작업을 멈추고 대기상태가 되도록 처리하는 것

	@Override
	public void run() {

		//synchronized 영역을 만들면 해당 영역에서 사용되는 코드를
		//먼저 접근한 스레드가 작업을 마무리 할때까지, 다른 스레드에서 접근할 수 없다.
		synchronized (SyncEx.class) {

			for (int i = 0; i < 10; i++) {
				try {
					Thread.sleep(500);

					String tname = Thread.currentThread().getName();

					if (money > 0) {
						money -= 1000;
						System.out.println(tname + "- 잔액 : " + money);
					} else {
						System.out.println(tname + "- 잔액부족");
					}

				} catch (Exception e) {

				}
			} // for

		} // synchronized

	}

}

--

package ex10_synchronized;

public class SyncMain {
	public static void main(String[] args) {

		SyncEx atm = new SyncEx();
		Thread mom = new Thread(atm, "엄마");
		Thread son = new Thread(atm, "아들");

		mom.start();
		son.start();

	}// main
}

 

과제 1) 문제 정답까지 시간 측정

package ex11_work;

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

public class Quiz extends Thread {

	private int su1, su2;
	private int timer = 0;
	private int playCount = 0;
	private boolean isCheck = true; // 두개의 스레드를 한번에 멈추기 위해서 (하단 isCheck 쓴거 확인)
	private final int FINISH = 5; // 상수값 관리, 몇문제 맞출지, 맞췄는지 위에서 관리 가능
	private Random rnd = new Random(); // 랜던음 계속 활용하니 변수로 선언
	private Scanner sc = new Scanner(System.in); // 이것도

	public void startGame() {

		while (isCheck) { // isCheck == true / !isCheck == false

			su1 = rnd.nextInt(100) + 1;
			su2 = rnd.nextInt(100) + 1;
			System.out.printf("%d + %d = ", su1, su2);
			int result = sc.nextInt();

			if (result == su1 + su2) {
				System.out.println("정답");
				playCount++;
			} else {
				System.out.println("오답");
			}

			// 정답처리
			if (playCount == FINISH) {
				System.out.printf("결과 : %d초\n", timer);
				isCheck = false; // while문 종료 -> while문 나감
			}
		} // while

	}// startGame

	@Override
	public void run() {
		// 1초에 1씩 timer를 증가시키는 영역
		while (isCheck) {

			try {
				Thread.sleep(1000);
				timer++; // 1초 뒤에 타이머 카운터 하나 증가

			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		} // while

	}

}

--

package ex11_work;

public class QuizMain {

	public static void main(String[] args) {

		Quiz q = new Quiz();
		q.start(); // 게임보다 시간 스타트를 먼저하는 것이 좋음
		q.startGame();

	}// main
}

 

과제2) Runners

package ex12_work;

import java.util.Random;

public class Runners {

	public static void main(String[] args) throws InterruptedException {

		int[] playerRandom = new int[2]; // 달리기 인원
		String[] playerJump = new String[playerRandom.length]; // 달리는 사람 공간 배열
		for (int i = 0; i < playerJump.length; i++) {
			playerJump[i] = "";

		}

		boolean finish = false;
		int winnerPlayer = 0;

		Random rnd = new Random();

		while (true) {

			for (int i = 0; i < playerRandom.length; i++) {
				playerRandom[i] = rnd.nextInt(2);
			}
			// 0.1초 간격으로 휴식
			Thread.sleep(100);

			// 각 선수에게 달릴 거리를 적용
			for (int i = 0; i < playerJump.length; i++) {
				switch (playerRandom[i]) {
				case 0:
					playerJump[i] += "";
					break;

				case 1:
					playerJump[i] += " ";
					break;
				}// switch

			} // for

			// 달리기
			System.out.println("============================================================");
			for (int i = 0; i < playerJump.length; i++) {
				System.out.print(playerJump[i]);
				System.out.println(i + 1 + "옷");

				if (playerJump[i].length() >= 50) { // 결승점(50)까지 먼저 도달한 선수
					winnerPlayer = i + 1;
					finish = true;
				}
			} // for
			System.out.println("============================================================");

			if (finish) { // finish == true
				System.out.println("win - " + winnerPlayer);
				break;
			}
		} // while

	}// main

}

'develop > JAVA' 카테고리의 다른 글

JAVA study 17  (0) 2024.03.20
JAVA study 16  (0) 2024.03.19
JAVA study 14  (0) 2024.03.15
JAVA study 13  (0) 2024.03.14
JAVA study 12  (0) 2024.03.13