JAVA

[JAVA] Java Reflection API에서 클래스 이름 가져오기: getName() vs getCanonicalName()

깃짱 2023. 9. 12. 23:00
반응형

 

💋 인트로

이번 포스팅에서는, Java Reflection API에서 클래스의 이름을 가져오기 위해 사용하는 두 메서드에 대해서 비교해서 알아봅시다! 

 

💋 getName() vs getCanonicalName()

  • getName() 메서드
    • Class 객체의 이름을 반환합니다.
    • 클래스의 패키지 이름을 포함한 전체 경로
  • getCanonicalName() 메서드
    • Class 객체의 정규화된 이름을 반환
    • 클래스의 패키지 이름을 포함하지만, 내부 클래스의 경우에는 $으로 구분하여 표기

 

💋 코드 예시

✔️ 실행 코드

public class ExampleClass {
	public static void main(String[] args) {
		// 클래스 객체 생성
		Class<?> classObj = ExampleClass.InnerClass.class;

		// getName() 메서드 사용
		String name = classObj.getName();
		System.out.println("getName() 결과: " + name);

		// getCanonicalName() 메서드 사용
		String canonicalName = classObj.getCanonicalName();
		System.out.println("getCanonicalName() 결과: " + canonicalName);
	}

	// 내부 클래스 정의
	static class InnerClass {
	}
}

 

✔️ 실행 결과

 

 

 

위의 예시 코드에서 ExampleClass는 외부 클래스이며, InnerClass는 내부 클래스입니다.

 

getName() 메서드는 클래스의 이름을 반환합니다.

  • 외부 클래스인 ExampleClass의 경우 getName()"com.example.ExampleClass"를 반환합니다.
  • 내부 클래스인 InnerClass의 경우 getName()"com.example.ExampleClass$InnerClass"를 반환합니다.

이 메서드는 클래스의 실제 경로를 반환하며, 내부 클래스의 경우 $ 기호를 사용하여 외부 클래스와 내부 클래스를 구분합니다.

 

getCanonicalName() 메서드는 클래스의 정규화된 이름을 반환합니다.

정규화된 이름은 패키지 이름을 포함하며, 내부 클래스의 경우 .을 사용하여 외부 클래스와 내부 클래스를 구분합니다.

  • 외부 클래스인 ExampleClass의 경우 getCanonicalName()"com.example.ExampleClass"를 반환합니다.
  • 내부 클래스인 InnerClass의 경우 getCanonicalName()"com.example.ExampleClass.InnerClass"를 반환합니다.

💋 그렇다면, 두 값은 내부 클래스가 없는 상황에서는 언제나 동일할까?

네!

 

getName()과 getCanonicalName() 메서드는 내부 클래스가 없는 상황에서는 항상 동일한 값을 반환합니다.

내부 클래스가 없는 경우에는 클래스의 이름을 반환하기 때문입니다. 

 

💋 참고자료

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟

 

반응형