코드 그라데이션
후발대 20일차 설명 추가 본문
_06_CustomException
package prac18;
public class _06_CustomException {
public static void main(String[] args) {
// 사용자 예외 정의 day19
int age = 17; // 만 17세
try {
if (age < 19) {
// System.out.println("만 19세 미만에게는 판매하지 않아요.");
throw new AgeLessThan19Exception("만 19세 미만에게는 판매하지 않아요.");
} else {
System.out.println("주문하신 상품 여기 있습니다. ");
}
} catch (AgeLessThan19Exception e) {
System.out.println("조금 더 성장한 후에 오세요. ");
} catch (Exception e){
// e.printStackTrace();
System.out.println("모든 예외를 처리합니다.");
}
}
}
// 사용자 정의 예외 생성
class AgeLessThan19Exception extends Exception{
public AgeLessThan19Exception(String message) {
super(message);
}
}
_07_Throws
package prac18;
import java.io.FileWriter;
import java.io.IOException;
public class _07_Throws {
public static void main(String[] args) {
// 여기서는 surround with try-catch 선택
try {
writeFile();
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
System.out.println("메인 메소드에서 해결할게요.");
}
}
// 파일에다가 어떤 내용을 쓰는 동작을 하겠다.
// 파일 입출력은 가장 마지막에 배울 테니 걱정하지 마세요.
public static void writeFile() throws IOException {
// try-catch로 감싸기 전에는 FileWriter writer = new FileWriter("test.txt"); 이렇게 되어 있었다.
// surround with try-catch 선택
/*
try {
FileWriter writer = new FileWriter("test.txt");
throw new IOException("파일 쓰기에 실패했어요.");
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace(); // 우리가 생성할 때 발생했던 에러를 보여준다.
System.out.println("writeFile 메소드 내에서 자체 해결했어요.");
}
*/
// 새로 시도할 방법 예시
// FileWriter writer = new FileWriter("test.txt");여기서 add Exception to 메서드 시그니처 선택
// rmfjaus throws IOException 이 옆에 붙더라.
FileWriter writer = new FileWriter("test.txt");
throw new IOException("파일 쓰기에 실패했어요.");
}
}
/*
이건 기존에 했던 예외처리와 좀 다른 방법.
우리가 지금 main 메서드에서 writeFile이라는 메서드를 호출을 하는데, 여기 안에서 문제가 발생한다고 하면
이 메서드를 호출한 main 메서드에서 자체적으로 해결하는 방법.
*/
예외처리 퀴즈는 별도 글에
_01_Thread
package Prac20;
import Prac20.clean.CleanThread;
// day20 뒷부분
public class _01_Thread {
public static void main(String[] args) {
// 쓰레드
// 실행 가능한 형태의 exe // 실행하는 형태는 프로세스 // 모든 프로그램은 하나의 쓰레드 안에서 하나의 프로세스가 실행되는 것.
// 프로세스는 여러개의 쓰레드를 가질 수 있으나, 일반적으로 하나의 프로그램은 하나의 쓰레드가 있다고 생각하자.
// 1 3 5 7 9
// 2 4 6 8 10
// 쓰레드는 별도의 패키지를 만들어서 실행
// cleanByMySelf();
CleanThread cleanThread = new CleanThread();
// cleanThread.run(); // 직원 청소
cleanThread.start();
cleanByBoss(); // 사장 청소
}
public static void cleanByMySelf() {
System.out.println("혼자 청소 시작~~~");
for (int i = 1; i <= 10; i++) {
System.out.println("(혼자) " + i + " 번 방 청소 중");
}
System.out.println("혼자 청소 끝.");
}
public static void cleanByBoss() {
System.out.println("사장 청소 시작~~~");
for (int i = 1; i <= 10; i+=2) { // 1, 3, 5, 7, 9번 방 청소하기로 했으므로.
System.out.println("(사장) " + i + " 번 방 청소 중");
}
System.out.println("사장 청소 끝~~.");
}
}
/*
우리가 thread를 실행할 때, 지금 run() 이면 한 명이 청소가 끝나야 다른 한 명이 청소를 시작해서 끝내더라.
run() 메서드를 직접 호출하면 안 된다.
그러면 그냥 쓰레드 안에 있는 run() 메서드를 수행하는 것 뿐이고,
이를 별도의 Thread로 만들어서 수행하기 위해서는 run() 이 아니라 start() 메서드를 써줘야 한다.
*/
CleanThread
package Prac20.clean;
public class CleanThread extends Thread {
public void run() {
System.out.println("직원 청소 시작 (Thread)~~~");
// 짝수방 홀수방 서로 하기로 했으므로(직원은 2, 4, 6, 8, 10번 방)
for (int i = 2; i <= 10; i+=2) {
System.out.println("(직원) " + i + " 번 방 청소 중 (Thread)");
}
System.out.println("직원 청소 끝 (Thread) ~~~");
}
}
실행 결과
사장 청소 시작~~~
직원 청소 시작 (Thread)~~~
(사장) 1 번 방 청소 중
(사장) 3 번 방 청소 중
(사장) 5 번 방 청소 중
(사장) 7 번 방 청소 중
(사장) 9 번 방 청소 중
사장 청소 끝~~.
(직원) 2 번 방 청소 중 (Thread)
(직원) 4 번 방 청소 중 (Thread)
(직원) 6 번 방 청소 중 (Thread)
(직원) 8 번 방 청소 중 (Thread)
(직원) 10 번 방 청소 중 (Thread)
직원 청소 끝 (Thread) ~~~
Process finished with exit code 0
이렇게, 원래 동시에 하려는 게 의도였는데
순서대로 하고 있는 아이러니한 상황이 발생하고 있음.
run() 메서드를 직접 호출을 하게 되면 안 된다.
직접 호출 하게 되면 그냥 우리가 쓰레드 안에 있는 run() 메서드를 실행하게 되는 것 뿐이고,
별도의 쓰레드로 만들어서 실행을 하기 위해서는 run()이 아니라 start()라는 실행해줘야 한다.
자세한 것은 다음 시간에.
728x90
'Java > 후발대' 카테고리의 다른 글
후발대 21일차 전체 코드 (0) | 2023.03.03 |
---|---|
예외처리 Quiz (0) | 2023.03.03 |
후발대 20일차 전체 코드 (0) | 2023.03.02 |
후발대 19일차 설명 추가 (0) | 2023.02.24 |
후발대 19일차 전체 코드 (0) | 2023.02.24 |
Comments