Compy's Blog
545 words
3 minutes
[Minecraft] 메인 인스턴스를 효과적으로 관리하자
2024-10-10
이 포스트에서는

JAVA 언어에 대한 기본적인 이해와 OOP를 코드에 적용할 수 있는 정도의 실력이 기본적으로 요구됩니다.

버킷에서 anyMethod(Plugin plugin, …) 요런 모양의 함수들을 많이 보게 될 것이다. 처음 접하는 사람은 ”????????? plugin은 뭐야?” 이럴 텐데 이때 우리는 JavaPlugin 즉 이것을 상속받은 MainClass의 인스턴스를 넘겨주면 되는 것이다.

아니 근데 이것을 그냥 넘겨줄 것인가? 자 한번 비교해보자

일단 instance를 사용할 클래스 하나를 만들어 주겠다.

이름은 ListenerManagerEventListener의 역할을 하도록 해주겠다.

public class ListenerManager implements Listener {

    private Main instance;

    public ListenerManager(Main instance){
        this.instance = instance;
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event){
        Player p = event.getPlayer();
        for(Player player : Bukkit.getOnlinePlayers()){
            if(player.equals(p)) continue;
            p.hidePlayer(this.instance, player);
        }
    }

}

hide


이렇게 해줌으로써 한 유저가 서버에 접속하게 되면, 다른 유저들에게는 보이지 않게되도록 만들었다. 이때 싱글톤을 사용하지 않은 instance는 지금처럼 하나하나 각 인스턴스마다 연결해줘야하는 엄청나게 불편함이 존재한다.(또 성능적으로도 좋지 않다, 제일 안 좋은 것은 미적으로 안 좋다.)

@Override
public void onEnable() {
    PluginManager pm = Bukkit.getPluginManager();
    ListenerManager listenerManager = new ListenerManager(this);
    pm.registerEvents(listenerManager, this);
}

이렇게 작성할 수 있겠다. 그런데 만약 인스턴스를 사용하는 클래스가 많고, 여러곳에서 많이 쓰일때는??

엄청나게 안 좋은 코딩의 시작인 것이다.

그래서 우리는 더욱 간단한 방법을 사용한다.

public final class Main extends JavaPlugin{
    private static Main instance;
    @Override
    public void onEnable() {
        instance = this;
        ListenerManager listenerManager = new ListenerManager();
        pm.registerEvents(listenerManager, this);
        
    }
    public static Main getInstance(){
        return instance;
    }
}

이렇게 작성 후 리스너도 바꿔준다.

public class ListenerManager implements Listener {
    @EventHandler
    public void onJoin(PlayerJoinEvent event){
        Player p = event.getPlayer();
        for(Player player : Bukkit.getOnlinePlayers()){
            if(player.equals(p)) continue;
            p.hidePlayer(Main.getInstance(), player);
        }
    }
}

이렇게 해주면 가독성도 높아지고, 아주 좋은 코딩을 할 수 있다.



다음에는 이제 스케쥴링에 대해서 배우도록 하겠다.(with scoreboard)

[Minecraft] 메인 인스턴스를 효과적으로 관리하자
https://compy07.github.io/Blog/posts/development/bukkit/util/maininstance/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2024-10-10