[Java] Class 클래스

SeongWon Oh·2021년 8월 17일
0

Java

목록 보기
20/39
post-thumbnail

Class 클래스

  • 컴파일 된 class파일을 로드하여 객체를 동적으로 로드하고 정보를 가져오는 메서드를 제공하는 클래스이다.

  • Class.forName("클래스 명") 메서드를 통해서 클래스를 동적으로 로드할 수 있다.

Class c = Class.forName("java.lang.String");
// java.lang.String에 대한 클래스를 동적 로딩으로 가져오는 코드

동적로딩
컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법이다. 동적로딩 방법은 프로그래밍을 할때는 문자열 변수로 처리했다가 실행을 할 때 원하는 클래스를 로딩하여 binding할 수 있다는 장점이 있으나 컴파일을 할 때 타입이 정해지지 않으므로 오타 발생과 같은 오류가 발생하면 프로그램에 장애가 발생하게 된다.

  • 아래의 코드와 같은 것을 Reflection Programming이라고 한다. local에 해당 Object가 없을때, Remote에 있는 Object나 class를 가져와야 할 때 위의 코드와 같은 Reflection programming을 통해 method들을 호출한다.
package ch04;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class StringTest {
	public static void main(String[] args) throws ClassNotFoundException {
		
		Class c = Class.forName("java.lang.String");
		
		Constructor[] cons = c.getConstructors();
		for (Constructor co: cons) {
			System.out.println(co);
		}
		
		Method[] m = c.getMethods();
		for (Method method: m) {
			System.out.println(method);
		}
		
	}
}

Reflection Programming

  • Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍이다.

  • 일반적으로는 사용하지 않고 local메모리에 사용하고자 하는 객체가 없는 경우, 원격프로그래밍을 하는 경우, 객체의 타입을 알 수 없는 경우에 사용하는 방법이다.
    (일반적으로 자료형을 알고 있는 경우엔 사용하지 않는다)

  • java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래을 한다.

👨🏻‍💻 Example Code

Person.java

package ch04;

public class Person {
	private String name;
	private int age;
	
	public Person() {}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString() {
		return name;
	}
}

ClassTest.java

package ch04;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ClassTest {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, 
	IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		// TODO Auto-generated method stub
		Class c1 = Class.forName("ch04.Person");
		
		Person person = (Person)c1.newInstance();
		// 11~13번째 줄 코드는 Person person = new Person(); 와 같은 코드이다.
		
		person.setName("Lee");
		System.out.println(person);

		
		// 이미 인스턴스가 있는 상태면 getClass를 통해 class를 불러올 수 있다.
		Class c2 = person.getClass();
		Person p = (Person)c2.newInstance();
		// newInstance를 통해 인스턴스를 생성하면 default constructor로 생성하게 된다.
		System.out.println(p);
		
		
		Class[] parameterTypes = {String.class};
		Constructor cons = c2.getConstructor(parameterTypes); 
		// 위의 코드를 통해 parameterType에 있는 constructor를 찾게된다.
		
		Object[] initargs = {"Kim"};
		Person kimPerson = (Person)cons.newInstance(initargs);
		System.out.println(kimPerson);
		
		// 21, 27~33번째 줄 코드는 Person person = new Person("Kim"); 와 같은 코드이다.
		
		// 위의 코드들은 일반적으로 사용하지 않고 local에 Person이라는 class가 없어서 
		// constructor정보를 가져와 그 정보를 이용해 생성할 때 사용한다.

	}

}



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글