본문 바로가기

일/JAVA

java11.basic_API.class

/*

System 클래스

 

자바프로그램은 운영체제에서 실행되는 것이 아니라 JVM위에서 실행되기 때문에 운영체제의

모든 기능을 자바코드가 직접 수행(개발)하기란 매우 어려운 작업이다.

하지만, java.lang.System클래스를 이용하면 운영체제의 일부기능들을 이용할 수가 있다.

 

프로세스의 종료(exit), 키보드 입력(scanner()), 콘솔입출력(in(), out()), 메모리정리(gc()),

현재시간(nanoTime()...)등의 정보를 얻을수가 있다

 

1. 프로그램 종료(exit())

경우에 따라서 프로세스(JVM)을 강제로 종료시킬 필요가 있는 경우도 있다. 이떄 System.exit(int)

메서드를 호출하면 현재 실행하고 있는 프로세스를 강제로 종료시킬 수가 있다.

 

exit()메서드는 int매개값을 지정하도록 되어 있는데 이 값을 종료상태값이라고 한다. 정상종료일

경우는 0, 비정상종료일 경우는 "0이외의 값"을 지정한다.

 

2. 쓰레기수집(gc())

쓰레기 수집기는 개발자가 직접 코드를 실행시킬 수 없고 JVM에게 가능한 빠른 시일내에 실행하도록

요청할 수 있다. 이 기능을 하는 것이 System.gc()메서드이다. gc메서드는 호출하면 곧바로 실행되는

것이 아니라 JVM이 빠른 시간내에 실행시키기 위해 노력한다.

 

3. OS 환경정보(getenv())

getenv()메서드는 시스템의 운영체제의 환경정보를 읽을 수가 있다.

 

4. 현재시간(currentTimeMills(),nanoTime())

System클래스의 currentTimeMills, nanoTime메서드는 컴퓨터시계로부터 현재시간을 읽어서

밀리세컨드(1/1000), 나노세컨드(1/10^9) 단위의 long타입의 값을 리턴한다. 이 메서드는 주로 프로그램의

소요시간을 측정하는데 사용된다.

 

*/

public class GetPropertyMain {

 

public static void main(String[] args) {

 

String os_name = System.getProperty("os.name");

String user_name = System.getProperty("user.name");

String user_home = System.getProperty("user.home");

System.out.println("운영체제의 이름= " + os_name);

System.out.println("사용자 이름= " + user_name);

System.out.println("사용자 홈 디렉토리= " + user_home);

System.out.println();

 

System.out.println("----------------------------------");

System.out.println(" [key] [value]");

System.out.println("----------------------------------");

 

Properties props = System.getProperties();

Set keys = props.keySet();

for(Object key:keys) {

String keyVal = (String) key;

String value = System.getProperty(keyVal);

System.out.println("["+keyVal+"]" +value);

}

}

}

public class SystemMain {

 

public static void main(String[] args) {

 

// 1. exit()

if(args.length > 3) {

System.out.println("프로그램 비정상종료");

System.exit(1000);

}

//2. gc()

Employee emp = null;

for(int i=0; i<3; i++) {

emp = new Employee(i);

if(i==1) emp=null;

}

System.out.print("emp가 최종적으로 참조하는 사원번호= ");

System.out.println(emp.empno);

System.gc();

System.out.println();

 

// 3. getenv()

String java_home = System.getenv("JAVA_HOME");

System.out.println(java_home);

System.out.println(System.getenv("MONGODB_HOME"));

System.out.println(System.getenv("java_home"));

System.out.println();

 

// os의 환경정보

for(Map.Entry entry : System.getenv().entrySet()) {

System.out.println(entry.getKey()+"="+entry.getValue());

}

System.out.println();

System.out.println("프로그램 종료");

}

}

class Employee{

int empno;

public Employee(int empno) {

this.empno = empno;

System.out.println("Employee("+ this.empno+")가 메모리에서 생성됨");

}

@Override

protected void finalize() throws Throwable {

System.out.println("Employee("+ this.empno+")가 메모리에서 제거됨");

}

}

/*

Class 클래스

 

1. Class객체얻기(Class.forName(String str), Object.getClass(클래스이름))

프로그램에서 Class객체를 얻기 위한 방법

1) Object 클래스의 getClass()메서드와

2) Class클래스의 forName()메서드를 이용하는 방법

 

Object는 모든 클래스의 최상위 클래스이므로 모든 클래스에서 getClass()메서드를 호출

할 수 있다. getClass()메서드는 해당 클래스의 객체가 생성되어 있지만 객체가 생성되어

있지 않을 경우에 Class객체를 얻을 수가 없다.

 

Class의 생성자는 private으로 선언되어 있기 때문에 new객체생성연산자로 객체를 만들 수가 없다.

정적인 메서드 forName()을 이용해서 클래스 정보를 얻을 수 있다. forName()메서드는

클래스전체이름 즉, 패키지이름을 포함한 전체 클래스이름을 매개값을 전달 받아서 해당 클

래스의 객체를 생성한 후에 그 객체를 리턴한다.

 

Class.forName()메서드는 클래스를 찾지 못했을 경우에 ClassNotFoundException예외를 발생

시키기 때문에 예외처리를 해야 한다.

 

2. Class정보얻기(Reflection)

getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods() 등의 메서드를 이용

해서 해당 클래스의 필드, 생성자, 메서드에 대한 정보를 얻을 수가 있다.

이것을 리플렉션(Reflection)이라고 한다.

*/

public class ClassMain {

 

public static void main(String[] args) {

 

// 객체를 생성하는 방법

// 1. new 객체생성연산자로 생성하기

Car car1 = new Car();

System.out.println(car1.model);

System.out.println(car1.getClass());

// System.out.println(car1.getName());

System.out.println();

 

// 2. getClass()

Class car2 = car1.getClass();

System.out.println(car2.getClass());

System.out.println(car2.getName());

System.out.println(car2.getSimpleName());

System.out.println(car2.getPackage());

System.out.println(car2.getPackage().getName());

System.out.println();

 

// 3. forName()

try {

Class car3 = Class.forName("com.lec.ex04_class.Car");

System.out.println(car2.getClass());

System.out.println(car2.getName());

System.out.println(car2.getSimpleName());

System.out.println(car2.getPackage());

System.out.println(car2.getPackage().getName());

System.out.println();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

 

}

class Car{

String model = "포르쉐 911 카레라";

int speed;

}

/*

3. 동적으로 객체를 생성(newinstance())

Class를 이용하면 new연산자를 사용하지 않아도 객체를 동적으로 생성할 수 있다.

이 방법은 코드 작성시에 클래스의 이름을 결정할 수 없고 런타임시에 클래스이름을

결정하는 경우에 매우 유용하게 사용된다.

 

Class객체를 얻은 후에 newinstance()메서드를 호출하면 Object타입의 객체를 얻을

수가 있다.

*/

public class NewInstanceMain {

 

public static void main(String[] args) {

boolean type = true;

Class _class;

 

try {

if(type) {

_class = Class.forName("com.lec.ex04_class.sendAction");

}else {

_class = Class.forName("com.lec.ex04_class.receiveAction");

}Action action = (Action) _class.newInstance();

action.execute();

}catch(Exception e) {

e.printStackTrace();

}

}

}

interface Action{

void execute();

}

class sendAction implements Action{

 

@Override

public void execute() {

System.out.println("문자를 보냄");

}

}

class ReceiveAction implements Action{

 

@Override

public void execute() {

System.out.println("문자를 받음");

}

}

public class ReflectionMain {

 

public static void main(String[] args) throws Exception {

Class _class = Class.forName("java.lang.String");

// Class _class = Class.forName("com.lec.ex04_class.Car");

 

// 1. 클래스의 정보

System.out.println("1. 클래스이름");

System.out.println(_class.getName());

System.out.println();

// 2. 생성자의 정보

System.out.println("2. 생성자정보");

Constructor[] constructors = _class.getDeclaredConstructors();

System.out.println("생성자의 갯수= "+ constructors.length +"개");

for(Constructor constructor:constructors) {

System.out.print(constructor.getName()+"(");

Class[] parameters = constructor.getParameterTypes();

printParameter(parameters);

System.out.println(")");

 

}

System.out.println();

// 3. 메서드의 정보

System.out.println("3. 메서드정보");

Method[] methods = _class.getDeclaredMethods();

System.out.println("메서드의 갯수= " +methods.length+"개");

 

for(Method method:methods) {

System.out.print(method.getName()+"(");

Class[] parameters = method.getParameterTypes();

printParameter(parameters);

System.out.println(")");

}

System.out.println();

// 4. 필드의 정보

System.out.println("4. 필드정보");

Field[] fields = _class.getDeclaredFields();

for(Field field:fields) {

System.out.println(field.getType().getSimpleName()+" "+field.getName());

}

 

}

private static void printParameter(Class[] parameters) {

for(int i=0;i<parameters.length;i++) {

System.out.print(parameters[i].getName());

if(i<parameters.length-1) {

System.out.println(",");

}

}

}

}

' > JAVA' 카테고리의 다른 글

java11.basic_API.time  (0) 2023.05.25
java11.basic_API.string  (0) 2023.05.25
java11.basic_API.Objects  (0) 2023.05.25
java11.basic_API  (0) 2023.05.25
java09.exception  (0) 2023.05.25