복습
자바 15일차 - 스트림 활용, 예외처리 본문
Collection에서 스트림 생성하여 사용하기
문자열을 요소로 가지는 ArrayList를 먼저 생성하고 16행에서 ArrayList의 스트림을 생성한다.
17~18행에서 스트림의 forEach와 람다식을 사용하여 ArrayList 요소의 값을 모두 받아와서 출력한다.
그리고 20행에서 스트림을 다시 생성하고 sorted() 메서드로 정렬한 후 위와 같이 forEach와 람다식을 이용하여 각 요소 값을 순서대로 출력한다. 주석처리를 해놓았는데 이를 풀어서 쓴 것이 21~23행이다.
reduce() 연산
: 내부적으로 스트림의 요소를 하나씩 소모하면서 지정된 기능을 수행한다. 최종연산에 속한다.
기본형식 : T reduce(T identify, BinaryOperator<T> accumulator)
괄호안의 T identify는 초깃값을 의미하고, BinaryOperator 클래스는 두 매개변수로 람다식을 구현하므로, BinaryOperator<T> accumulator이 수행해야 할 기능이 된다. 여기서 BinaryOperator 인터페이스를 구현한 람다식을 사용하거나 인터페이스를 구현한 클래스를 사용할 수도 있다.
6행에서 BinaryOperator 인터페이스를 구현하는 클래스를 선언하고 apply()메서드를 구현한다. 그리고 메인함수에서 인삿말들이 들어있는 String 배열을 선언한다. 그 다음 19행에서 greetings 배열의 스트림을 생성하고 reduce()메서드와 조건문을 이용해 두 요소의 길이를 비교하여 큰 값을 출력하도록 하였다.
24행에서는 똑같은 방식이지만 람다식을 사용하지 않고 BinaryOperator 인터페이스를 구현한 클래스를 reduce()메서드에 대입하여 똑같은 결과를 출력하였다.
*왼쪽 아래의 코드는 24행을 풀어서 쓴 코드로 reduce의 반환값이 Optional이라 Optional을 사용한 것을 볼 수 있다.
예외클래스
프로그램에서는 코드 작성실수로 발생하는 컴파일 오류, 실행 중인 프로그램이 의도하지 않은 동작을 하거나 프로그램이 중지되는 실행 오류 두 가지가 있다. 컴파일 오류는 개발 환경에서 대부분 해결할 수 있지만, 프로그램 실행중에 발생하는 오류는 예측하기 어려운 경우가 많고 비정상종료될 수 있다. 따라서 자바는 이러한 비정상종료를 최대한 줄이기 위해 다양한 예외에 대한 처리 방법을 가지고 있다.
예외 처리하기
try-catch문 : 예외를 처리하는 가장 기본 문법
기본형식 :
try{
예외가 발생할 수 있는 코드 부분
} catch(처리할 예외 타입 e) {
try 블록 안에서 예외가 발생했을 때 예외를 처리하는 부분
}
크기가 5인 배열을 생성한 후, try문으로 들어간다. ========이 출력되고 for문이 돌아가는데 인덱스는 4까지 밖에 없는데 for문은 5까지 돌아가므로 예외가 발생한다. 따라서 4까지 출력한 후 예외가 발생하여 catch문으로 가기 때문에
--------는 출력되지 않는다. 그 후 catch문에서 예외를 출력하고 예외 처리 부분 이라는 문구를 출력한 후 빠져나와 프로그램 종료 문구를 출력한다.
FileInPutStream을 이용한 try-catch문
FileInputStream : 파일에서 데이터를 바이트 단위로 읽어 들이는 스트림이다.
try-catch문을 직접 쓰지 않고, 메인함수에서 10행만 입력하게 되면 오류가 발생하여 이클립스에서 자동으로 try-catch문을 쓸 수 있다. 그러면 위와 같은 코드가 되는데 a.txt 라는 파일은 없으므로 발생할 수 있는 예외는 FileNotFoundException 이고, 위의 코드와 마찬가지로 예외가 출력되며 아래에 쓴 문구가 출력된다.
*여기서 예외처리 후에도 마지막의 문구가 출력되는 것을 보면 프로그램이 계속 수행된 것을 알 수 있다. 따라서 예외처리를 하면 예외 상황을 알려주고, 프로그램이 비정상 종료되지 않고 계속 수행될 수 있도록 한다.
try-catch-finally문
finally문은 어떤 경우에서도 수행되며 try,catch문에 return이 있더라도 수행된다.
try-catch문 첫번째 예제에서 문구를 조금 더 추가하여 어떻게 동작하는지를 알 수 있는 코드이다. 9행이 출력되고 10행에서 인덱스 1의 배열요소가 출력되고 11행이 출력된다. 그 후 인덱스가 5인 요소를 출력하려 하지만 없으므로 예외가 발생하여 catch로 넘어간다. 그리고 17행이 출력되고 예외가 출력, 19행이 출력된다. 그리고 마지막으로 finally에 있는 문구가 출력된 후에 마지막의 =====8이 출력된다.
*이렇게 무조건 finally 문이 실행되기 때문에 close()로 파일 리소스를 닫을 때 사용한다.
try-with-resouces문
기존의 try-catch문에서 try(close() 메서드로 닫을 리소스) 형태로 try 안에 리소스를 집어넣어 리소스를 닫아준다.
AutoCloseable 인터페이스를 구현해주어야 close()메서드를 사용할 수 있다.
AutoCloseable 인터페이스를 AutoCloseObj 클래스로 구현하여 try안에 입력하여 리소스를 close()한다.
*try-catch-finally 문에서 finally문에 close()메서드를 사용한 것과 같다.
예외처리미루기
throw 선언을 추가하여 예외를 해당 메서드에서 처리하지 않고 미룬 후 메서드를 호출하여 사용하는 부분에서 예외를 처리하는 방법
FileInputStream으로 a.txt파일을 가져오려하지만 없는 파일이므로 오류가 발생한다. 마우스를 갖다대면 throw 선언을 하거나 try-catch 문을 사용하라고 한다. 여기서 try-catch문을 사용하는 방법이 두가지 인데 한가지는 오른쪽위의 코드로 catch문을 여러개 사용하여 예외가 발생하는 상황을 상황마다 처리하겠다는 의미이다. 또 다른 한가지는 아래코드처럼 여러가지 예외를 한 번에 처리한다는 의미로 catch문 하나로 |(or)을 이용해 발생할 수 있는 예외를 한 번에 처리한다.
*오른쪽 위 코드에서 여러 catch문을 사용할 때 24행의 코드를 추가하여 위의 catch문에서 다루는 예외 이외의 모든 예외를 처리하여 모든예외 상황을 처리한다. 이 코드는 다른 catch문 보다 먼저 나올 수 없다. 먼저 나오게 되면 모든 예외를 다 처리하므로 다른 catch문이 필요가 없어진다.
'자바' 카테고리의 다른 글
자바 17일차 - 직렬화, 나머지 입출력클래스, HEX코드 불러오기 (0) | 2020.04.09 |
---|---|
자바 16일차 - 표준 입출력, 바이트 단위 스트림 (0) | 2020.04.08 |
자바 14일차 - Map인터페이스, 내부 클래스, 람다식, 스트림 (0) | 2020.04.06 |
자바 13일차 - 컬렉션 프레임워크(List, LinkedList, Set, HashSet, TreeSet, Comparator (0) | 2020.04.03 |
자바 12일차 - String, StringBuffer, StringBuilder, Wrapper클래스 제네릭 클래스, 제네릭 메서드 (0) | 2020.04.02 |