코드 그라데이션

후발대 20일차 설명 추가 본문

Java/후발대

후발대 20일차 설명 추가

완벽한 장면 2023. 3. 2. 23:51

_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