강좌를 작성하시기 전에 우수 강좌 제도(바로가기) 를 확인해보세요.

플러그인

[마인크래프트 플러그인 제작 강의] 6강 패키지, 클래스 분리

cch 6 일 전 조회 수 33 추천 수 1


이 글은 개인 블로그에 작성한 내용을 공유하는 글 입니다.
(공유 하는 과정에서 누락된 이미지나 글이 있을 수 있습니다. )

( 해당 블로그에서 원본을 보실 수 있습니다.  https://cchplugin.tistory.com/ )



블로그글을 복사해서 붙혀넣기 시 이미지 첨부가 정상적으로 되지 않네요.

블로그 글을 참고하시는 것을 추천드립니다.

링크 : https://cchplugin.tistory.com/13




안녕하세요.


최근 시험과 사이버강의, 과제폭탄으로 인해 많이 바빠서 강의를 자주 올리지 못하네요 ㅠㅠ.





이번 강의에서는 패키지, 클래스를 분리하는 방법에 대해서 알아보겠습니다.


코드를 작성하기 전에 왜???? 패키지와 클래스를 분리하는지에 대해서 알아보겠습니다.


이유는 간단합니다.


많은 기능들을 구현하면 당연히 코드는 길어지게 되고, 코드가 길어지게 되면 수정하는데, 기능을 추가하기 어렵기 때문입니다. 


클래스와 패키지를 분리한다고 해서 기능적인 차이가 있는 것은 아니지만 좀 더 깔끔하고 보기 좋게 만들어 나중에 오류가 생겼을때 수정을 쉽게 하기 위함이라고 생각하시면 됩니다.





아직 커맨드, 이벤트, 파일, 등등 에 대해 충분히 설명하지 않았지만 먼저 패키지, 클래스를 분리해놓으면 배우시기 편하실 거라고 생각합니다.





패키지와 클래스를 분리하는 이유에 대해서 이해를 하셨다면 코드작성을 시작해보겠습니다.


https://cchplugin.tistory.com/10 에서 마무리된 코드를 기준으로 강의를 하겠습니다.


패키지와 클래스를 나누는 기준은 사람마다 다를수 있지만 저는 4가지로 나누어 보겠습니다.


1. Main

2. Command

3. Event

4. File


아래 사진과 같이 src 폴더 아래에 3개의 패키지를 추가로 만들어줍니다.


ec6cac07141ee5576354860d227c9485.jpeg


패키지와 클래스 생성하는 방법이 햇갈리신다면 https://cchplugin.tistory.com/7 강의를 참고해서 작성하시길 바랍니다.


먼저 Command 클래스를 작성해보겠습니다.


처음 클래스를 만들면 이런 형태 일 것 입니다.


ec6cac07141ee5576354860d227c9485.jpeg

아래 사진을 보시고 순서대로 따라하시면 됩니다.


아래 사진을 봐도 어떻게 하는지 모르겠다 하시는 분들은 

https://cchplugin.tistory.com/11 강의를 먼저 보고 오시길 바랍니다.

ec6cac07141ee5576354860d227c9485.jpeg


ec6cac07141ee5576354860d227c9485.jpeg


ec6cac07141ee5576354860d227c9485.jpeg


Command 클래스 작성은 여기까지 하고 다음 강의에서 command를 다루는 방법에 대해서 자세히 알려드리겠습니다.


다음은 Event 클래스를 작성해보겠습니다.


Event 클래스를 처음 만들었다면 이런 형태일 겁니다.


ec6cac07141ee5576354860d227c9485.jpeg


아래 사진을 보고 하나하나 천천히 따라해주세요. 


ec6cac07141ee5576354860d227c9485.jpeg


9e98b020d22f18b8331a568ad089a0bb.jpeg


여기 까지 하셨으면 Main 클래스에서 작성된 Event부분을 옮겨오겠습니다.


파란색 부분은 지워주시고 빨간색 부분을 Event 클래스로 옮겨주시면 됩니다.


02547daf44f3de42115b87b05529e958.jpeg


옮기고 난 후 Event 클래스는 아래와 같은 코드가 됩니다.


package com.tistory.cchplugin.cchlecture.event;

import java.util.HashMap;
import java.util.UUID;

import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

import com.tistory.cchplugin.cchlecture.Main;

public class CchEvent implements Listener {

    public static Main plugin;

    HashMap map = new HashMap();

    public static void setPlugin(Main MainPlugin) {
        plugin = MainPlugin;

    }

    @EventHandler
    public void join(PlayerJoinEvent e) {

        UUID uuid = e.getPlayer().getUniqueId();

        if (map.containsKey(uuid)) {
            map.put(uuid, map.get(uuid) + 1);
        } else {
            map.put(uuid, 1);
        }

        int count = map.get(uuid);

        e.setJoinMessage(count + "번째 입장했습니다!");

    }

}




다음은 File 클래스를 작성해보겠습니다.


File 클래스 역시 아래 사진을 따라 따라해주시길 바랍니다.



e87f7bb2df2ff564eeb072e1630e26c1.jpeg



여기까지 작성하셨으면 Main클래스에 있는 File에 관련된 내용을 옮겨보도록 하겠습니다.


c1731865d6409f2df97c2c90c40fd78a.jpegf5e0b40f7e771cd58882b74a60b25f41.jpeg


빨간 동그라미로 표시한 괄호에 주의하셔서 옮겨주세요. 괄호 하나를 남기셔야 에러가 안납니다!


옮긴 후 File 클래스의 코드는 아래와 같습니다.


package com.tistory.cchplugin.cchlecture.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;

import com.tistory.cchplugin.cchlecture.Main;

public class CchFile {

    public static Main plugin;
    
    public static void setPlugin(Main MainPlugin) {
        plugin = MainPlugin;

    }
    
    public void makeFile(File f) {
        if (!f.exists() || !f.isFile()) {
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    @SuppressWarnings("deprecation")
    public void mapToFile(File f, HashMap map) {
        Bukkit.getScheduler().scheduleAsyncRepeatingTask(this, new Runnable() {

            @Override
            public void run() {
                try {
                    consol.sendMessage(ChatColor.GREEN + "데이터를 저장 했습니다");
                    FileWriter writer = new FileWriter(f, false); // Map to File
                    for (UUID uuid : map.keySet()) {
                        writer.write(uuid.toString() + "|" + map.get(uuid) + "\n");
                    }
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, 20 * 30, 20 * 30);

    }

    public void fileToMap(File f, HashMap map) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(f)); // File to Map
            String fileLine = null;
            while ((fileLine = reader.readLine()) != null) {

                UUID uuid = UUID.fromString(fileLine.split("\\|")[0]);
                String str = fileLine.split("\\|")[1];

                map.put(uuid, Integer.parseInt(str));
            }
        } catch (FileNotFoundException e3) {
            e3.printStackTrace();
        } catch (IOException e4) {
            e4.printStackTrace();
        }
    }
    
}


정상적으로 옮기셨으면 아래 사진과 같이 빨간줄로 에러가 표시될 것입니다.


887eeb6fa00e612c63fca794b5d4773b.jpeg


에러가 나는 이유는 Main함수에서 사용 하던 방식 그대로 가지고 왔기때문입니다.


위에서 작성했던 


public static Main plugin; 이라는 코드를 이용하여 에러를 없애보겠습니다.


200b3a5f0eb73076a7c9e230706072c8.jpeg



6bf00902fb904bf8e17c0ee278dcdd0a.jpeg


어떻게 작동하는지 설명을 해드리면 머리가 아프실겁니다... 혹시나 궁금하시다면 댓글을 통해 질문해주세요.


여기까지 따라 오셨다면 Command, Event, File 클래스 작성이 끝났습니다.


이제 마지막으로 Main클래스를 조금만 수정하면 끝이납니다.


잘 따라하셨다면 Main 클래스는 아래와 같은 상태 일 겁니다.


6bf00902fb904bf8e17c0ee278dcdd0a.jpeg


Main 클래스를 아래와 같은 코드로 바꾸시고, 에러가 나는 부분은 스스로 한번 고쳐보시길 바랍니다. 


위 내용을 참고하신다면 쉽게 바꾸실수 있을 겁니다. 


package com.tistory.cchplugin.cchlecture;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.java.JavaPlugin;

import com.tistory.cchplugin.cchlecture.event.CchEvent;
import com.tistory.cchplugin.cchlecture.file.CchFile;

public class Main extends JavaPlugin {

    public ConsoleCommandSender consol = Bukkit.getConsoleSender();
    
    @Override
    public void onEnable() {
        consol.sendMessage(ChatColor.AQUA + "[플러그인 활성화 중 입니다.]");
        
        CchEvent.setPlugin(this);
        CchFile.setPlugin(this);
        
        CchEvent cchEvent = new CchEvent();
        CchFile cchFile = new CchFile();
        
        getServer().getPluginManager().registerEvents(cchEvent, this);
        cchFile.makeFile(cchFile.f);
        cchFile.mapToFile(cchFile.f, cchEvent.map);
        cchFile.fileToMap(cchFile.f, cchEvent.map);
    }

    @Override
    public void onDisable() {
        consol.sendMessage(ChatColor.AQUA + "[플러그인 비활성화 중 입니다.]");
    }

}


수정한 플러그인을 적용하면 똑같이 작동하는 것을 확인 하실 수 있을겁니다!


02547daf44f3de42115b87b05529e958.jpeg



다음 강좌는 Command 클래스에 대해서 자세히 알려드리겠습니다.


혹시나 질문사항이 있으시다면 댓글을 남겨주세요.


블로그에 댓글을 남기시면 작성자 핸드폰으로 알림이 가게 됩니다.


알림을 받게 되면 최대한 빨리 답변 해드리겠습니다.


감사합니다.


0개의 댓글

조회 수 제목 글쓴이
783 [1. 뉴플래닛] 여기 서버 사전예약 보상이 남다른데요? 심지어 곧 OBT도 진행한대요! 언능 사전... 8 루타카
765 [2. MS ONLINE] 요즘서버 지루 하시다구요? 이서버 해보세요! 19 U 호롤로롤로
107 [3. HK] 마인크래프트 개발 디스코드 - 컨텐츠를 만들고 서버 어드민이 되어보자! 4 DC
397 네모의 BBQ 황금올리브 치킨 이벤트 추첨 결과 18 네모
407 새로워진 한마포 창작자로 수익과 함께 활동해보세요! 4 프리루트
437 일부 SNS 로그인 지원 중단 및 안내 가이드 (카카오, 트위터) 13 프리루트
834 한디포 이용 가이드! 처음 온 분은 읽어둡시다! 20 초스터
646 한디포 이용 규칙 25 초스터
414 한마포 AD : 새로운 게시판 공지 광고 안내 7 프리루트
48 [기타] [네모팁] 윈도우즈 비밀번호 분실했을때 복구하는 법 5 네모
107 [커맨드 블록] 마인크래프트 커맨드 강좌 3강 - 기본적인 커맨드들 7 리오채널
33 [플러그인] [마인크래프트 플러그인 제작 강의] 6강 패키지, 클래스 분리 cch
80 [기타] 운영자/개발자 에게 필수인 싱글 스레드에 대한 개념 이해하기 1 wysohn
377 [스크립트] 특정 이름의 아이템을 우클릭했을때 명령어 실행하게 하는방법 10 WintChoco
184 [스크립트] [ 부록 ] 너도하고 나도하는 Skript : 변수를 MariaDB에 저장하자! ( #2 ) ( 데이터 주의 ) 12 BlessU_
24 [프로그래밍 일반] [ 2강 ] - 상태메세지와 임베드 작성하기 Hunter
34 [프로그래밍 일반] [ 1강 ] - 대화 기능이 있는 매우 간단한 디코봇을 만들어보자! Hunter
159 [스크립트] [ 심화 ] 스크립트로 패킷을 다뤄보자 2 분열
194 [스크립트] chat recipients 가 뭘까? (채팅채널, 지역채팅 쉽게만드는법) 3 프리
39 [스크립트] Skript 공부.. 어떻게하죠? [0편] 1 r_ook1e
49 [플러그인] [마인크래프트 플러그인 제작 강의] 5강 플러그인 제작에 필요한 용어정리 cch
156 [스크립트] 서버의 모티드를 멋지게 변경해보자! 13 워뇽이사랑해
103 [커맨드 블록] 마인크래프트에 총을 만들자! (난이도: 높음!) 5 castleCT
41 [플러그인] 벡터를 이용해서 호밍을 해보자 분열

개발자 최신글
사진이 없습니다.

구인

반야생RPG서버에서 건축인원 구합니다.

1737162

2020-05-30

0

사진이 없습니다.

질문

오류를 고쳐줄 사람을 구합니다

rlrl

2020-05-30

0