Java 18

[Java] Collector 구현하기

직접 Collector를 구현해서 스트림에 적용할 수 있다. 컬렉터를 직접 구현한다는 것은 Collector 인터페이스를 구현한다는 것을 의미한다. Collector 인터페이스는 아래와 같이 정의되어 있다. public interface Collector { Supplier supplier(); BiConsumer accumulator(); BinaryOperator combiner(); Function finisher(); Set characteristics(); //컬렉터의 특성이 담긴 Set을 반환 ''' } 직접 구현해야 하는 것은 위의 5개 메서드이다. chracteristics()를 제외하면 모두 반환 타입이 함수형 인터페이스이므로 모두 람다식을 작성해 주어야 한다. supplier() 작업 ..

Java 2022.09.18

[Java] 스트림의 collect()와 세부 메서드

이번 내용은 스트림에 대한 심화 내용이라고 할 수 있기 때문에 기본적인 내용은 아래 글을 참고하는게 좋다. [Java] 스트림(Stream) - 특징, 파이프라인, 메서드 총정리 [Java] 스트림(Stream) - 특징, 파이프라인, 메서드 총정리 지금까지 많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해서 코드를 작성했다. 그러나 이런 방식으로 작성된 코드는 너무 길고 ta-mi.tistory.com collect()는 스트림의 요소를 수집하는 최종 연산으로 리듀싱(reducing)과 유사하다. collect()가 스트림의 요소를 수집하려면, 어떻게 수집할 것인가에 대한 방법이 정의되어 있어야 하는데, 이 방법을 정의한 것이 바..

Java 2022.09.18

[Java] 스트림(Stream) - 특징, 파이프라인, 메서드 총정리

지금까지 많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해서 코드를 작성했다. 그러나 이런 방식으로 작성된 코드는 너무 길고 알아보기 힘들며, 데이터 소스마다 다른 방식으로 다뤄야 한다는 단점이 있다. 비록 Collection이나 Iterator와 같은 인터페이스를 이용해서 컬렉션을 다루는 방식으로 표준화했지만, 그것보다 더 깔끔하게 사용 가능한 것이 바로 스트림(Stream)이다. 스트림(Stream)이란? 스트림은 데이터 소스를 추상화하고 데이터를 다루는데 자주 사용이 되는 메서드들을 정의해 두었다. 데이터 소스를 추상화했다는 것은 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다..

Java 2022.09.16

[Java] Optional<T>와 Optional 클래스 메서드

Optional란? Optional은 지네릭 클래스로 T 타입의 객체를 감싸는 래퍼 클래스이다. 그래서 Optional타입의 객체는 모든 타입의 참조변수를 담을 수 있다. java.util.Optional은 JDK1.8부터 추가되었다. 스트림의 최종 연산 결과 타입이 Optional인 경우가 있다. 이때 Optional을 사용하면 최종 연산의 결과를 그냥 반환하는게 아니라 Optional 객체에 담아서 반환하다. 이렇게 객체에 담아서 반환을 하면, 반환된 결과가 null인지 매번 if문으로 체크하는 대신 Optional에 정의된 메서드를 통해서 처리할 수 있다. 즉, NullPointerException이 발생하지 않는 간결하고 안전한 코드를 작성하는 것을 가능하게 해준다. 기본형 Optional Opt..

Java 2022.09.16

[Java] 함수형 인터페이스(Functional Interface) - 매개변수, 형 변환, 변수 참조, function 패키지

함수형 인터페이스는 람다식과 밀접한 관련이 있는 내용이다. 람다식을 잘 모르거나 다시 복습을 원한다면 아래 글을 참고하면 된다. 람다식(Lambda expression) - 생성 규칙 [Java] 람다식(Lambda expression) - 생성 규칙 자바가 등장한 이후로 자바가 더 이상 예전의 자바가 아니라는 말을 만들어낸 두 가지 변화가 있다. 바로 JDK1.5의 지네릭스(generics)의 등장이고, 다른 하나는 JDK 1.8(자바 8)부터 추가된 람다식이다 ta-mi.tistory.com 함수형 인터페이스(Functional Interface)란? 자바에서는 모든 메서드는 클래스 내에 포함되어야 한다. 그렇다면 람다식은 어떤 클래스에 포함이 되어 있는지 생각해 볼 필요가 있다. 람다식에 관한 글에..

Java 2022.09.15

[Java] 람다식(Lambda expression) - 생성 규칙 / 메서드 참조

자바가 등장한 이후로 자바가 더 이상 예전의 자바가 아니라는 말을 만들어낸 두 가지 변화가 있다. 바로 JDK1.5의 지네릭스(generics)의 등장이고, 다른 하나는 JDK 1.8(자바 8)부터 추가된 람다식이다. 특히 자바는 람다식을 추가하면서 객체지향 언어인 동시에 함수형 언어가 되었다. 즉, 함수형 언어의 장점을 자바에 적용한 것이라고 할 수 있다. 람다식이란? 람다식(lamda expression)은 메서드를 하나의 식(expression)으로 표현한 것이다. 람다식을 사용하면 함수를 간단하면서도 명확한 식으로 표현할 수 있게 해준다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환 값이 없어지므로, 람다식을 '익명 함수(anonymous function)'라고도 한다. 자바에서는 메서드를 ..

Java 2022.09.15

[Java] Comparator와 Comparable

Arrays.sort()는 기본으로 오름차순 정렬을 해준다. 오름차순 정렬이 가능한 이유는 Character 클래스의 comparable을 오름차순으로 정렬하도록 구현했기 때문이다. Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들(Wrapper 클래스, String, Date, File)과 같은 것들이며 기본적으로 오름차순으로 정렬되도록 구현되어 있다. 즉, Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미한다. Comparable : 기본 정렬 기준을 구현하는 데 사용한다. java.lang 패키지에 존재한다. Compar..

Java 2022.09.14

[Java] Arrays 클래스의 메소드

Arrays 클래스는 배열을 다루는데 유용한 메서드가 정의되어있다. 같은 기능의 메서드가 매개변수만 다르게 오버로딩 되어 있기 때문에 '자바의 정석'을 보며 간단하게 함수의 기능을 정리해 보았다. 배열의 복사 copyOf() : 배열 전체 복사해서 새로운 배열 만들어 리턴한다. copyOfRange() : 배열의 일부 복사해서 새로운 배열 만들어 리턴한다. 배열 채우기 fill() : 배열의 모든 요소를 지정된 값으로 채운다. setAll() : 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 메서드 호출 시 함수형 인터페이스를 구현한 객체를 매개변수로 지정하던가 아니면 람다식을 지정한다. 배열의 정렬과 검색 sort() : 배열을 기본인 오름차순으로 정렬한다. binarySearch() ..

Java 2022.09.14

[Java] Iterator, ListIterator,Enumeration 인터페이스와 해당 메서드

컬렉션의 요소에 접근하는 데 사용되는 인터페이스인 Iterator, Listlterator, Enumeration에 대해서 알아본다. Enumberation은 Iterator의 구버전이며 ListIterator는 Iterator의 기능이 향상된 버전이다. Iterator 컬렉션 프레임웍에서는 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화했다. 컬렉션에 저장된 각 요소에 접근하는 기능을 가진 Iterator 인터페이스를 정의하고, Collection 인터페이스에는 Iterator(Iterator를 구현한 클래스의 인스턴스)를 반환하는 iterator()를 정의하고 있다. iterator()는 Collection 인터페이스에 정의된 메서드이므로 Collection 인터페이스의 자손인 List와 Set에도 ..

Java 2022.09.14

[Java] 예외 클래스 계층 구조, 사용자 예외 만들기

프로젝트를 하면서 느낀 점은 예외처리가 정말로 중요하다는 점이다. 컴파일 에러의 경우는 컴파일 시에 잡히기 때문에 큰 문제가 되지 않지만 만약 런타임 에러가 난다면..? 실제로 사용되는 서버에서 런타임 에러가 발생하여 서버가 죽어버린다면 경우에 따라 정말 심각한 상황을 초래할 수 있다. 그러니 예외 처리에 대해 제대로 공부해 런타임 에러를 방지하기 위해 실행 도중 발생할 수 있는 모든 경우에 대해 처리를 해주어야 한다. 자바에서는 실행(runtime) 시에 발생할 수 있는 프로그램 오류를 '에러(error)'와 '예외(exception)'로 구분한다. Error 컴파일 에러 : 컴파일 시에 발생하는 에러 런타임 에러 : 실행 시(런타임)에 발생하는 에러 논리적 에러 : 실행은 되지만, 의도와 다르게 동작..

Java 2022.09.13