11월09일 Day 19

여우·2022년 11월 9일
0

공부중

목록 보기
13/38

예외 처리 (Exception)

  • Exception : 프로그램에서 발생할 수 있는 예외 상황을 객체로 취급하는 클래스
  • java.lang.Exception (예외도 객체로 취급)
  • 예외 : 예측 할 수 있는 문제 상황, 적절한 처리를 통해 처리할 수 있음
  • 에러 : 코드 상의 결함으로 발생하는 프로그램 내부에서 처리할 수 없는 문제 상황

예시)

예외는 try{}catch{} 형식으로 사용이 된다. 먼저 예외가 발생할 수 있는 내용을 try{}안에 작성하고 혹시 예외상황이 발생 된다면 catch로 발생한 예외를 잡아주는 역할을 한다. catch( ) 안에는 발생하는 예외코드를 작성해주고, 종속문에 e.printStackTrace() 코드는 예외 발생 스택을 순서대로 출력해준다.

예시)

예외는 여러 상황이 발생이 되며 하나의 try 아래에 여러개의 catch가 존재 할 수 있다.배열의 경우 범위 초과의 경우 IndexOutOfBound 에러와, 정수아닌 숫자 입력시의 InputMismatch 예외가 발생 될수 있다.

그리고 finally는 예외 발생 여부에 관계 없이 무조건 수행하는 코드이다. 보통 return은 종료를 의미 하는데 finally는 return 실행 한 뒤에도 실행이 된다.

static void test() 함수는 호출되며 try 의 출력문이 먼저 출력되고, finally가 실행되며 출력문이 출력 된다.

  • 예외 객체 생성하여 처리 하기

예외도 자바에서는 객체로 취급하기에 먼저 예외 클래스를 만들어주어야 한다. 이때 Exception이라는 클래스를 상속받아야 되고, 상속을 받게 되면 노란줄이 뜨면서 serial version UID 필드를 선언을 유도하여주기에 선언을 해준후, 예외 발생시 출력할 내용을 toString 오버라이딩 해줍니다.

그리고 메인에서 사용할 함수들을 선언해주는데 문자열배열이 전부 다 찼는지 확인하는 함수와 중복된 내용이 없는지 확인하는 함수가 만들어져 있습니다.

메인에서는 문자열 5개를 저장할 배열을 만들어준후, 아까 만들어 두었던 배열이 다찼는지 확인하는 메서드를 조건으로 while()문을 실행하여 입력을 받도록 합니다.

입력을 받으면서 혹시나 중복되는 내용은 없는지 확인하는 isDuplicate 메서드를 조건으로 혹시나 같은 내용이 발견 되면 if문의 종속문을 실행하게 되고 그러면 try{} 가 실행되면서 맨처음 만들어 두었던 예외를 객체로 만들어서 throw 하면서 발생이 됩니다. 그러면 아래의 catch에서 예외를 처리 하여줍니다.

여기서 continue는 break의 반대 개념으로 보통 break를 실행하면 반복문을 종료 하게 되는데 continue는 조건에 맞다면 반복중 그 작업만 건너 뛰고 다시 반복을 하게 되는 구조이다.

  • 두 정수를 입력 받고 연산자를 입력받아서 계산하는 메서드

입력을 받는 메서드들은 사용자가 개발자의 요구에 맞게 잘 입력이 된다면 상관이 없지만 항상 예외가 많이 발생한다.

먼저 메인에서

scanner를 통해 입력을 받아주는데 연산자의 경우 nextline으로 받아서 charAt(0)으로 받아줍니다. 그리고 연산자의 종류에 따라 switch문이나 if문으로 정수들을 어떻게 처리할지 제어해줍니다. 이 모든 예외가 발생될 수 있는 과정은 try에 적어주고 아래에catch를 적어서 발생된 예외들을 잡아 줍니다.

그리고 main문 위로 예외 클래스를 작성해줍니다. 이유는 저기서 발생 될 수 있는 예외들로는 정수가 아닌게 입력 되는 경우와, 0으로 나누게 되는 경우 그리고 연산자가 연산기호가 아닌경우 입니다.

연산기호의 경우 기호가 아니라 다른 무엇이 입력되더라도 입력된 첫번째 문자를 가져오기에 switch 의 case들 중 4개가아니면 default값으로 정하여 default이면 위에 생성한 예외 클래스 객체를 생성하고 throw 하게 됩니다. 그러면 밑에서 발생한 예외를 잡아주는 catch들중 알맞은 catch에서 종속문을 실행하게 됩니다.

Thread

  • 쓰레드는 하나의 프로그램에서 여러 함수가 동시다발적으로 실행되도록 처리하는 클래스를 의미 한다.
  • 컴퓨터의 CPU에서 Main을 바라 보게 되는데 여기서 쓰레드 클래스를 이용하면 CPU가 메인의 함수를 순서대로 처리하는것을 메인과 동시에 쓰레드클래스로 작동될 함수가 동시에 구동이 된다.

예시)

N클래스 객체 ob1과 A클래스 객체 ob2를 생성하였고, N클래스는 Thread를 extends 하였습니다. Thread 클래스를 상속받은 클래스의 객체는 start라는 메서드를 가지고 이 메서드는 해당 클래스에 run() 함수를 실행하게 합니다.
run()함수는 Thread를 상속받은 클래스에서 오버라이딩 해야 하는 메서드 입니다.

이렇게 되면 ob1의 숫자를 출력하는 함수가 호출되면서 동시에 ob2.show()함수가 동시에 호출되어 알파벳과 숫자가 혼합되어 출력이 됩니다.

  • Runnable
    자바에서는 다중 스레드를 구현하려면 Thread클래스를 상속받아야 하는데 만약 그 클래스가 다른 슈퍼 클래스를 가지고 있다면?
    답은 인터페이스를 구현해야 한다. 이럴때 사용하는 인터페이스는 Runnable 인터페이스 입니다.

Runnable 인터페이스는 함수형 인터페이스이며, 이를 사용하기 위해서는 main에 Thread 객체를 생성하여 매개 변수로 Runnable 객체를 전달해주어 사용한다. 그러기에 Thread 객체가 아예 없이 구현되지는 않는다.

또한 함수형 인터페이스의 특징인 람다식으로 () -> {} 간략하게 코드 작성도 가능하다.

  • 10초타이머 동작 동시에 문자 입력 받기


Timer 클래스는 Object를 상속받아 다중 스레드 구현을 위해 Runnable을 구현해야 하고, 기본생성자에 시간을 입력받아서 객체를 생성합니다. check() 함수 실행시 입력 받은 값을 기준으로 1초씩 감소하는형식으로 try{} catch{}에서 쓰레드를 1초마다 잠들기하여 카운트 합니다.

그리고 isOver()의 경우 결과값 over가 아직 check()메서드가 작동하는지 확인하기 위한 메서드로 check()가 다 끝나면 true를 반환하고, check()메서드가 작동중일때는 기본값인 false이기에 main문에서는 입력을 할때마다 아직 over가 true인지 false인지를 판별하여 입력을 활성화 시킵니다.

메인에서는 Timer객체를 Thread로 객체 매개 변수로 전달하여 start()함수를 실행하면서 main의 while문도 진행이 되어져서 입력이 받아지고 받은 입력은 List로 저장이 됩니다.

profile
우당탕탕 지금은 개발중

0개의 댓글