chmp1408   1년 전

자바에서 객체를 넘겨서 하는 작업에 의문점이 생겨 질문드립니다.

55라인 heapSort 메소드에서 ary 객체를 받아서 createHeap(ary)을 하면 별도의 리턴을 받지 않아도 ary가 최소힙으로 만들어진 상태가 됩니다. ary객체를 그대로 넘겨서 그런거같은데

61라인 deleteRoot(ary)을 호출할때도 마찬가지로 ary객체(최소 힙으로 구현된 상태)를 넘겨주면 

43라인  ary보다 길이가 1 작은 newHeap에 ary의 루트를 제외한 값들을 그대로 넣어주고 newHeap을 다시 createHeap()에 넘겨주어 newHeap을 최소 힙으로 만들어 주고 ary가 재구성된 최소힙인 newHeap을 가르키게 합니다.

근데 여기서 deleteRoot가 root를 리턴해주고 다시 호출 되었던 61라인으로 돌아가면 ary가 재구성된 newHeap이 아닌 재구성 되기 이전의 ary 그대로 입니다.

createHeap() 에서는 넘겨준 ary의 값이 수정되고 함수가 종료 되어도 수정된 값이 그대로 유지 되었는데

deleteRoot() 는 왜 함수가 종료되면 ary가 수정되기 이전의 값을 그대로 가지고 있는지에 대해서 알고 싶습니다.

djm03178   1년 전

deleteRoot의 "파라미터"인 ary는 61번째 줄에서 넘겨주는 "인자" ary와는 서로 다릅니다. 두 변수는 모두 같은 오브젝트를 처음에 가리키고 있는 것은 맞으나 그들 자체는 서로 다릅니다.

비유를 하자면, A라는 사람(인자 ary)가 B라는 사람 (파라미터 ary)에게 똑같이 '아무개'(가리키고 있던 오브젝트)를 가리키도록 지시했는데, 50번째 줄에서 B라는 사람이 새로 만들어진 '홍길동'을 가리키게 된 것입니다. deleteRoot에서는 '홍길동'만 값을 변경했고 '아무개'는 변경하지 않았습니다. A는 여전히 '아무개'를 가리키고 있는 상태입니다.

반면에 createHeap에서는 B가 계속 '아무개'를 가리키고 있던 상태로 값을 수정했으니 '아무개'의 값이 바뀝니다.

chmp1408   1년 전

djm03178

같은 객체라 무조건 그 객체의 값이 수정되는줄 알았는데 인자와 파라미터를 구분해서 생각해야 하는군요. 정말 감사합니다!

chmp1408   1년 전

djm03178

한가지만 더 여쭤봐도 될까요...? 그렇다면 deleteRoot 에서 인자 ary가 newHeap을 가르키게 하려면 어떻게 해야 할까요..?ㅠㅠ 파라미터 ary를 리턴시켜주는 방법 밖엔 없나요...?

djm03178   1년 전

자바를 거의 쓰지 않아서 잘은 모르겠지만 리턴이 제일 확실한 방법인 것 같습니다. 그게 아니라면 오브젝트 자체의 레퍼런스를 얻을 수 있도록 다른 객체의 원소로서 존재하게 하는 식으로는 가능하지 않을까 싶네요.

chmp1408   1년 전

djm03178

친절하고 정확한 답변 너무나도 감사드립니다. 덕분에 한 걸음 더 나갈 수 있게 되었네요 ㅠㅠ

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