[java] 스택을 이용한 플러그인 시스템 구현하기

플러그인 시스템은 소프트웨어의 확장성과 유연성을 높이는데 중요한 요소입니다. 스택은 이러한 플러그인 시스템을 구현하는 데 유용한 자료구조입니다. 이번 글에서는 자바의 스택을 이용하여 간단한 플러그인 시스템을 구현하는 방법을 알아보겠습니다.

스택(Stack)이란?

스택은 후입선출(LIFO, Last-In-First-Out) 원칙에 따라 요소를 저장하는 자료구조입니다. 가장 최근에 삽입된 요소가 가장 먼저 삭제되는 특징을 갖고 있습니다. 스택에 요소를 추가하는 작업을 푸시(push)라고 하고, 요소를 삭제하는 작업을 팝(pop)이라고 합니다.

플러그인 시스템을 위한 스택 구현하기

아래는 자바로 간단한 스택 클래스를 구현하는 예시입니다.

public class Stack<T> {
    private List<T> stack;

    public Stack() {
        stack = new ArrayList<>();
    }

    public void push(T element) {
        stack.add(element);
    }

    public T pop() {
        if (isEmpty()) {
            throw new NoSuchElementException("Stack is empty");
        }

        return stack.remove(stack.size() - 1);
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

    public int size() {
        return stack.size();
    }
}

위의 코드에서는 제네릭(Generic)을 사용하여 임의의 타입의 요소를 저장할 수 있는 스택 클래스를 구현하였습니다. push 메소드를 이용하여 요소를 스택에 추가하고, pop 메소드를 이용하여 마지막에 추가된 요소를 꺼낼 수 있습니다. isEmpty 메소드는 스택이 비어있는지 여부를 확인하고, size 메소드는 스택의 크기를 반환합니다.

플러그인 시스템 구현하기

위에서 구현한 스택을 이용하여 간단한 플러그인 시스템을 구현해보겠습니다. 아래는 Plugin 인터페이스와 플러그인 클래스의 예시입니다.

public interface Plugin {
    void execute();
}

public class PluginA implements Plugin {
    @Override
    public void execute() {
        System.out.println("Plugin A is executed");
    }
}

public class PluginB implements Plugin {
    @Override
    public void execute() {
        System.out.println("Plugin B is executed");
    }
}

위의 코드에서는 Plugin 인터페이스를 정의하고, 이를 구현한 PluginA와 PluginB 클래스를 작성하였습니다. 각 플러그인 클래스는 execute 메소드를 구현하고 있습니다.

이제 위에서 구현한 스택을 이용하여 플러그인 시스템을 구현하는 코드를 작성해보겠습니다.

public class PluginSystem {
    private Stack<Plugin> pluginStack;

    public PluginSystem() {
        pluginStack = new Stack<>();
    }

    public void registerPlugin(Plugin plugin) {
        pluginStack.push(plugin);
    }

    public void executeAllPlugins() {
        while (!pluginStack.isEmpty()) {
            pluginStack.pop().execute();
        }
    }
}

위의 코드에서는 PluginSystem 클래스를 작성하여 플러그인을 등록하고, 등록된 플러그인을 실행하는 기능을 구현하였습니다. registerPlugin 메소드를 이용하여 플러그인을 스택에 등록하고, executeAllPlugins 메소드를 이용하여 스택에 등록된 플러그인을 순차적으로 실행합니다.

플러그인 시스템 사용 예시

아래는 위에서 작성한 플러그인 시스템을 사용하는 예시입니다.

public class Main {
    public static void main(String[] args) {
        PluginSystem pluginSystem = new PluginSystem();

        PluginA pluginA = new PluginA();
        PluginB pluginB = new PluginB();

        pluginSystem.registerPlugin(pluginA);
        pluginSystem.registerPlugin(pluginB);

        pluginSystem.executeAllPlugins();
    }
}

위의 코드에서는 PluginSystem 객체를 생성하고, PluginA와 PluginB 객체를 생성하여 플러그인 시스템에 등록합니다. 그 후, executeAllPlugins 메소드를 이용하여 등록된 플러그인을 실행합니다. 실행 결과는 아래와 같이 출력됩니다.

Plugin A is executed
Plugin B is executed

이처럼 스택을 이용하여 간단한 플러그인 시스템을 구현할 수 있습니다. 플러그인 시스템은 많은 소프트웨어에서 중요한 기능이므로, 스택을 활용하는 플러그인 시스템을 구현하는 방법을 익혀두는 것이 유용합니다.

참고 자료