본문 바로가기

Languages/Java20

[Java] 스트림 (stream) (2) 스트림 파이프라인, 중간 처리 메소드 대량의 데이터를 가공해서 축소하는 것을 일반적으로 리덕션(Reduction)이라고 하는데. 데이터의 합계, 평균값, 카운팅, 최대값, 최소값 등이 대표적인 리덕션의 결과물이라고 볼 수 있다. 그러나 컬렉션의 요소를 리덕션의 결과물로 바로 집계할 수 없을 경우에는 집계하기 좋도록 필터링, 매핑, 정렬, 그룹핑 등의 중간 처리가 필요하다. 중간 처리 & 최종 처리 스트림은 데이터의 필터링, 매핑, 정렬, 그룹핑 등의 중간 처리와 합계, 평균, 카운팅, 최대값, 최소값 등의 최종 처리를 파이프라인(pipelines)으로 해결한다. 파이프라인은 여러 개의 스트림이 연결되어 있는 구조를 말한다. 파이프라인에서 최종처리를 제외하고는 모두 중간 처리 스트림이다. Stream 인터페이스에는 필터링, 매핑, 정렬 등의 .. 2022. 1. 5.
[Java] 스트림 (stream) (1) 개념과 종류 스트림이란? 자바 8부터 추가된 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식(함수적 스타일)으로 처리할 수 있도록 해주는 반복자이다. 반복자 스트림 자바 7 이전까지는 List 컬렉션에서 요소를 순차적으로 처리하기 위해 Iterator 반복자를 다음과 같이 사용해왔다. List list = Arrays.asList("홍길동", "신용권", "김자바"); Iterator iterator = list.iterator(); while(iterator.hasNext()) { String name = iterator.next(); System.out.println(name); } 위의 코드를 stream 을 사용하면 아래와 같이 바꿀 수 있다. List list = Arrays.asList("홍길동".. 2022. 1. 5.
[Java] 람다식 (4) 표준 API의 함수적 인터페이스 자바에서 제공되는 표준 API에서 한개의 추상 메소드를 가지는 인터페이스들은 모두 람다식을 이용해서익명 구현 객체로 표현이 가능하다. 예시로 스레드의 작업을 정의하는 Runnable 인터페이스는 매개 변수와 리턴값이 없는 run() 메소드만 존재하기 때문에 다음과 같이 람다식을 이용해서 Runnable 인스턴스를 실행할 수 있다. public class RunnableExample { public static void main(String[] args) { Runnable runnable = () -> { for (int i = 0; i < 10; i++) { System.out.println(i); } }; Thread thread = new Thread(runnable); thread.start();.. 2021. 12. 31.
[Java] 람다식 (3) 클래스 멤버와 로컬 변수 사용 람다식의 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있다. 클래스의 멤버는 제약 사항 없이 사용할 수 있지만, 로컬 변수는 제약 사항이 따른다. 1. 클래스 멤버 사용 람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용할 수 있다. 하지만 this 키워드를 사용할 때에는 주의가 필요하다. 일반적으로 this는 익명 객체의 참조이지만, 람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조이다. 다음 예제는 람다식에서 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 방법이다. 중접 객체 Inner에서 람다식을 실행했기 때문에 람다식 내부에서의 this는 중첩 객체 inner이다. public interfac.. 2021. 12. 30.
[Java] 람다식 (2) 타겟 타입과 함수적 인터페이스 타겟 타입과 함수적 인터페이스 자바는 메소드를 단독으로 선언할 수 없고 항상 클래스의 구성 멤버로 선언한다. 그렇기 때문에 람다식은 단순히 메소드를 선언하는 것이 아니라 이 메소드를 가지고 잇는 객체를 생성해 낸다. 어떤 타입의 객체를 생성하는 것일까? 다음 코드를 보면 인터페이스 변수 = 람다식; 람다식은 인터페이스 변수에 대입된다. 이 말은 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻이다. 인터페이스는 직접 객체화를 할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다. 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라고 한다. 1. 함수적 인터페이스(@Fun.. 2021. 12. 30.
[Java] 람다식 (1) 람다식 개념과 기본 문법 람다식 (Java8 이상) 람다식이란? 함수적 프로그래밍은 병렬 처리와 이벤트 지향 프로그래밍에 적합하다. 그래서 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 될 수 있도록 자바 8부터 람다식(Lambda Expression)을 지원한다. 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다. 람다식을 사용하면 자바 코드가 매우 간결해지고, 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있다. 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다. 람다식 -> 매개 변수를 가진 코드 블록 -> 익명 구현 객체 예를 들어 Runnable .. 2021. 12. 30.
[Java] 제네릭 (4) 제네릭 타입의 상속과 구현 제네릭 타입의 상속과 구현 제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있다. 사용 예시 public class ChildProduct extends Product {...} 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다. 세 가지 타입 파라미터를 가진 자식 제네릭 타입 선언 public class ChildProduct extends Product {...} 제네릭 클래스를 부모로 가질 수 있다. 사용 예제 부모 제네릭 클래스 // 부모 제네릭 클래스 public class Product { private T kind; private M model; public T getKind() { return this.kind; } public T getModel() { return .. 2021. 12. 28.
[Java] 제네릭 (3) 제한된 타입 파라미터, 와일드 카드 타입 제한된 타입 파라미터() 타입 파라미터에 지정되는 구체적인 타입을 제한할 필요가 종종있다. 예를 들어 숫자를 연산하는 제네릭 메소드는 매개값으로 Number 타입 또는 하위 클래스 타입(Byte, Short, Integer, Long, Double)의 인스턴스만 가져야 한다. 이때 사용할 수 있는것이 제한된 타입 파라미터이다. 제한된 타입 파라미터를 선언하려면 타입 파라미터 뒤에 extends 키워드를 붙이고 상위 타입을 명시하면 된다. 상위 타입은 클래스 뿐만 아니라 인터페이스도 가능하다. 사용 방법 public 리턴타입 메소드(매개변수,...) {...} 타입 파라미터에 지정되는 구체적인 타입은 상위 타입이거나 상위 타입의 하위 또는 구현 클래스만 가능하다. 메소드의 중괄호 {} 안에서 타입 파라미터.. 2021. 12. 28.
[Java] 제네릭 (2) 멀티 타입 파라미터, 제네릭 메소드 멀티 타입 파라미터(class, interface) 제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있다. 각 타입 파라미터를 콤마로 구분한다. 다음 예제문은 Product 제네릭 타입을 정의하고 ProductExample 클래스에서 Product 객체와 Product 객체를 생성한다. 그리고 Getter와 Setter를 호출하는 방법을 보여준다. 제네릭 클래스 // 제네릭 클래스 public class Product { private T kind; private M model; public T getKind() { return this.kind; } public M getModel() { return this.model; } public void setKind(T kind) { this.k.. 2021. 12. 28.
[Java] 제네릭 (1) 개념, 제네릭 타입(class<T>, interface<T>) 왜 제네릭을 사용해야 하는가? 제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용되므로 필수적으로 알아야 한다. 제네릭은 클래스와 인터페이스, 그리고 메소드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있도록 한다. 제네릭의 이점 1. 컴파일 시 미리 타입을 강하게 체크해서 에러를 사전에 방지할 수 있다. 2. 타입 변환(casting)을 제거한다. 비제네릭 코드는 불필요한 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미친다. java List list = new ArrayList(); list.add("Hello"); // 문자열 요소를 저장했지만, 요소를 찾아올 때는 반드시 String으로 타입변환해야함 String str = (String) list.get(0).. 2021. 12. 28.