skdltm357   6년 전

제 소스코드가 plus면 plus ArrayList에 저장하는건데 5 500 -200 -400 50 50 이렇게 입력하면 plus ArrayList의 var값들은 plus.get(0).val plus.get(1).val plus.get(2).val 값들은 500 50 50 이 되어야 한다고 생각하는데 자꾸 plus에 처음에 500은 잘들어 가는데 50이 들어가는 순간 500도 50으로 바껴서 50 50 50으로 들어갑니다. 제가 add를 메소드를 잘못 생각하고 있는건지 왜 제대로 동작하지 않는지 모르겠습니다.

isku   6년 전

Plus pTmp = new Plus();

17번째 줄에 선언한 변수 pTmp가 문제인 것 같네요.


if (tmp>0) {

    pTmp.val=tmp;

    pTmp.idx=i;

    plus.add(pTmp);

}


위 코드에서 for문을 돌기 전에 선언한 pTmp를 값만 바꿔서 ArrayList에 똑같은 pTmp를 add하고 있습니다.

객체단위의 주소 참조를 이해하셔야 하는데,

pTmp의 주소값이 A라고 한다면, ArrayList에는 실제로 pTmp의 주소를 index별로 A A A ... 이렇게 순서대로 저장하고 필요할 때 해당 주소에서 값을 가져오는 것입니다.

즉, 500을 넣고 50을 넣었지만, 똑같은 객체가 나열되어 있으니 그 중 한 객체의 값을 바꾸면 나머지 모두도 똑같기 때문에(실제론 객체의 주소가 같기 때문에) 가장 마지막에 값을 바꾼 50이 최종적으로 저장됩니다.

JAVA 언어로 코딩을 하다보면 위와 같은 문제가 아니더라도 비슷한 문제에 자주 마주치게 될 것이니 특히 주의하셔야 합니다.


isku   6년 전

해결 방법으로는 pTmp를 for문을 돌면서 위 코드처럼 매번 새로운 객체로 선언하여 생성하는 것입니다.
이렇게 하면 pTmp는 매번 생성할 때마다 같은 변수명이지만 서로 다른 주소값을 가지게 되므로 다른 객체과 됩니다.

따라서 500을 넣은 pTmp의 객체와, 50을 넣은 pTmp의 객체가 서로 다르다는 것을  작성하신 코드와 어떻게 다른지 이해하는 것이 가장 중요한 점입니다.

skdltm357   6년 전

감사합니다 ArrayList의 개념을 제대로 모르고 있었네요. 해결했습니다! 친절한 답변 감사합니다.

댓글을 작성하려면 로그인해야 합니다.