요르딩딩

[JAVA] Enum 구현 (2) 본문

[Java]

[JAVA] Enum 구현 (2)

요르딩딩 2021. 5. 6. 10:52
728x90
반응형

Enum구현 (1)에서 배운 내용을 토대로 리스트를 활용한 Enum사용법을 공부해보도록 하겠습니다.

1. 리스트를 활용한 Enum
2. 함수를 활용한 Enum
3. 리스트 + 함수를 활용한 Enum

1. 리스트를 활용한 Enum

[EnumType.java]

package com.enumType;

import java.util.Arrays;
import java.util.List;

public enum EnumType {
	
	SUCCESS("200", Arrays.asList("Success0","Success1","Success2")),
	FAIL("500", Arrays.asList("False0","False1","False2")),
	EMPTY("000", Arrays.asList(""));
	
	private String num;
	private List<String> list;

	/* [생성자]
	 * : 생성자의 매개변수로 전달된 값은 this.value를 통해서 인스턴스 변수의 값으로 할당된다.
	 */
	private EnumType(String num,  List<String> list) {
		this.num = num;
		this.list = list;
	}
	
	public static EnumType findEnumType(String num){
	    return 
	            //EnumType의 Enum 상수들을 순회하며
	            Arrays.stream(EnumType.values())
	            //enumType을 갖고 있는게 있는지 확인합니다.
	            .filter(enumType -> enumType.find(num))
	            .findAny()
	            .orElse(EMPTY);
	}

	public boolean find(String num){
	    return list.stream()
	            .anyMatch(list -> list.equals(num));
	}

	//인스턴스 변수값 반환
	public String getNumValue() {
		return num;
	}
	
	//인스턴스 변수값 반환
	public List<String> getListValue() {
		return list;
	}

}

findEnumType 함수와 find함수를 사용하여 찾고자하는 Value를 가지고 있는 인스턴스를 반환할 수 있습니다.

 

public void enumtest(HttpServletRequest request) {
		System.out.println("EnumType[] values = EnumType.values()");
		EnumType[] values = EnumType.values();
		System.out.println();
		
		System.out.println("values[0] : " + values[0]);
		System.out.println("values[0].ordinal() : " + values[0].ordinal());
		System.out.println("EnumType.valueOf(\"SUCCESS\") : " + EnumType.valueOf("SUCCESS"));
		System.out.println("EnumType.SUCESS.toString() : " + EnumType.SUCCESS.toString());
		System.out.println();
		
		System.out.println("EnumType.SUCCESS.getNumValue() : " + EnumType.SUCCESS.getNumValue());
		System.out.println("EnumType.SUCCESS.getListValue() : " + EnumType.SUCCESS.getListValue());
		System.out.println();
		
		System.out.println("EnumType.FAIL.getNumValue() : " + EnumType.FAIL.getNumValue());
		System.out.println("EnumType.FAIL.getListValue() : " + EnumType.FAIL.getListValue());
		System.out.println();
		
		System.out.println("EnumType.findEnumType(\"Success0\") : " + EnumType.findEnumType("Success0"));
		System.out.println("EnumType.findEnumType(\"Success1\") : " + EnumType.findEnumType("Success1"));
		System.out.println("EnumType.findEnumType(\"Success2\") : " + EnumType.findEnumType("Success2"));
		System.out.println("EnumType.findEnumType(\"False0\") : " + EnumType.findEnumType("False0"));
		System.out.println("EnumType.findEnumType(\"False1\") : " + EnumType.findEnumType("False1"));
		System.out.println("EnumType.findEnumType(\"False2\") : " + EnumType.findEnumType("False2"));
		System.out.println("EnumType.findEnumType(\"\") : " + EnumType.findEnumType(""));
	}

Enum을 가지고 활용할 수 있는 특징들을 테스트해보았습니다. 아래의 결과를 확인해 봅시다.

 

[결과]

2. 함수를 활용한 Enum

[EnumType.java]

package com.enumType;

import java.util.Arrays;
import java.util.List;

import org.springframework.cglib.core.internal.Function;

public enum EnumType {
	ORIGIN("매출액", origin -> origin),
	SUPPLY("공급액", origin -> Math.round(origin.doubleValue()) * 10 /11),
	VAT("부가세", origin -> origin / 11),
	NOTHING("없음",origin -> 0L);

	private final String name;
	private final Function<Long, Long> expression;

	//생성자
	EnumType(String name, Function<Long, Long> expression) {
		this.name = name;
		this.expression = expression;
	}

	public long calculate(long origin) {
		return expression.apply(origin);
	}

}

java8 부터는 함수를 인자로 받을 수 있다고 합니다.

 

public void enumtest(HttpServletRequest request) {
		System.out.println("EnumType.ORIGIN.calculate(0) : " + EnumType.ORIGIN.calculate(100));
		System.out.println("EnumType.SUPPLY.calculate(0) : " + EnumType.SUPPLY.calculate(100));
		System.out.println("EnumType.VAT.calculate(0) : " + EnumType.VAT.calculate(100));
		System.out.println("EnumType.NOTHING.calculate(0) : " + EnumType.NOTHING.calculate(100));
		
	}

 

[결과]

3. 리스트 + 함수를 활용한 Enum

[EnumType.java]

package com.enumType;

import java.util.Arrays;
import java.util.List;

import org.springframework.cglib.core.internal.Function;

public enum EnumType {
	AVG("평균", list -> { return getSum(list) / list.size();} ),
	SUM("합계", list -> { return getSum(list);} );

	private final String name;
	private final Function<List<Integer>, Integer> expression; //Function인터페이스 이용(JAVA 8)

	//생성자
	EnumType(String name, Function<List<Integer>, Integer> expression) {
		this.name = name;
		this.expression = expression;
	}

	private static Integer getSum(List<Integer> list) {
		return list.stream()      //스트림생성
			.reduce(Integer::sum) //.reduce : 결과를 만들어냄, Integer::sum : 합
			.get();
	}

	public Integer calculate(List<Integer> list) {
		return expression.apply(list); //.apply : 작업 수행후 리턴
	}

}

 

public void enumtest(HttpServletRequest request) {
		System.out.println(EnumType.AVG.calculate(Arrays.asList(1,2,3,4,5)));
		System.out.println(EnumType.SUM.calculate(Arrays.asList(1,2,3,4,5)));
	}

 

[결과]

728x90
반응형

'[Java]' 카테고리의 다른 글

[JAVA] LocalDate, System.arraycopy()  (0) 2021.05.14
[JAVA] startsWith(), endsWith()  (0) 2021.05.10
[JAVA] Enum 구현 (1)  (0) 2021.05.04
[JAVA] Coalesce (isNull과 친척관계)  (0) 2021.04.06
[JAVA Util] ConvertUtils  (0) 2021.04.06
Comments