오답노트/오류 해결

JAVA - 참조 자료형 변수의 오해

따뜻한 개발자 2024. 3. 17. 01:09

문제 상황

아래의 코드는 stringArraylist 에 String 배열을 하나씩 넣으려고 했지만 동일한 배열을 가르키는 로직이 만들어져버렸다

ArrayList<String[]> stringArraylist  = new ArrayList<String[]>();
String[] stringArray = new String[5];
int a = 0;
for (int line = 0; line < 5; line++) {

    for (int index = 0; index < stringArray.length; index++) {
        stringArray[index] = String.valueOf((char) (97 + (a++) % 24));
    }
    stringArraylist.add(stringArray);
}
int index = 0;
for (String[] s : stringArraylist) {
    System.out.println(index++ + " : " + s);
    for (String S : s) {
        System.out.print(S);
    }
    System.out.println();
}
<실행결과>
0 : [Ljava.lang.String;@6f2b958e
uvwxa
1 : [Ljava.lang.String;@6f2b958e
uvwxa
2 : [Ljava.lang.String;@6f2b958e
uvwxa
3 : [Ljava.lang.String;@6f2b958e
uvwxa
4 : [Ljava.lang.String;@6f2b958e
uvwxa

 

 

stringArray[index] = String.valueOf((char) (97 + (a++) % 24));

이 부분이 각기 다른 배열을 값을 넣어준다고 착각하고 새로운 배열이 만들어진다고 오해했었다

배열의 값을 바꾸는것을 맞지만

String[] stringArray = new String[5];
int a = 0;
for (int line = 0; line < 5; line++) {

    for (int index = 0; index < stringArray.length; index++) {
        stringArray[index] = String.valueOf((char) (97 + (a++) % 24));
    }
    stringArraylist.add(stringArray);
}

 

반복문을 잘 보면 String[] stringArray 는 한번만 선언되고 객체는 하나만 생겼다 그리고 동일한 stringArray 객체의 참조값을 stringArraylist 에 넣는 오류를 범했다

해결

반복문 안에 새로운 stringArray 배열을 만들고 새 배열에 값을 넣은 다음에 stringArraylist 에 넣으면 다른 객체(배열)이 생성되기 때문에 동일한 배열에 값을 변경하는 오류를 해결했다

 

자바에서는 항상 값, 참조값만 대입된다는것을 상기하자

int a = 0;
for (int line = 0; line < 5; line++) {
    String[] stringArray = new String[5];
    for (int index = 0; index < stringArray.length; index++) {
        stringArray[index] = String.valueOf((char) (97 + (a++) % 24));
    }
    stringArraylist.add(stringArray);
}
<실행결과>
0 : [Ljava.lang.String;@6f2b958e
abcde
1 : [Ljava.lang.String;@7a46a697
fghij
2 : [Ljava.lang.String;@5f205aa
klmno
3 : [Ljava.lang.String;@6d86b085
pqrst
4 : [Ljava.lang.String;@75828a0f
uvwxa