유틸리티 클래스란 무엇인가?
어려운 개념은 없고 그냥 용어이다.
유틸리티 클래스는 인스턴스 메서드와 인스턴스 변수를 일절 제공하지 않고 정적 메서드와 변수만을 제공하는 클래스를 뜻한다.
클래스 본래의 목적인 '데이터와 데이터 처리를 위한 로직의 캡슐화' 를 실행하는 것이 아니라 '비슷한 기능의 메서드와 상수를 모아서 캡슐화' 한 것이 유틸리티 클래스이다.
설명이 너무 짧아서 static에 대해서 조금 더 언급하겠다.
static을 사용하는 이유는 공유 때문이다.
static 을 사용하면 새로 생성되는게 아니라 항상 같은 곳의 메모리 주소를 향하기 때문에 static 변수의 경우는 그 값이 공유가 가능하다.
static method는 어떤 개념일까?
static method는 메서드의 앞부분에 static을 붙임으로서 만들 수 있는데 따로 객체를 만들지 않고도 바로 클래스를 통해 메서드를 호출할 수 있다는 장점이 있다. <Class>.<methodName>() 와 같은 형태로 접근 가능한 것이다.
하지만 static method 안에서는 객체의 변수 접근이 불가능하다.
오로지 static 변수만 접근이 가능하기 때문이다.
그래서 유틸리티성 메소드를 작성할때 주로 사용하게 되고 어떤 기능을 유틸리티로 만들지에 대해서는 본인이 잘 생각하고 만들면 된다.
아래는 지금 만들고 있는 유틸리티 클래스인데 참고로 아직 완성이 한참 멀었지만 그래도 대충은 예시로 삼을 수 있을 것 같아서 첨부한다.
아직 완성 안된겁니다!!! 그 점 감안하고 봐주세용 크크...
package org.server.redistemplate;
import org.server.bot.Bot;
import org.server.game.Game;
import org.server.game.monster.Monster;
import org.server.mainserver.MainServer;
import org.server.utils.ServerConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.Protocol;
import java.util.*;
public final class RedisTemplate {
private static JedisPool pool = new JedisPool(ServerConfig.JEDIS_DEFAULT_IP, Protocol.DEFAULT_PORT);
private static Jedis jedis = pool.getResource();;
private static MainServer mainServer;
private static Map<String, Thread> botList = new HashMap<>();
private static Game game = Game.getInstance();;
public static synchronized String createUser(String nickname){
jedis.sadd("nickname", nickname); // user nickname
jedis.sadd(nickname + ":hp", "100"); // user hp
jedis.sadd(nickname + ":str", "5");
jedis.sadd(nickname + ":x_pos", "0"); // first position
jedis.sadd(nickname + ":y_pos", "0"); // first position
return "[Create User] " + "[nickname: " + nickname + ", hp:100, str:5, x_pos: 0, y_pos: 0]";
}
public static synchronized String move(String nickname, int x, int y){
String foundXPos = jedis.get(nickname + ":x_pos");
String foundYPos = jedis.get(nickname + ":y_pos");
String toX = String.valueOf(x + Integer.parseInt(foundXPos));
String toY = String.valueOf(y + Integer.parseInt(foundYPos));
jedis.set(nickname + ":x_pos", toX);
jedis.set(nickname + ":y_pos", toY);
return nickname + " move from [" + foundXPos + ", " + foundYPos + "] to " + "[" + toX + ", " + toY + "]";
}
public static synchronized String userAttack(String nickname){
/*
attack logic
*/
return nickname + " attack.";
}
public static synchronized void userAttacked(String nickname, int monsterStr){
int hp = Integer.parseInt(jedis.get(nickname +":hp"));
jedis.sadd(String.valueOf(hp - monsterStr));
}
public static synchronized String showMonsters(){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < game.monsterList.size(); i++){
Monster monster = game.monsterList.get(i);
sb.append("monster " + monster.getX() + " " + monster.getY() + "\n");
}
return sb.toString();
}
public static synchronized String showUsers(){
Set<String> members = jedis.smembers("nickname");
List<String> list = new ArrayList<>(members);
StringBuffer sb = new StringBuffer();
for(String member : list){
String xPos = jedis.get(member + ":x_pos");
String yPos = jedis.get(member + ":y_pos");
sb.append(member + " " + xPos + " " + yPos + "\n");
}
return sb.toString();
}
public static synchronized String chat(String from, String to, String content){
mainServer.sendMessage(from, to, content);
return from + " send message.";
}
public static synchronized String activateBot(String nickname){
Bot bot = new Bot(nickname);
addBot(nickname, bot);
bot.start();
return nickname + " activate Bot mode.";
}
public static synchronized String deactivateBot(String nickname){
removeBot(nickname);
return nickname + " deactivate Bot mode.";
}
public static synchronized void setMainServer(MainServer mainServer) {
}
public static synchronized void addBot(String nickname, Bot bot){
botList.put(nickname, bot);
}
public static synchronized void removeBot(String nickname){
botList.remove(nickname);
}
}
아래 블로그에서 많은 도움을 받았습니다.
감사합니다.
'Java' 카테고리의 다른 글
[Java] 자바 static 블록, 인스턴스 블록이란 무엇인가? (0) | 2021.01.06 |
---|---|
[Java] 제너릭 메소드의 선언부에 대해 (0) | 2021.01.06 |
[Java] 정적 팩토리 메서드란 무엇인가? (0) | 2021.01.06 |
[Java] 자바의 NPE문제와 Optional에 대해서 (0) | 2021.01.06 |
[Java] 스레드에서 등장하는 원자성의 보장이란 무엇인가? (0) | 2021.01.05 |