함수적 스타일의 람다식을 작성하는 방법


(타입 매개변수, ...) -> { 실행문; ...}           |             (int a) -> { System.out.println(a); }


매개 타입은 런타임시에 대입 값에 따라 자동으로 인식하기 때문에 생략 가능

(a)   ->   { System.out.println(a) };


하나의 매개변수만 있을 경우에는 괄호() 생략 가능

              a   ->  { System.out.println(a); }


하나의 실행문만 있다면 중괄호 {} 생략 가능

    a -> System.out.println(a)


매개변수가 없다면 괄호 ()를 생략할 수 없음

         () -> { 실행문; ... }


리턴값이 있는 경우, return 문을 사용

(x ,y) -> { return x + y };


중괄호 {}에 return 문만 있을 경우, 중괄호를 생략 가능

      (x, y) -> x + y 




함수적 프로그램

y = f(x) 형태의 함수로 구성된 프로그래밍 기법

데이터를 매개값으로 전달하고 결과를 받는 코드들로 구성

객체 지향 프로그래밍 보다는 효율적인 경우

         대용량 데이터의 처리시에 유리
데이터 포장 객체를 생성후 처리하는 것 보다, 데이터를 바로 처리하는 것이 속도에 유리
멀티코어 cpu에서 데이터를 병렬 처리하고 취합할 때 객체보다는 함수가 유리

이벤트 지향 프로그래밍(이벤트가 발생하면 핸들러 함수 실행)에 적합
반복적인 이벤트 처리는 핸들러 객체보다는 핸들러 함수가 적합


현대적 프로그래밍 기법

객체지향 프로그래밍  + 함수적 프로그래밍


자바 8부터 함수적 프로그래밍 지원

람다식 (Lamda Expresstions)을 언어 차원에서 지공

람다 계산법에서 사용된 식을  프로그래밍 언어에 접목

익명 함수(anonymous function)을 생성하기 위한 식

(타입 매개변수, ...)  -> { 실행문; ...}


자바에서 람다식을 수용한 이유

코드가 매우 간결해진다

컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계할 수 있다.



자바는 람다식을 함수적 인터페이스(한개의 메서드를 가지고 있는 메서드)의 익명 구현 객체로 취급

어떤 인터페이스를 구현할지는 대입되는 인터페이스에 달려이있다.

 Runnable runnable = () -> { ... }         ---------람다식
f

Runnable runnable = new Runnable(){
public void run() {...}
};


제네릭타입을 부모 클래스로 사용할 경우

타입 파라미터는 자식 클래스에도 기술해야 한다.

public class ChildProduct<T, M> extends Product<T, M> { ... }

추가적인 타입 파라미터를 가질 수 있다.

public class ChaildProduct<T, M, C> extends Product<T , M > { ... }


제네릭 인터페이스를 구현할 경우

타입 파라미터는  구현 클래스에도 기술해야 한다.

public class StorageImpl<T> implement Storage<T> { ... }

 


exam

public class 제품<T, M> {
private T 종류;
private M 모델;

public T get종류() { return 종류; }

public void set종류(T 종류) {
this.종류 = 종류;
}

public M get모델() {
return 모델;
}

public void set모델(M 모델) {
this.모델 = 모델;
}
}


class Tv{}



public class 자식제품<K,V,C> extends 제품<K, V> {
private C 회사;

public C get회사() {
return 회사;
}

public void set회사(C 회사) {
this.회사 = 회사;
}
}


public interface 보관소<T> {
public void 추가(T item, int index);

public T get(int index);
}



public class 보관소Impl<T> implements 보관소<T> {

private T[] array;

public 보관소Impl(int capacity) {
this.array = (T[]) (new Object[capacity]);
}

@Override
public void 추가(T item, int index) {
array[index] = item;
}

@Override
public T get(int index) {
return array[index];
}
}



public class 자식제품그리고보관소Example {
public static void main(String[] args) {

자식제품<Tv, String, String> 제품 = new 자식제품<>();

제품.set종류(new Tv());
제품.set모델("스마트티비");
제품.set회사("삼성");


보관소<Tv> 보관소 = new 보관소Impl<>(100);

보관소.추가(new Tv(), 0);
Tv tv = 보관소.get(0);

}
}


'JAVA > JAVA' 카테고리의 다른 글

람다식 기본 문법  (0) 2018.06.09
람다식이란?  (0) 2018.06.09
제네릭(Generic) 와일드카드 타입  (0) 2018.06.09
제네릭(Generic) 메소드  (0) 2018.06.08
제네릭(Generic)이란 ? 제네릭 타입이란?  (0) 2018.06.08

+ Recent posts