엄청 헷갈린다.
하나씩 해보자.
숫자 세가지를 받고, 그 값들을 조합해 문자열로 출력하고 싶다면 다음과 같이 작성한다.
인터페이스에서 추상메소드에 들어갈 타입을 미리 선언하지 않는다. 대신 제네릭을 이용하여 다음과 같이 작성한다.
interface Func<T1,T2,T3,R>{
public R apply(T1 t1, T2 t2, T3 t3);
}
위 인터페이스는 어떠한 객체타입(R)으로 리턴을 받고, 입력할 파라미터는 각각 어떤타입(T1,T2,T3)를 입력받는다.
public class GenericExample {
public static void main(String[] args) {
Func<Integer,Integer,Integer,String> func = (a , b , c) -> String.valueOf((a+b+c)*2); //12
System.out.println(func.apply(1,2,3));
}
}
작성한 인터페이스를 람다식으로 구현해냈다. 이때, Func에 들어갈 리턴값과 파라미터를 선언해주어야 한다.
이 때 다음과 같이 메소드를 만들면 람다식 또한 파라미터로 받을 수 있다.
public class GenericExample {
public static void main(String[] args) {
println(2,3,4,(a,b,c) -> String.valueOf(a+b+c));
}
public static <T1,T2,T3> void println(T1 t1, T2 t2, T3 t3, Func<T1, T2, T3, R> func) {
Syetem.out.println(func.apply(t1,t2,t3)); // 9
}
}
interface Func<T1,T2,T3,R>{
public R apply(T1 t1, T2 t2, T3 t3);
}
여기서 메소드는
타입 파라미터(리턴할 값과 매개변수에서 타입을 설정) || 리턴할 타입 || 변수명 || 매개변수
순이다.
이번에는 단지 덧셈을 하는 함수이다. 다만 문자열일 때는 리턴값이 문자로 숫자일 때는 리턴값이 숫자로 리턴된다.
public class GenericExample {
public static void main(String[] args) {
System.out.println(sum("2","3","4",(a,b,c) -> a+b+c)); //234
System.out.println(sum(2,3,4,(a,b,c) -> a+b+c)); //9
}
public static <T1,T2,T3,R> R sum(T1 t1, T2 t2, T3 t3, Func<T1, T2, T3, R> func) {
return func.apply(t1,t2,t3);
}
}
interface Func<T1,T2,T3,R>{
public R apply(T1 t1, T2 t2, T3 t3);
}
'Language > Java' 카테고리의 다른 글
[Intellij] 라이브러리 설치하기 (0) | 2019.05.13 |
---|---|
Stream Lombok 연습 예제 (0) | 2019.04.17 |
[Java8]Functional Interface (0) | 2019.04.14 |
[Java8] Strategy Pattern, FP, 1급 객체 (0) | 2019.04.14 |
[Java]Collection 객체 응용(2) (0) | 2019.04.14 |