2장. 동작을 파라미터
about. Book/ModernJavaInAction

2장. 동작을 파라미터

#1. 동작화 파라미터 

동작화 파라미터를 사용하면 자주 바뀌는 요구사항에 대해 효과적을 대체 할 수 있다.

 

어떤 메서드에 요구사항에 따라 if문에 들어가는 조건만 바뀌는 코드가 있다고 가정해보자. 그렇다면 이 코드를 조건이 바뀔때마다 추가해서 사용하는 것은 비효율적이다. 그럼 메서드로 따로 분리해서 사용한다면? 그것도 마찬가지다. 결론적으로 이야기하면 전략패턴을 사용하는 것이다. 

 

해당 메서드를 인터페이스를 통해 추상화한다.(내부구현이 정해져있지 않다.) 그리고 조건에 맞는 구현체를 만든다. 필요한 조건에 따라 구현체를 만들어서 메서드에 제공하면 메서드는 인터페이스에 대해서만 의존하고 있기때문에 어떤 조건을 가진 구현체가 들어오든 실행된다. 

 

이제 이 메서드를 고칠일도 추가할 일도 없다. 이 메서드는 구현체만 받으면 조건을 처리할 수 있고 행동을 마무리할 수 있다.  

 

하지만 이와 같은 방식이 너무 좋긴한데 새로운 조건이 생길때마다 매번 조건에 맞는 구현체를 만들어줘야한다는게 번거로운 작업이된다.

이를 해결할 수 있는 방법이 익명 클래스를 이용하는 것이다. 아래와 같은 코드를 이용하는 것과 같다. 전제는 행위를 추상화한 인터페이스ApplePredicate가 있다는 가정하에 시작한다. 

ApplePredicate applefilter = new ApplePredicate(){
	public boolean test(Apple apple){
    	return apple.getWeight() > 150;
    }
}

이렇게 구현하고 나면 구현체를 만들 필요가 없다. 하지만 여전히 코드를 추가적으로 많이 작성해야하고 조건이 변경될 때마다 new 연산자서부터 메서드의 시그니쳐까지 만들어야한다. 

 

람다식을 사용하면 하나의 메서드를 처리하는데 굉장히 쉬워진다. 

 

List<Apple> result = filterApples(inventory, new AppleFilter(){
	public boolean test(){
    		구현 코드
    }
});

List<Apple> result = filterApples(inventory, (Apple apple) -> RED.equals(apple.getColor()));

코드가 엄청 짧아졌다. 

 

한가지 실사용 예제를 보면 Runnable 인터페이스를 볼 수 있다. 이 인터페이스는 함수형 인터페이스이다. 함수형 인터페이스는 하나의 추상 메서드만 가지고 있으며 @FunctionalInterface라는 어노테이션을 가지고 있다. 

 

기존에 쓰레드를 사용하려면 

 

Thread tr = new Thread(new Runnalbe() {
		public void run(){
        	System.out.println();
        }
}
);

위 처럼 인명 클래스 방식으로 생성해서 사용했다면 람다를 사용할 수 있는 이 시점에는

 

Thread tr = new Thread(()-> System.out.prinln());

처럼 사용이 가능하다. 

 

쓰레드의 생성자 중 하나

위와 같이 생성자 중에 Runnable을 매개변수로 받는 생성자가 존재하기 때문에 위처럼 받는게 가능하다. 함수형 인터페이스를 사용하는 생성자가 이 친구 뿐이기 때문이다. 

 

 

#마치며

'about. Book > ModernJavaInAction' 카테고리의 다른 글

3. 람다 표현식의 실사용  (0) 2022.07.08
1장. 자바가 계속 쓰여지는 이유  (0) 2022.07.06