해당 포스팅에서 언급된 내용은 Ndroid 에서 제공합니다.

https://github.com/skaengus2012/Ndroid


최근, 사내에서 개발하는 프로젝트에서 주로 다루게 되었던 요구사항 중 하나는 특정 범위에 대하여 등급을 부여하는 것이었습니다.


예를들어, [80.01~100 이면 "S", 70.01~80.00 이면 "A"] 이런 식으로 특정 구간에 대한 점수를 구합니다. 


이를 구현하는 문제는 생각보다 어려운 문제는 아니었지만, SWIFT 와 같은 최신언어에서는 범위에 관한 TYPE 을 제공하고 있는 것을 확인했던 차, JAVA 에도 이런 클래스가 있으면 좋겠다는 생각을 하게 되었습니다.


JAVA8 에서는 범위와 비슷한 문제에 대하여, [날짜 클래스 관련 Duration, Between 과 같은 클래스들이 배포]되었지만 아쉽게도 여러 형식을 호환하기 위한 구간 클래스는 아니었습니다.


그래서, N`s 오픈소스 프로젝트에서는 구간 관련 요구사항을 담을 수 있는 모듈을 제공하고자 하였습니다. 

해당 모듈의 주목적은 특정 Generic Type 에 대한 구간을 객체로써 가지는 것을 목적으로 하며, 이를 이용할 수 있는 추가 모듈을 제공하는 것입니다.


사용법은 아래와 같습니다.



1. 구간 객체 생성 및 활용.


구간을 생성하고, 특정 값이 구간에 포함되는가에 대한 표현입니다.


1
2
3
4
5
6
7
// 3 에서 7 사이의 구간 객체 생성.
Between<Integer> between3to7 = Between.Just(37);
 
System.out.println("3에서 7 사이, 4 는 구간에 포함되는가? -> " + between3to7.contains(4+ "\n");
 
// CONSOLE LOG
// 3에서 7 사이, 4 는 구간에 포함되는가? -> true
cs


객체 생성 방식은 RxJava 의 Maybe 와 비슷한 경험을 제공하고자 하였으며, 

기존 집합개념의 Set 의 Set::contains 와 개념적으로 비슷하기 때문에 같은 서명을 사용하고자 했습니다. 



2. 구간 객체 관리 Map


Between 객체를 관리할 수 있는 자료구조가 있다면, 꽤 멋진 활용을 할 수 있을 것이라 생각했었습니다. 

가장 먼저 생각한 것은 구간을 key 로 가지며, 구간에 포함되는 값을 매칭하면 해당 구간에 대한 value 를 얻을 수 있는 Map 을 구현하는 것이었습니다.


자료구조적으로 HashMap 은 아니지만, Map 과 비슷한 메소드 서명을 취할 수 있도록 Wrapping 하여 위의 요구사항을 충족하고자 했습니다. :-)


사용방법은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BetweenMap<Between<BigDecimal>String> betweenStringBetweenMap = new BetweenMap<>();
 
// 
betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(0.0), BigDecimal.valueOf(5.0)), "A");
betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(5.1), BigDecimal.valueOf(10.0)), "S");
betweenStringBetweenMap.put(Between.Just(BigDecimal.valueOf(6.1), BigDecimal.valueOf(13.0)), "S++");
 
// BigDecimal map getter.
// Return type -> Rx.Maybe
betweenStringBetweenMap.getFirst(BigDecimal.valueOf(3.87)).subscribe(grade -> System.out.println("Maybe Type 결과 출력 ([3.87] 에 대한 등급) : " + grade));
 
// List Type Return.
System.out.println("List Type 결과 출력 ([8.7] 에 대한 등급) : " + betweenStringBetweenMap.getToList(BigDecimal.valueOf(8.7)));
 
// CONSOLE LOG
// Maybe Type 결과 출력 ([3.87에 대한 등급) : A
// List Type 결과 출력 ([8.7] 에 대한 등급) : [S, S++]
cs



해당 모듈과 관련된 원본 주소는 아래에서 확인하실 수 있습니다.



이 포스팅이 보다 간결한 코딩을 하는 것에 도움이 되길 바래요 ~ @.@ ~


반응형
Posted by N'