본문 바로가기

Java/Java 기초

Java Reflection 사용하기 (7)

이 문서는 Oracle Technology Network에 포스팅되었던 Using Java Reflection을 참고하여 작성되었습니다. 원문은 아래의 링크에서 확인하실 수 있습니다.


Using Java Reflection

https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


배열의 사용

reflection의 마지막 단계는 배열을 만들고 조작하는 것입니다. Java에서의 배열은 특수한 형태의 class이며, 배열 참조는 객체 참조로 할당할 수 있습니다.


배열이 작동하는 방식을 확인하기 위해 아래의 예시를 생각해보겠습니다.


import java.lang.reflect.*;

public class array1 {
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("java.lang.String");
            Object arr = Array.newInstance(cls, 10);
            Array.set(arr, 5, "this is a test");
            
            String s = (String) Array.get(arr, 5);
            System.out.println(s);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}


위 예시에서는 길이 10의 String 배열을 생성하고, set함수를 이용하여 배열의 5번째 자리에 string 값을 넣어줬습니다. 그리고 get을 이용하여 배열에 접근하고 값을 가져왔습니다. 더 복잡한 조작을 위해 다음 코드를 참고하도록 합니다.


import java.lang.reflect.*;

public class array2 {
    public static void main(String args[]) {
        int dims[] = new int[] { 5, 10, 15 };
        Object arr = Array.newInstance(Integer.TYPE, dims);

        Object arrobj = Array.get(arr, 3);
        Class cls = arrobj.getClass().getComponentType();
        System.out.println(cls);
        
        arrobj = Array.get(arrobj, 5);
        Array.setInt(arrobj, 10, 37);

        int arrcast[][][] = (int[][][]) arr;
        System.out.println(arrcast[3][5][10]);
    }
}


이 예시에는 5 x 10 x 15 크기의 배열을 만들고, [3][5][10]번째 주소에 값 37을 넣어주었습니다. 코드를 보면 다차원 배열은 결국 배열안의 배열이라는 것을 알 수 있습니다. 예를 들어, 첫번째 Array.get 을 통해 가져온 arrobj는 [10][15] 배열입니다. 한번더 get으로 가져온 arrobj는 길이 15의 배열이 되며, set으로 이중 10번째 자리에 37을 넣어주었습니다. 배열은 이처럼 동적으로 생성하고 할당이 가능하기 때문에 컴파일 시점에 알필요가 없는 것입니다.


마무리

Java Reflection은 클래스와 데이터 구조를 이름을 이용하여 동적으로 탐색하고, Java 프로그램의 실행시점에 조작이 가능하는 점에서 유용합니다. 이 특성은 C, C++, Fortran, Pascal 같은 일반적 언어와는 다른 매우 강력한 기능이라는 점을 기억해두시기 바랍니다.

'Java > Java 기초' 카테고리의 다른 글

Java Custom Annotation  (0) 2020.05.13
ParallelStream의 결과를 List에 저장  (1) 2019.11.08
Java Reflection 사용하기 (6)  (0) 2019.02.15
Java Reflection 사용하기 (5)  (0) 2019.02.15
Java Reflection 사용하기 (4)  (0) 2019.02.15