웹 개발 메모장

[자바] 매개 변수에 함수를 넣어봅시다. 본문

옛날../자바

[자바] 매개 변수에 함수를 넣어봅시다.

도로롱주 2018. 7. 10. 13:38




c.calculation((a, b)->a+b, 4, 2)


자바8 부터 메소드의 파라미터로 함수를 넘길 수 있습니다.


사칙연산 기능을 구현을 해보면서 알아볼까요?



아래와 같은 사칙연산 메소드를 가지는 Calc 클래스가 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Calc{
    public int add(int a, int b) {
        return a+b;
    }
    public int substract(int a, int b) {
        return a-b;
    }
    public int multiple(int a, int b) {
        return a*b;
    }
    public int division(int a, int b) {
        return a/b;
    }
}
cs



이런식으로 객체 생성메소드 호출을 통해 사용하면 되겠죠?


1
2
3
4
5
6
Calc c = new Calc();

c.add(11);
c.substract(11);
c.multiple(12);
c.division(42);
cs





Calc 클래스를 좀더 객체지향적인 형태로 구현을 해봅시다.


Calc 인터페이스를 만들고 


1
2
3
interface Calc {
    public int calculation(int a, int b);
}
cs



CalcService 클래스가 사용하는 형태로 하겠습니다.

이렇게 되면 객체를 파라미터로 받아 사용하는 형태인데요.


1
2
3
4
5
class CalcService{
    public int calculation(Calc c, int a, int b) {
        return c.calculation(a, b);
    }
}
cs



Calc 인터페이스를 implements하고 사칙연산의 기능을 구현하는 클래스들을 만들고


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Add implements Calc{
    @Override
    public int calculation(int a, int b) {
        return a+b;
    }
}
class Substract implements Calc{
    @Override
    public int calculation(int a, int b) {
        return a-b;
    }
}
class Multiple implements Calc{
    @Override
    public int calculation(int a, int b) {
        return a*b;
    }
}
class Division implements Calc{
    @Override
    public int calculation(int a, int b) {
        return a/b;
    }
}
cs



이와같이 사용하면 되겠습니다~


1
2
3
4
5
6
CalcService c = new CalcService();
 
c.calculation(new Add(), 11);
c.calculation(new Substract(), 11);
c.calculation(new Multiple(), 12);
c.calculation(new Division(), 41);
cs





간단한 기능이라 배보다 배꼽이 더 커보이는데요 자바8부터 파라미터로 함수를 넣어줄 수가 있기 때문에

위와 같이 Calc 인터페이스를 상속받는 클래스의 객체를 생성해서 파라미터로 넘기지 말고


바로 함수를 인자로 넣어봅시다.



이번엔 인터페이스와 서비스 클래스 두 개만 있으면 충분합니다.


인터페이스를 Functional 인터페이스로 사용할 것인데 그러려면 인터페이스는 한 개의 추상메소드만 포함해야 합니다.


1
2
3
4
5
6
7
8
9
interface Calc {
    public int calculation(int a, int b);
}
 
class CalcService {
    public int calculation(Calc c, int a, int b) {
        return c.calculation(a, b);
    }
}
cs



아래와 같이 익명 함수를 넣어서 사용하는 예제였습니다~


1
2
3
4
5
6
CalcService c = new CalcService();
 
c.calculation((a, b)->a+b, 11);
c.calculation((a, b)->a-b, 11);
c.calculation((a, b)->a*b, 22);
c.calculation((a, b)->a/b, 42);
cs




Comments