티스토리 뷰

[개발] - 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
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
250x250