해결된 질문
작성
·
122
0
강사님 안녕하세요.
"[실습] MyString 클래스 생성자 다중 정의" 강의 6:21 설명에서 생성자에서 this.setString(param)
을 실행할 경우, String
객체가 하나 더 생성된다 하셨습니다.
저는 여기서 param
이 객체 참조를 넘겨주어서 따로 객체가 생성되지 않을 것이라 생각했는데 혹시 어떤 이유로 생성되는지 궁금합니다.
답변 3
0
참, 좋은 질문과 오류를 수정해주셨는데 제가 무료 수강권 드리는 것을 깜빡했네요.
cx8537@naver.com로 제 강의 중 무료수강을 원하시는 강의를 하나 선정해 메일 주시기 바랍니다. 인프런 회원 가입 시 적용한 메일 계정으로 보내주시면 수강자로 즉시 등록해드리겠습니다.
다시 한 번 감사말씀드립니다. 😄
0
저는 여기서 "String 객체가 생성된다"를 "String 인스턴스가 생성된다"로 이해했는데 잘못 이해한 것일까요? 잘못 이해했다면 객체가 생성된다는 의미가 참조를 생성한다는 의미로도 해석이 되는건지 궁금합니다.
강사님, 계속 질문을 드려 죄송합니다. 하지만 여전히 인스턴스가 하나 더 생기는 것을 잘 이해하기 어렵습니다.
this.setString(param)
을 호출하면 동일한 인스턴스에 대한 참조가 하나 더 생기는 것이고, 인스턴스는 그대로 1개일 것이라 생각했습니다.
AI 답변의 경우, 1번에서 "동일한 참조를 유지하기 위해 새로운 String
객체가 생성될 수 있다"라고 했지만 참조는 인스턴스가 아닌 것으로 알고 있습니다.
2번 답변의 경우, "Pool에서 기존의 문자열 객체를 사용한다"라고 하고 있으며 this.setString(param)
은 param
에 대해 연산을 하고 있지 않아서 인스턴스를 생성하지 않는다고 생각했습니다.
그림으로 표현하면 다음처럼 된다고 생각했습니다.
혹시 잘못된 부분이 있을까요?
다시 확인해보니 본인이 생각하고 있는 내용이 맞습니다. 메서드의 매개변수인 param은 클래스 인스턴스에 대한 참조자일뿐 새 인스턴가 되지는 않습니다. 사실 더 큰 문제는 다른 곳에 있는데 그 부분에 관한 설명이 누락된 것 같습니다. 내부적으로 byte[]을 사용하고 있도록 MyString 클래스가 구현됐는데 코드를 다음과 같이 수정해야 적절합니다.
public void setString(String param) {
string = param.getBytes().clone();
}
이와 관련해 예제를 수정하긴 했으나 설명은 그대로인 문제가 확인됐네요. 결국 이 질문에 대해 두 문제점을 말씀드릴 수 있겠습니다.
String 클래스가 불변 객체라고 하지만 매개변수로 전달 시 참조자이므로 객체가 둘로 늘어나지는 않는다는 점과
String.getBytes() 메서드는 byte[]에 대한 참조를 반환하므로 결과적으로 얕은 복사 이슈가 발생할 수 있다는 문제
가 있습니다.
영상 및 관련 내용을 빨리 수정해야 할 것 같네요. 제보 감사드리며 수정 후 예제 및 영상을 다시 업로드 하겠습니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다. ZZAMBA님, “기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM” 강의 관련 질문에 대해 답변 드리겠습니다.
이 부분은 Java의 문자열 처리 방식과 관련이 있습니다. Java에서 문자열은 불변(immutable) 객체로 관리됩니다. 이는 문자열의 변경이 필요할 경우 새로운 String
객체가 생성되는 이유 중 하나입니다.
String 객체의 불변성: param
으로 받은 String을 다른 메서드에서 사용하려고 할 때, 동일한 참조를 유지하기 위해 새로운 String
객체가 생성될 수 있습니다. 이는 메모리에서의 효율적인 관리와 장기적인 참조 무결성을 보장하기 위함입니다.
String Pool의 활용: Java는 문자열을 관리할 때, 힙(heap) 영역의 String Pool을 사용합니다. 동일한 문자열이 여러 번 사용될 경우 새 객체를 생성하지 않고 Pool에서 기존의 문자열 객체를 사용합니다. 하지만 메서드 내부에서의 변경이 발생하면 새로운 객체를 생성합니다.
이러한 이유로 강의에서 this.setString(param)
실행 시 새로운 String 객체가 생성될 수 있는 것입니다.
추가적으로 String의 불변성 및 String Pool을 활용한 메모리 최적화에 대해 알아보시면 더 깊은 이해가 가능하실 것입니다.
관련된 질문과 정보는 다음의 URL에서도 확인하실 수 있습니다:
- Java에서 String 객체의 생성과 관리
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
헉 이걸 바라고 질문 드린 것은 아니지만...감사합니다..!
로드맵 전부 따라가는 중입니다. 특히 JVM이랑 연관지어 자세히 설명해 주시는 것이 굉장히 유익합니다. 좋은 강의 감사합니다!