[java] Java에서 동적 이름으로 변수 할당

다음과 같이 Java에서 변수 집합을 할당하고 싶습니다.

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

Java에서 어떻게이 작업을 수행 할 수 있습니까?



답변

이것은 Java에서 작업하는 방법이 아닙니다. Java에는 동적 변수가 없습니다. Java 변수는 소스 코드 1 에서 선언해야합니다 .

달성하려는 목표에 따라 배열 a List또는 a를 사용해야합니다 Map. 예 :

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

리플렉션을 사용 하여 소스 코드에서 선언 된 변수 를 동적으로 참조 할 수 있습니다. 그러나이 클래스 멤버 인 변수 (예 : 정적 및 인스턴스 필드)에 작동합니다. 지역 변수에는 작동하지 않습니다. @fyr의 “quick and dirty”예제를 참조하십시오.

그러나 Java에서 불필요하게 이런 일을하는 것은 나쁜 생각입니다. 비효율적이며 코드가 더 복잡하며 런타임 검사에 의존하기 때문에 더 취약합니다. 그리고 이것은 “동적 이름을 가진 변수”가 아닙니다. 정적 이름을 가진 변수에 대한 동적 액세스로 더 잘 설명됩니다.


1-그 진술은 약간 부정확합니다. BCEL 또는 ASM을 사용하는 경우 바이트 코드 파일에서 변수를 “선언”할 수 있습니다. 하지만하지 마세요! 그 방법은 광기입니다!


답변

어떤 종류의 동적 변수에 액세스하려면 리플렉션을 사용할 수 있습니다. 그러나 Reflection은 지역 변수에 대해서는 작동하지 않습니다. 클래스 속성에만 적용 할 수 있습니다.

대략적인 빠르고 더러운 예는 다음과 같습니다.

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

이 코드를 다양한 방법으로 개선해야하는 것은 단지 예일뿐입니다. 이것은 또한 좋은 코드로 간주되지 않습니다.


답변

필요한 것은 배열입니다. 다음 코드를 작성하고 싶었습니다.

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}


답변

List또는 array대신 사용해야 합니다.

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

또는

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

또는 더 나은

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");


답변

자바의 동적 변수 이름
그런 것은 없습니다.

귀하의 경우에는 배열을 사용할 수 있습니다.

int[] n = new int[3];
for() {
 n[i] = 5;
}

보다 일반적인 (name, value)쌍의 경우Map<>


답변

이 방법을 시도하십시오.

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }


답변

당신은하지 않습니다. 당신이 할 수있는 가장 가까운 일은 그것을 시뮬레이션하기 위해 맵으로 작업하거나 처리 할 자신의 오브젝트를 정의하는 것입니다.