본문 바로가기

Java 길찾기

[Java] 표준 API의 함수적 인터페이스 - Operator, Predicate Operator 함수적 인터페이스 Operator 함수적 인터페이스는 Function과 동일하게 매개 변수와 리턴값이 있는 applyXXX() 메소드를 가지고 있다. 하지만 이 메소드들은 매개값을 리턴값으로 매핑(타입 변환)하는 역할보다는 매개값을 이용해서 연산을 수행한 후 동일한 타입으로 리턴값을 제공하는 역할을 한다. 매개 변수의 타입과 수에 따라서 아래와 같은 Operator 함수적 인터페이스들이 있다. 인터페이스명 추상 메소드 설명 BinaryOperator T apply(Tt, Tt) T와 T를 연산한 후 T 리턴 UnaryOperator T apply(Tt) T를 연산한 후 T 리턴 DoubleBinaryOperator double applyAsDouble(double, double) 두 개의.. 더보기
[Java] 표준 API의 함수적 인터페이스 - Suplier, Function Supplier 함수적 인터페이스 Supplier 함수적 인터페이스의 특징은 매개 변수가 없고 리턴값이 있는 getXXX() 메소드를 가지고 있다. 이 메소드들은 실행 후 호출한 곳으로 데이터를 리턴하는 역할을 한다. 리턴 타입에 따라서 아래와 같은 Supplier 함수적 인터페이스들이 있다. 인터페이스명 추상 메소드 설명 Supplier T get() T 객체를 리턴 BooleanSupplier boolean getAsBoolean() boolean 값을 리턴 DoubleSupplier double getAsDouble() double 값을 리턴 IntSupplier int getAsInt() int 값을 리턴 LongSupplier long getAsLong() long 값을 리턴 Supplier 인.. 더보기
[Java] 표준 API의 함수적 인터페이스 - Consumer 자바에서 제공되는 표준 API에서 한 개의 추상 메소드를 가지는 인터페이스들은 모두 람다식을 이용해서 익명 구현 객체로 표현이 가능하다. 예를 들어 스레드의 작업을 정의하는 Runnable 인터페이스는 매개 변수와 리턴값이 없는 run() 메소드만 존재하기 때문에 다음과 같이 람다식을 이용해서 Runnable 인스턴스를 생성시킬 수 있다. // RunnableExample.java -- 함수적 인터페이스와 람다식 public class RunnableExample { public static void main(String[] args) { Runnable runnable = () -> { for(int i=0; i { for(int i=0; iConsumer Supplier - 매개값은 없고, 리턴값은 .. 더보기
[Java] 클래스 멤버와 로컬 변수 사용 람다식의 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있다. 클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따른다. 자세한 내용을 알아보기로 하자. 클래스의 멤버 사용 람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용할 수 있다. 하지만 this 키워드를 사용할 때에는 주의가 필요하다. 일반적으로 익명 객체 내부에서 this는 익명 객체의 참조이지만, 람다식에서 this는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행한 객체의 참조이다. 다음 예제는 람다식에서 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 방법을 보여주고 있다. 중첩 객체 Inner에서 람다식을 실행했기 때문에 람다식 내부에서의 thi.. 더보기
[Java] 타겟 타입과 함수적 인터페이스 람다식의 형태는 매개 변수를 가진 코드 블록이기 때문에 마치 자바의 메소드를 선언하는 것처럼 보여진다. 자바는 메소드를 단독으로 선언할 수 없고 항상 클래스의 구성 멤버로 선언하기 때문에 람다식은 단순히 메소드를 선언하는 것이 아니라 이 메소드를 가지고 있는 객체를 생성해 낸다. 그럼 어떤 타입의 객체를 생성하는 것일까? 다음 코드를 보자. 인터페이스 변수 = 람다식; 람다식은 인터페이스 변수에 대입된다. 이 말은 람다식은 인터페이스의 익명 구현 객체를 생성한다는 뜻이 된다. 인터페이스는 직접 객체화할 수 없기 때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다. 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 .. 더보기
[Java] 람다식 기본 문법 함수적 스타일의 람다식을 작성하는 방법은 다음과 같다. (타입 매개변수, ...) -> {실행문; ... } (타입 매개변수, ...)는 오른쪽 중괄호 { } 블록을 실행하기 위해 필요한 값을 제공하는 역할을 한다. 매개 변수의 이름은 개발자가 자유롭게 줄 수 있다. '->' 기호는 매개 변수를 이용해서 중괄호 { }를 실행한다는 뜻으로 해석하면 된다. 예를 들어 int 매개 변수 a의 값을 콘솔에 출력하기 위해 다음과 같이 람다식을 작성할 수 있다. (int a) -> { System.out.println(a); } 매개 변수 타입은 런타임 시에 대입되는 값에 따라 자동으로 인식될 수 있기 때문에 람다식에서는 매개 변수의 타입을 일반적으로 언급하지 않는다. 그래서 위 코드는 다음과 같이 작성할 수 있다.. 더보기
[Java] 람다식이란? 자바는 객체 지향 프로그래밍이 소프트웨어 개발의 주요 패러다임이었던 1990년대에 디자인되었다. 객체 지향 프로그래밍이 나오기 오래전부터 Lisp 또는 Scheme과 같은 함수적 프로그래밍 언어들이 있었는데, 학계를 제외하고는 현업에서 큰 호응을 받지 못했다. 최근 들어 함수적 프로그래밍이 다시 부각되고 있는데, 병렬 처리와 이벤트 지향 프로그래밍에 적합하기 때문이다. 그래서 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 될 수 있도록 프로그램 개발 언어가 변하고 있다. 자바는 함수적 프로그래밍을 위해 자바 8부터 람다식(Lambda Expressions)을 지원하면서 기존의 코드 패턴이 많이 달라졌다. 람다식은 수학자 알론조 처치(Alonzo Church)가 발표한 .. 더보기
[Java] 제네릭 타입의 상속 구현 제네릭 타입도 다른 타입과 마찬가지로 부모 클래스가 될 수 있다. 다음은 Product 제네릭 타입을 상속해서 ChildProduct 타입을 정의한다. public class ChildProduct extends Product { ... } 자식 제네릭 타입은 추가적으로 타입 파라미터를 가질 수 있다. 다음은 세 가지 타입 파라미터를 가진 자식 제네릭 타입을 선언한 것이다. public class ChildProduct extends Product { ... } // Product.java -- 부모 제네릭 클래스 public class Product { private T kind; private M model; public T getKind() { return this.kind; } public M g.. 더보기