들어가며
블랙잭 미션을 하면서 캐싱이라는 말을 처음 들어보았다. 내가 아는 Cache는 메모리 관련 내용 밖에 없었는데 자바에서 듣게 되니 궁금해서 알아보게 되었다.
캐시
캐시 란 데이터, 값을 미리 복사해 놓는 임시 장소를 의미한다.
이렇게 복사를 해놓는 이유는 미리 복사를 해 놓음으로써 값을 다시 계산하거나, 데이터에 접근하는 시간을 줄일 수 있다. 빠르게 데이터에 접근할 수 있는 것이다.
캐싱
캐싱이란 위에서 말한 ‘캐시’를 하는 것이다.
체스 미션에서의 캐싱
나의 체스 미션은 FILE & RANK 라는 행열로 이루어진 보드판 위에서 진행하는 게임이었다. 이는 enum타입으로 진행하였다. 처음에는 ‘a~h’ , ‘1~8’로만 enum을 만들어 놓고 사용자가 입력한 값에 대해서 그때 그때 찾는 방식으로 진행하였다.
public static Optional<File> findFile(char result) {
return Arrays.stream(File.values())
.filter(file -> file.value == result)
.findFirst();
}
public static Optional<Rank> findRank(int result) {
return Arrays.stream(Rank.values())
.filter(rank -> rank.value == result)
.findFirst();
}
Rank도 위와 비슷한데, 위에 처럼 구현을 하면서 NULL값을 생각해주기 위해 Optional을 사용하는 것이 괜히 불편했다.
그리고 체스말을 움직이기 위해선 File과 Rank를 보는 것이 당연한데 그 때 마다 모두 순회하는 것이 불편했다.
이 때 체스 좌표를 캐싱해주어 재사용한다면 성능을 올릴 수 있을 것 같다는 ‘케로’의 말을 듣고 수정해보게 되었다.
체스 좌표 캐싱
Map을 만들어 Enum을 HashMap에 저장해놓고 Enum을 찾아 반환하였다.
이럴 경우 시간복잡도 O(N)에서 O(1)로 주는 장점이 있다.
private static final Map<Integer, Rank> RANK_MAP = new HashMap<>();
static {
for (Rank rank : values()) {
RANK_MAP.put(rank.value, rank);
}
}
public static Rank findRank(int result) {
if (RANK_MAP.containsKey(result)) {
return RANK_MAP.get(result);
}
throw new IllegalArgumentException("file 좌표가 잘못되었습니다.");
}
private static final Map<Character, File> FILE_MAP = new HashMap<>();
static {
for (File file : values()) {
FILE_MAP.put(file.value, file);
}
}
public static File findFile(char result) {
if (FILE_MAP.containsKey(result)) {
return FILE_MAP.get(result);
}
throw new IllegalArgumentException("file 좌표가 잘못되었습니다.");
위에서 사용한 static 블록은 static 초기화 블록이다. 이는 클래스가 최초에 로딩 될 때 수행되므로 생성자와는 상관없이 수행된다. GC의 대상도 아니고 최초 1회만 실행된다.
나가며
블랙잭 미션에서 캐싱이라는 것을 알게되었다. 하지만 이를 실제 적용하기 두려움, 어려움 때문에 하기 싫은 마음이 컸는데 페어의 요청으로 하게되었다. 막상 하고나니 어렵진 않았고 나중에도 충분히 사용가능한 것 같다.
'코코코딩공부 > JAVA' 카테고리의 다른 글
[JAVA] 정적 팩토리 메소드 (0) | 2023.04.07 |
---|---|
[Gradle] dependency 차이점 (CompileOnly, RuntimeOnly, api, implementation) (0) | 2023.03.27 |
[JAVA] 상속 과 조합 (0) | 2023.03.13 |
[JAVA] VO(Value Object) 란 무엇인가 ? (0) | 2023.03.12 |
[JAVA] 제네릭 Generic (1) | 2023.03.04 |