해결된 질문
작성
·
84
·
수정됨
0
해당 예제(22:17)의 setString(String param)에서
string 필드 변수의 값을 수정하고자 아래 구문을 사용하셨는데요,
string = param.getBytes().clone();
clone() 메서드를 사용하지 않아도(아래 구문) string 필드 변수의 수정이 가능한데, clone() 메서드를 사용한 이유를 알 수 있을까요?
string = param.getBytes();
해당 의문에 대해서 얇은/깊은 복사와 관련이 있는지 확인해보기 위해 디버깅을 해본 결과,
두 변수는 값은 같으나, 다른 메모리 위치를 갖는 것으로 확인을 했습니다.
-> clone() 메서드가 있는 코드/없는 코드 모두 위와 동일하게 동작하는 것을 확인했습니다.
그래서 다른 이유로 clone() 메서드를 사용하신 거 같은데, 어떤 이유인지 문의 드립니다.
답변 2
1
요즘은 AI가 제 생각이나 의도를 추측해주는 군요. 😄
결론부터 말씀드려 딱히 특별한 이유가 있는 것은 아닙니다. 어쩌면 제가 C/C++가 더 익숙한 편이라 그에 따른 습관처럼 작성된 것이 더 맞겠습니다.
확인하신 것처럼 String.getBytes() 함수는 String 인스턴스가 가진 문자열과 별개로 만들어진 배열 객체를 반환합니다. 그러므로 따지자면 clone() 메서드를 호출하는 것이 효율과는 거리가 멀다 하겠습니다. 그러나 Deep copy가 이루어진다는 느낌이 코드로 드러나지 않는 것도 사실입니다. 대략 이런 맥락에서 사용된 것으로 이해해주시면 고맙겠습니다.
아무튼 효율의 문제는 언급하는 것에 좋겠다는 생각이 듭니다. 지적하신 것처럼 꼭 필요한 것도 아니고요. 이를 반영해 강의를 재촬영하거나 부록편을 넣는 방법으로 보완하는 방안을 적극 고려하겠습니다. 감사합니다. 😄
1
안녕하세요, 인프런 AI 인턴입니다.
전종락님께서 질문해주신 clone()
메서드의 사용 이유에 대해 설명드리겠습니다.
param.getBytes().clone()
을 사용하는 이유는 일반적으로 얕은 복사와 깊은 복사 문제를 피하고자 하는 것입니다. clone()
메서드를 사용하면 원본 배열의 복사본을 생성하므로, 값은 동일하나 메모리 위치가 다른 새로운 배열이 생성됩니다. 이런 방식은 원본 데이터가 변경되지 않도록 보호할 수 있는 장점이 있습니다. 따라서, param.getBytes()
를 바로 대입할 경우와 달리, 새로운 객체를 생성하여 원본 데이터에 대한 의존성을 제거합니다.
하지만 전종락님께서 발견하셨듯이 해당 예제에서는 두 경우 모두 같은 방식으로 동작하여 차이가 나타나지 않은 듯합니다. 그 이유는 byte
배열의 특성상 두 방법이 큰 차이를 만들지 않을 수 있기 때문입니다. 즉, 원본에 대한 직접적인 변경의 위험이 없는 간단한 경우일 수 있습니다.
또한, clone()
을 사용하는 경우는 가독성을 위한 선택일 수도 있습니다. 코드 작성 시 명시적으로 복사본을 만들겠다는 의도를 나타내기 위한 것일 수 있습니다.
이 내용을 바탕으로, 다른 깊은 복사와 얕은 복사가 중요할 수 있는 예제를 확인해보시길 권장드립니다. 추가적인 질문이 있으시면 언제든지 문의해 주세요!
이미지 출처: 디버깅 뷰 이미지
아래 대답이 AI 결과인가요?
저는 인프런 직원분이 검색해서 알려주는 것 아닌가라고 추측했었는데.
AI만의 대답이라면 진짜 대단한 시대에 살고 있구나 싶네요.
답변 감사합니다. 참고 하겠습니다.