[Java 클래스] Class 클래스

2022. 2. 5. 12:12·Java & Kotlin
목차
  1. Class 클래스
  2.  
  3. 동적 로딩
  4. 클래스 정보 알아보기

Class 클래스

  • 자바의 인터페이스나 클래스를 컴파일하면 .class 파일이 생성된다.
  • Class 클래스는 컴파일 된 .class 파일을 로드하여 객체를 동적 로드하고, 클래스에 대한 정보 등을 가져오는 메서드를 제공한다.
  • Class.forName(String className) : 매개변수로 들어가는 클래스나 인터페이스에 대해 동적 바인딩을 해준다. (실행 중에 필요한 클래스를 로딩)
Class c = Class.forName("java.lang.String");
  • 클래스 이름으로 직접 Class 가져오기
Class c = String.class;
  • 생성된 인스턴스에서 클래스 가져오기
String s = new String();
Class c = s.getClass();

 

동적 로딩

  • 일반적으로 자바에서 프로그래밍 할 때 타입을 선언해서 변수를 사용한다.
  • 컴파일 타임에 클래스가 로컬에 있는지 보고 바인딩이 되고, 타입이 정해지면 변수가 사용된다.
  • 동적 로딩은 컴파일 시에 데이터 타입이 바인딩 되는 것이 아닌 실행(runtime) 중에 바인딩 하는 것이다.
  • 컴파일 타임에 어떤 클래스를 로딩시킬지 모르는 경우가 있기 때문에 런타임에 원하는 클래스를 로딩하여 그때그때 원하는 클래스를 불러들일 수 있다는 장점이 있다. (속도는 느릴 수 있음)
  • e.g. JDBC - DB의 데이터를 읽기 전까지 라이브러리가 무엇인지 모를 수 있다. → 변수로 가지고 있다가 드라이버 이름을 스트링 변수에 넣어준다.
  • 컴파일 시 타입이 정해지지 않으므로 런타임에 불렀는데 클래스가 존재하지 않을 경우 프로그램에 심각한 장애가 발생할 수 있다.

 

클래스 정보 알아보기

  • reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드) 등을 가져오고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
  • 로컬 메모리에 객체가 없는 경우, 원격(remote) 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용한다.
  • java.lang.reflect 패키지에 있는 클래스를 활용한다.
  • 일반적으로 자료형을 알고 있는 경우에는 사용하지 않는다.
  • Class의 newInstance() 메서드로 new 키워드를 사용하지 않고 클래스 정보를 활용해 인스턴스를 생성할 수 있다.

※ 같은 메모리 공간에 있지 않은 것 : remote

 

StringTest.java
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) {	// java.lang.String의 생성자 출력
			System.out.println(co);
		}
		
		Method[] mthds = c.getMethods();
		
		for(Method mthd : mthds) {	// java.lang.String의 메서드 출력
			System.out.println(mthd);
		}
		
	}

}

 

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

getConstructor부분에서 오류가 난다,, exception throw도 다 잘 써준 것 같은데 왜 나는겨ㅠ

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 {
		
		Class c1 = Class.forName("ch04.Person");
		Person p1 = (Person) c1.newInstance();
		
		p1.setName("Lee");
		System.out.println(p1);	// toString 출력
		
		Class c2 = p1.getClass();	// 인스턴스가 있는 상태에서 클래스를 가져올 수 있음
		Person p2 = (Person) c2.newInstance();	// default constructor 호출
		System.out.println(p2);
		
		// 로컬에 Person 클래스가 없을 때 사용
		Class[] parameterTypes = {String.class};
		Constructor cons = c2.getConstructor(parameterTypes);
		
		Object[] initargs = {"Kim"};
		Person kimPerson = (Person)cons.newInstance(initargs);
		System.out.println(kimPerson);
		
	}

}
저작자표시 비영리 변경금지 (새창열림)

'Java & Kotlin' 카테고리의 다른 글

[Java 자료구조] 여러가지 자료구조 (1)  (0) 2022.02.05
[Java 클래스] 자바의 문자열 관련 클래스  (0) 2022.02.03
[Java 클래스] Object 클래스의 메서드 활용  (0) 2022.02.03
  1. Class 클래스
  2.  
  3. 동적 로딩
  4. 클래스 정보 알아보기
'Java & Kotlin' 카테고리의 다른 글
  • [Java 자료구조] 여러가지 자료 구조 (2)
  • [Java 자료구조] 여러가지 자료구조 (1)
  • [Java 클래스] 자바의 문자열 관련 클래스
  • [Java 클래스] Object 클래스의 메서드 활용
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 클래스] Class 클래스

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.