본문 바로가기
JAVA공부/0-자바기초(초급자)

[JAVA] 자바 Enum 클래스를 이용해보기 / 자바 Reflect 응용 / 자바 인터페이스 응용 / 자바 기초 / 자바 Enum과 Reflect 응용/ 자바 Enum 메서드 / 자바 주석 / 자바 상속 / 자바 상수

by 으노으뇨 2022. 11. 18.
728x90
반응형
SMALL

안녕하세요~~!!! ㅎㅎㅎㅎ

지난 포스팅으로 자바의 기초문법인 리플렉트를 이용해서 

https://uno-kim.tistory.com/226

 

[JAVA] 자바 리플렉트를 이용한 OperatingSystemMXBean클래스로 현재 PC의 CPU를 확인하기

안녕하세요~!~~~!!!ㅎㅎㅎㅎ 오늘은 리플렉트를 이용해서 OperatingSystemMXBean 클래스를 인스턴스화 하고 해당 클래스내의 메서드를 호출하여 CPU 상태를 확인하는 방법에 대해서 설명하겠습니다. 우

uno-kim.tistory.com

OperatingSystemMXBean 를 사용하는 방법에 대해서 알아보았습니다.

저와 같은 이유(??) 또는 사연이 있을 때 언제든 사용할 수 있도록 

해당 기능을 Enum 클래스를 이용해서 공통화 해보도록 해보겠습니다 ㅎㅎㅎ

OperatingSystemMXBean 를 com.sun.management 패키지처럼 쓸수 있도록 설계해보겠습니다.

언제까지나 제가 정답은 아니고 이것 저것 공부하면서 응용???하는 방법입니다.

만약 더 좋은 방법이있다면 댓글로 언제든 혼내주시고 지적해주시고 알려주세요 ... 감사합니다 .ㅠㅠ

우선 설계로 

  • 언제 어디서든 호출 가능해야한다.
  • 상수형으로 관리되어서 변칙적이지 않고 공통화가 되어야한다.
  • 모든 사용자가 같은 방법으로 사용해야하고 일정해야한다.

이렇게 설계했습니다.


1. 붕어빵 틀 만들기 (interface)

package Java.Reflect;

interface MyOperatingSystemMXBean
{
	abstract Object getValue();
	String[] METHODS = {
			"getCommittedVirtualMemorySize"
			,"getFreePhysicalMemorySize"
			,"getFreeSwapSpaceSize"
			,"getProcessCpuLoad"
			,"getProcessCpuTime"
			,"getSystemCpuLoad"
			,"getTotalPhysicalMemorySize"
			,"getTotalSwapSpaceSize"
	};
}

남들 포스팅처럼 OperatingSystemMXBean 막 쓸수있지만 저는 못쓰고있는 통탄스러운 기분을... 

내가 직접 만들어 써보겠다!! 마음으로 만들어보겠습니다. ㅎㅎㅎ

붕어빵 틀로 공통화 되어질 getValue라는 매서드를 만들었습니다.


2-1. Enum 클래스 활용 (Enum)

package Java.Reflect;

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * @author zhfld
 * @version 1.0.1
 * @since 2022.11.18
 * @category OperatingSystemMXBean을 사용못한 한이 맺힌 이넘클래스
 * @implNote 리턴타입 Object 인 getValue()를 상속시킨다.
 * @apiNote
 *    <p>기존의 OperatingSystemMXBean를 호출하고 
 *    이것저것해서 바로 get하면서 갑자기 사용해버리는 그런 포스팅을 봤지만 
 *    나는 그것을 사용하지 못해 3일간 개뻘짓 한것이 열불나서 
 *    그냥 내가 확만들어버린 라이브러리 그러나 효율성이나 성능은 보장못함ㅋㅋ
 */
enum OSMXBean implements MyOperatingSystemMXBean
{
	/**
	 * @apiNote getCommittedVirtualMemorySize return Long type
	 */
	COMMITTED_VIRTUAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getFreePhysicalMemorySize return Long type
	 */
	,
	FREE_PHYSICAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.FREE_PHYSICAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getFreeSwapSpaceSize return Long type
	 */
	,
	FREE_SWAP_SPACE_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.FREE_SWAP_SPACE_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getProcessCpuLoad return Double type
	 */
	,
	PROCESS_CPU_LOAD {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.PROCESS_CPU_LOAD.ordinal()]);
		}
	}
	/**
	 * @apiNote getProcessCpuTime return Long type
	 */
	,
	PROCESS_CPU_TIME {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.PROCESS_CPU_TIME.ordinal()]);
		}
	}
	/**
	 * @apiNote getSystemCpuLoad return Double type
	 */
	,
	SYSTEM_CPU_LOAD {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.SYSTEM_CPU_LOAD.ordinal()]);
		}
	}
	/**
	 * @apiNote getTotalPhysicalMemorySize return Long type
	 */
	,
	TOTAL_PHYSICAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.TOTAL_PHYSICAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getTotalSwapSpaceSize return Long type
	 */
	,
	TOTAL_SWAP_SPACE_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.TOTAL_SWAP_SPACE_SIZE.ordinal()]);
		}
	};
	private HashMap<String, Method> methodMap = new HashMap<String, Method>();
	private OperatingSystemMXBean osBean;

	OSMXBean()
	{
		HashMap<String, Method> innerMap = new HashMap<String, Method>();
		this.osBean = ManagementFactory.getOperatingSystemMXBean();
		Method[] methods = osBean.getClass().getDeclaredMethods();
		for (Method method : methods)
		{
			method.setAccessible(true);
			innerMap.put(method.getName(), method);
		}
		this.methodMap = innerMap;
	}
	protected Object excute(String str)
	{
		Object value = null;
		try
		{
			value = this.methodMap.get(str).invoke(this.osBean);
		}
		catch (Exception e)
		{
			// TODO: handle exception
		}
		return value;
	}
	@Override
	public Object getValue()
	{
		// TODO Auto-generated method stub
		return null;
	}
}

이넘 클래스는 위와같이 작성했습니다.

자바 CPU 측정하기 OperatingSystemMXBean 활용해서 자바로 CPU 측정하기 를 못한 저에게 한이 맺힌...쓰레기코드...

참고로 효율이나 성능은 보장못하고 그냥 만들어봤습니다...

나름 저렇게 주석으로 장난칠 치면 이렇게 나름 괜찮아 보이네요 ㅎㅎㅎ


2-2 소스설명

붕어빵틀을 상속받는다.

붕어빵틀을 상속받는다. 그래서 각 상수에 오버라이딩 해주어서 추상화된 객체를 받아서 내용을 채워준다.

이때 함수 실현부를 내부의 Proteced 접근제한자인 excute(@문자열) 함수를 각 상수에서 발생하도록 한다.

그리고 String[] 형태의 상수타입을 Enum 클래스에 상속시켜주어 코드를 조금 숨겼고 관리하기 편하게 하였다.

Enum 클래스의 생성자

우선 Enum 클래스의 생성자에 Map 구조형과 OperatingSystemMXBean  를 선언해주는 역할을 하도록 합니다.

리플랙트를 인스턴스화한 매서드와, 매서드의 본이름을 map에 저장합니다. 이때 이름 : 매서드 이렇게 매핑이 뽀인트입니다.

excute ( @ 문자열 )

이 함수는 Proceted 접근제한자로 설정했으며, 해당 Enum의 상수들이 공통적으로 실행할 수 있도록 작성했습니다.

매개변수 문자열은 상수로부터 받아오며 이또한 상수로 관리되어진다. 상수...좋아...

상수

우선 해당 Enum 클래스 내부에는 2가지 상수로 나누어진다. 하나는 내부에서 사용할 상수, 그리고 함수형 상수? 가있다. 내부적으로 사용가능한 상수는 METHOD이며 붕어빵틀로부터 상속을 받아 사용된다.

this.METHODS[OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.ordinal()]

요딴 식으로 작성해도 알잘딱 잘들어가게 했다. 이제 우리는 붕어빵틀의 String[] METHODS 만 관리를 잘하면 되는것이다!!

그리고 함수형 상수(??) 에 대해서는 해당 상수를 클래스처럼 사용하기 위해서 하였고 붕어빵틀에 대해서 추상화된 객체를 사용하기 위해 사용했다. 그래서 getValue를 사용했고 내부 excute도 사용하여 내가 원하는 값들을 가져올 수 있는 형태가 완성되는것이다.


3. 실행

package Java.Reflect;

public class CPUCheck
{
	public static void main(String[] args)
	{
		System.out.println(OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.FREE_PHYSICAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.FREE_SWAP_SPACE_SIZE.getValue());
		System.out.println(OSMXBean.PROCESS_CPU_LOAD.getValue());
		System.out.println(OSMXBean.PROCESS_CPU_TIME.getValue());
		System.out.println(OSMXBean.SYSTEM_CPU_LOAD.getValue());
		System.out.println(OSMXBean.TOTAL_PHYSICAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.TOTAL_SWAP_SPACE_SIZE.getValue());
	}
}

끔찍한 형태의 소스... 그래도 잘돌아가는지 확인해보겠습니다.

조금 버벅이긴합니다.... 그래도 성능은 정말 최악의 소스지만 알고있는 지식을 다 쥐어짜서 설계해보고 소스를 짜보았습니다. ㅎㅎㅎ

어디 실무에서 이렇게 Reflect를 이용해서 CPU를 측정한다면 그대로 모니터 끄고 마우스 내려놓고 나와야할것같네요 ㅎㅎ

그래도 이런식으로 Enum과 인터페이스 상속, 그리고 상수형을 응용하는데는 많은 도움이 되었다고 생각이 들어서 

나름 뿌듯하네요 ㅎㅎㅎ

긴글 봐주셔서 감사합니다.

마지막은 풀 소스 그대로 드리겠습니다.

package Java.Reflect;

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.lang.reflect.Method;
import java.util.HashMap;

public class CPUCheck
{
	public static void main(String[] args)
	{
		System.out.println(OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.FREE_PHYSICAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.FREE_SWAP_SPACE_SIZE.getValue());
		System.out.println(OSMXBean.PROCESS_CPU_LOAD.getValue());
		System.out.println(OSMXBean.PROCESS_CPU_TIME.getValue());
		System.out.println(OSMXBean.SYSTEM_CPU_LOAD.getValue());
		System.out.println(OSMXBean.TOTAL_PHYSICAL_MEMORY_SIZE.getValue());
		System.out.println(OSMXBean.TOTAL_SWAP_SPACE_SIZE.getValue());
	}
}
interface MyOperatingSystemMXBean
{
	abstract Object getValue();
	String[] METHODS = {
			"getCommittedVirtualMemorySize"
			,"getFreePhysicalMemorySize"
			,"getFreeSwapSpaceSize"
			,"getProcessCpuLoad"
			,"getProcessCpuTime"
			,"getSystemCpuLoad"
			,"getTotalPhysicalMemorySize"
			,"getTotalSwapSpaceSize"
	};
}

/**
 * @author zhfld
 * @version 1.0.1
 * @since 2022.11.18
 * @category OperatingSystemMXBean을 사용못한 한이 맺힌 이넘클래스
 * @implNote 리턴타입 Object 인 getValue()를 상속시킨다.
 * @apiNote
 *    <p>기존의 OperatingSystemMXBean를 호출하고 
 *    이것저것해서 바로 get하면서 갑자기 사용해버리는 그런 포스팅을 봤지만 
 *    나는 그것을 사용하지 못해 3일간 개뻘짓 한것이 열불나서 
 *    그냥 내가 확만들어버린 라이브러리 그러나 효율성이나 성능은 보장못함ㅋㅋ
 */
enum OSMXBean implements MyOperatingSystemMXBean
{
	/**
	 * @apiNote getCommittedVirtualMemorySize return Long type
	 */
	COMMITTED_VIRTUAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.COMMITTED_VIRTUAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getFreePhysicalMemorySize return Long type
	 */
	,
	FREE_PHYSICAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.FREE_PHYSICAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getFreeSwapSpaceSize return Long type
	 */
	,
	FREE_SWAP_SPACE_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.FREE_SWAP_SPACE_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getProcessCpuLoad return Double type
	 */
	,
	PROCESS_CPU_LOAD {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.PROCESS_CPU_LOAD.ordinal()]);
		}
	}
	/**
	 * @apiNote getProcessCpuTime return Long type
	 */
	,
	PROCESS_CPU_TIME {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.PROCESS_CPU_TIME.ordinal()]);
		}
	}
	/**
	 * @apiNote getSystemCpuLoad return Double type
	 */
	,
	SYSTEM_CPU_LOAD {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.SYSTEM_CPU_LOAD.ordinal()]);
		}
	}
	/**
	 * @apiNote getTotalPhysicalMemorySize return Long type
	 */
	,
	TOTAL_PHYSICAL_MEMORY_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.TOTAL_PHYSICAL_MEMORY_SIZE.ordinal()]);
		}
	}
	/**
	 * @apiNote getTotalSwapSpaceSize return Long type
	 */
	,
	TOTAL_SWAP_SPACE_SIZE {
		@Override
		public Object getValue()
		{
			return this.excute(METHODS[OSMXBean.TOTAL_SWAP_SPACE_SIZE.ordinal()]);
		}
	};
	private HashMap<String, Method> methodMap = new HashMap<String, Method>();
	private OperatingSystemMXBean osBean;

	OSMXBean()
	{
		HashMap<String, Method> innerMap = new HashMap<String, Method>();
		this.osBean = ManagementFactory.getOperatingSystemMXBean();
		Method[] methods = osBean.getClass().getDeclaredMethods();
		for (Method method : methods)
		{
			method.setAccessible(true);
			innerMap.put(method.getName(), method);
		}
		this.methodMap = innerMap;
	}
	protected Object excute(String str)
	{
		Object value = null;
		try
		{
			value = this.methodMap.get(str).invoke(this.osBean);
		}
		catch (Exception e)
		{
			// TODO: handle exception
		}
		return value;
	}
	@Override
	public Object getValue()
	{
		// TODO Auto-generated method stub
		return null;
	}
}

OperatingSystemMXBean 사용하기 OperatingSystemMXBean 만들어보기

OperatingSystemMXBean  구현해보기 자바 리플랙트 자바 리플렉트 자바 OperatingSystemMXBean 

자바 CPU 측정하기 자바 Enum 함수형 상수 자바 Enum 상수형 함수 자바 Enum 응용 자바 상속 자바 Enum 상속

자바 주석이쁘게하기 자바 주석으로 라이브러리 느낌내기 자바 주석 자바 주석 활용

728x90
반응형
LIST