제목 그대로입니다.
만약,
public static void main(String[] args) {
String a = "abc";
char[] ca = a.toCharArray();
for (int i = 0; i < ca.length; i++) {
ca[i] = 'a';
}
System.out.print(ca); //출력 결과 : aaa
}
이라는 코드가 있다면,
간지와 가독성을 위해서
아래처럼 쓰고싶을 수 있습니다.
public static void main(String[] args) {
String a = "abc";
char[] ca = a.toCharArray();
for (char e : ca) {
e = 'a';
}
System.out.print(ca); //출력 결과 : abc
}
근데 옆에 주석 달아놨듯이
for-each 문에서는
e의 값을 변경해도 실제 데이터는 변경이 안됩니다.
왜그런가 궁금해서 확인해봤습니다.
for-each 루프는 배열의 요소를 복사하여 새로운 변수에 할당합니다. 따라서 이 변수의 값을 변경하더라도 원본 배열의 요소는 변경되지 않습니다. 즉, for-each 루프에서는 배열의 요소에 직접적으로 접근하여 수정하는 것이 아니라 복사된 값을 참조하게 됩니다.
예를 들어, for (char e : ca)에서 e는 ca 배열의 요소를 복사한 값이므로 e를 수정하여도 ca 배열의 해당 요소에는 영향을 미치지 않습니다. 따라서 수정된 값을 원본 배열에 반영하려면 인덱스를 사용하여 직접 요소에 접근하고 수정해야 합니다.
- gpt의 답변
그렇다면 왜 복사본을 참조하는 것일까?
추가질문을 해보았습니다.
for-each 루프를 사용할 때 원소를 직접 참조하지 않고 복사본을 만드는 이유는 수정 작업에 대한 안전성과 원본 데이터의 보호를 위해서입니다.
일반적으로 배열의 요소를 수정하거나 변경하는 작업은 원본 데이터를 보호하고자 할 때 복사본을 만들어 작업을 수행합니다. 이렇게 하면 원본 데이터가 변경되지 않으며, 작업을 수행한 복사본만 변경됩니다.
for-each 루프에서 배열의 경우 원본 데이터의 무결성을 보존하기 위해 복사본을 사용하는 것이 좋습니다.
따라서
for-each 루프를 사용할 때는 원본 데이터를 직접 수정하는 것보다 복사본을 사용하여 작업을 수행하는 것이 안전하고 바람직한 방법입니다.
- gpt의 답변
원본 데이터를 직접 변경하는 것은
데이터의 무결성을 해칠 수 있기 때문에
그렇다고 합니다.
이제 와서 생각해보면,
만약 일반 for 문이랑 정말 똑같이 기능했다면,
for-each 문은 정말 가독성 외엔
오히려 인덱스 값을
가지고 놀지 못해서 불편한 면도 있기 때문에,
뭔가 다른점이 있지 않을까
라는 생각도 할 수 있었을 것 같습니다.
그게 바로 복사본을 만들어서 참조한다는 것이었고,
여태 모르고 코드를 잘 짠 게 신기하지만,
이제라도 알았으니 조심해야겠습니다.
'알고리즘 및 개념 정리' 카테고리의 다른 글
[JAVA] 정렬을 코드로 구현하기. (삽입, 선택, 버블, 셸, 퀵, 합병, 힙, 기수) (0) | 2024.03.30 |
---|---|
등차수열, 등차수열의 일반항, 등차수열의 합. (feat. 피보나치 수열) (0) | 2024.03.30 |
imos 법 (いもす 法, imos 法) 에 대한 간략한 소개 및 설명. (0) | 2024.03.09 |
2진, 8진, 10진, 16진법과 상호 간의 변환 (0) | 2024.03.04 |
"경우의 수" , "팩토리얼" , "순열" , "조합" (1) | 2024.03.01 |