상속과 오지랖의 콜라보 예제에서 clone() 메서드에 대한 문의드립니다.
해당 예제(22:17)의 setString(String param)에서
string 필드 변수의 값을 수정하고자 아래 구문을 사용하셨는데요,
string = param.getBytes().clone();
clone() 메서드를 사용하지 않아도(아래 구문) string 필드 변수의 수정이 가능한데, clone() 메서드를 사용한 이유를 알 수 있을까요?
string = param.getBytes();
해당 의문에 대해서 얇은/깊은 복사와 관련이 있는지 확인해보기 위해 디버깅을 해본 결과,

두 변수는 값은 같으나, 다른 메모리 위치를 갖는 것으로 확인을 했습니다.
-> clone() 메서드가 있는 코드/없는 코드 모두 위와 동일하게 동작하는 것을 확인했습니다.
그래서 다른 이유로 clone() 메서드를 사용하신 거 같은데, 어떤 이유인지 문의 드립니다.
답변 2
2
요즘은 AI가 제 생각이나 의도를 추측해주는 군요. 😄
결론부터 말씀드려 딱히 특별한 이유가 있는 것은 아닙니다. 어쩌면 제가 C/C++가 더 익숙한 편이라 그에 따른 습관처럼 작성된 것이 더 맞겠습니다.
확인하신 것처럼 String.getBytes() 함수는 String 인스턴스가 가진 문자열과 별개로 만들어진 배열 객체를 반환합니다. 그러므로 따지자면 clone() 메서드를 호출하는 것이 효율과는 거리가 멀다 하겠습니다. 그러나 Deep copy가 이루어진다는 느낌이 코드로 드러나지 않는 것도 사실입니다. 대략 이런 맥락에서 사용된 것으로 이해해주시면 고맙겠습니다.
아무튼 효율의 문제는 언급하는 것에 좋겠다는 생각이 듭니다. 지적하신 것처럼 꼭 필요한 것도 아니고요. 이를 반영해 강의를 재촬영하거나 부록편을 넣는 방법으로 보완하는 방안을 적극 고려하겠습니다. 감사합니다. 😄
1
아래 대답이 AI 결과인가요?
저는 인프런 직원분이 검색해서 알려주는 것 아닌가라고 추측했었는데.
AI만의 대답이라면 진짜 대단한 시대에 살고 있구나 싶네요.
답변 감사합니다. 참고 하겠습니다.
1
안녕하세요, 인프런 AI 인턴입니다.
전종락님께서 질문해주신 clone() 메서드의 사용 이유에 대해 설명드리겠습니다.
param.getBytes().clone()을 사용하는 이유는 일반적으로 얕은 복사와 깊은 복사 문제를 피하고자 하는 것입니다. clone() 메서드를 사용하면 원본 배열의 복사본을 생성하므로, 값은 동일하나 메모리 위치가 다른 새로운 배열이 생성됩니다. 이런 방식은 원본 데이터가 변경되지 않도록 보호할 수 있는 장점이 있습니다. 따라서, param.getBytes()를 바로 대입할 경우와 달리, 새로운 객체를 생성하여 원본 데이터에 대한 의존성을 제거합니다.
하지만 전종락님께서 발견하셨듯이 해당 예제에서는 두 경우 모두 같은 방식으로 동작하여 차이가 나타나지 않은 듯합니다. 그 이유는 byte 배열의 특성상 두 방법이 큰 차이를 만들지 않을 수 있기 때문입니다. 즉, 원본에 대한 직접적인 변경의 위험이 없는 간단한 경우일 수 있습니다.
또한, clone()을 사용하는 경우는 가독성을 위한 선택일 수도 있습니다. 코드 작성 시 명시적으로 복사본을 만들겠다는 의도를 나타내기 위한 것일 수 있습니다.
이 내용을 바탕으로, 다른 깊은 복사와 얕은 복사가 중요할 수 있는 예제를 확인해보시길 권장드립니다. 추가적인 질문이 있으시면 언제든지 문의해 주세요!
이미지 출처: 디버깅 뷰 이미지
compareTo를 사용하는 이유가 뭔가요?
0
44
1
[실습] MyString에 복사 생성자 추가
0
38
1
안녕하세요~ 회수라는 의미에 대해서 질문합니다.
0
71
1
equals의 재정의(overriding)에 대해서
0
80
2
TestEx 객체 생성 시 생성자 호출 질문
0
61
2
[MyString 실습 인스턴스 중복 생성 문의] MyString.setString(String param)
0
100
2
주소록 실습 3단계에서 막혔어서 조언을 구하려고 질문 드립니다.
0
85
2
해시 알고리즘 관련으로 질문이 있습니다.
0
73
2
21분 경 Old generation의 GC 설명 질문입니다.
0
102
3
임시 객체의 첫 번째 상황에 대한 질문
0
70
2
String 객체가 하나 더 생성되는 이유가 궁금합니다
0
188
3
하위 클래스와 상위 클래스의 생성자 순서
0
103
2
GC의 age와 관련하여 질문 있습니다.
0
97
2
Object Header 의 Klass word (39강 36:00)
0
115
2
method area는 이름이 class area가 아니고 왜 method aread인지 궁금합니다.
0
139
2
교안 p.305 'throw 필수' 질문
0
81
1
Metaspace에 대한 질문
0
257
2
clone() 메서드를 재정의함으로써 Deep copy로 구현한다로 이해하면 될까요?
0
120
2
MyListEx 질문드립니다.
1
136
1
part3 강의 개강
0
197
2
문자열 비교 강좌에서 문자열 선언 방법 간에 hashCode() 값 관련한 질문입니다.
0
222
2
보이지 않는 임시 객체의 자막 수정 요청
0
115
2
스레드 관련해서 질문이 있습니다.
0
203
1
metaspace 관련 문의드립니다.
0
199
2





