JAVA/Modern JAVA

[MODERN JAVA] 동작 파라미터화 - Comparator,Runnable,Callable

IT록흐 2023. 1. 25. 00:28
반응형

 

 

 

 

[MODERN JAVA] 동작 파라미터화 - 익명 클래스(Anonymous Class)

[MODERN JAVA] 동작 파라미터화 - 전략 디자인 패턴 ( Strategy Pattern ) 변화에 대처 가능한 코드를 짜려면 어떻게 해야할까? 컴파일에 결정되는 코드가 아닌 런타임에 결정되는 코드를 짜야 한다. 대표

lordofkangs.tistory.com

 

 

지난 포스팅에서 동적파라미터화를 구현하기 위해 익명클래스를 이용해보았다. 이번 포스팅에서는 익명클래스를 사용하여 동적파라미터화를 구현한 대표적인 예시들을 알아보겠다.

 

 

Comparator 

List 클래스는 sort 메소드를 갖는다. List 자료구조 안 객체를 정렬하는 메소드인데, 정렬 기준이 되는 '소스'를 파라미터로 넘기는 동적 파라미터화가 구현되어 있다. 이때 사용되는 인터페이스가 Comparator 인터페이스이다.

 

    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>(); // List 자료구조 생성

        apples.add(new Apple("RED",9)); // 객체 add
        apples.add(new Apple("GREEN",7)); // 겍체 add
        apples.add(new Apple("BLUE",11)); // 객체 add
		
        //  익명클래스를 활용하여 동적파라미터화 구현
        apples.sort(new Comparator<Apple>() {
            @Override // 비교 로직 정의
            public int compare(Apple o1, Apple o2) {
                return o1.getColor().compareTo(o2.getColor()); //compareTo 메소드 : 유니코드를 기준으로 문자열을 비교, 동일 : 0, 작으면 음수, 크면 양수
            }
        });

        System.out.println("apples.toString() = " + apples.toString());
        //출력 결과 : [Apple{color='BLUE', weight=11}, Apple{color='GREEN', weight=7}, Apple{color='RED', weight=9}]
    }

 

BLUE, GREEN, RED .. B,G,R 순으로 정렬되었다.  정렬 기준은 요구사항에 따라 언제든 변경될 수 있다. 이때 동적 파라미터화로 구현하면 변화에 대응이 가능해진다. 

 

 

Runnable

Thread 생성시 어떤 로직을 run할 것 인지는 요구사항에 따라 언제든 변경될 수 있다. 그러므로 run 로직을 다른 객체(Runnable)로 분리하여 동적 파라미터로 로직을 받으면 변화에 대응 가능한 코드를 구현할 수 있다. 

public class RunnableMain {

    public static void main(String[] args) {
        // 스레드 생성 Runnable 익명 클래스 객체로 로직 전달하기
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Runnable 객체 실행!!!!!");
            }
        });

        t.run(); // 실행!
    }
}

 

 

Callable

스레드풀 생성 시, 스레드는 ExecutorService가 생성한다. 이때 스레드가 수행할 업무(Task)는 개발자가 파라미터로 넘겨주어야 하는데, 이때 사용하는 인터페이스가 Callable 인터페이스이다. 스레드가 수행할 업무는 요구사항에 따라 언제든 변경가능하므로 이와같이 동적 파라미터를 통해 전달한다. 

 

public class CallableMain {
    public static void main(String[] args) {
        ExecutorService es = Executors.newCachedThreadPool(); //  스레드 생성이 필요할 때마다 스레드를 생성하는 스레드풀
        
        //Runnable이 아닌 Callable 익명클래스 사용 
        //스레드는 ExecutorService가 생성하고 스레드가 수행할 업무(Task)는 Callable 객체를 통해 전달 ( 동적 파라미터화 )
        Future<String> threadName = es.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("스레드 :  " + Thread.currentThread().getName());
                return Thread.currentThread().getName();
            }
        });
    }
}

 

 

 


 

 

 

정렬하는 로직이나 스레드의 업무는 요구사항에 따라 언제든 변경가능하다. 그러므로 언제든 1회적이고 언제든 수정 가능한 로직은 익명 클래스를 이용하여 동적 파라미터로 전달하면 된다. 

 

하지만

 

익명클래스는 코드가 너무 복잡하다. 한눈에 봐도 소스가 지저분해 보인다. JAVA에서는 익명클래스의 이런 문제를 해결하기 위해 '람다'를 도입하였다. 다음 포스팅에서는 람다를 다루어 보겠다. 

 

 

 


 

 

참고자료

 

모던 자바 인 액션 - YES24

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴

www.yes24.com

 

반응형