인프런 커뮤니티 질문&답변

오늘도님의 프로필 이미지
오늘도

작성한 질문수

기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM

[실습] MyString에 복사 생성자 추가

[실습3-2] MyString에 복사 생성자 만들기에서 deepCopy( ) 메서드 리턴 타입

해결된 질문

작성

·

108

1

안녕하세요.
정말 별거 아닌 질문이지만..

[실습] MyString에 복사 생성자 추가
1:50초에서
deep copy를 위한 메서드를 만들라고 하실 때
메서드의 리턴 타입을 MyString으로 하라고 하셨는데..
void라고 이해해도 될까요?..

좋은 강의 감사히 잘 보고 있습니다.
항상 건강하세요!

답변 3

3

 
public MyString(MyString rhs){
    this.string = rhs.string.clone();
  }

public MyString deepCopy(MyString rhs){
    return new MyString(rhs);
  }

뒤에 설명해주신 복사생성자에서 copy를 호출하라는 말씀이 있긴 했지만,

 

강의자료에 써주신 대로 리턴값(MyString) 제시해주신것을 보고 저는 이렇게 (반대로) 구현하게 되었네요.

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

와우~! 잘 하셨습니다. 거기에 이런 방법도 있음을 생각해보시면 어떨까요?

return this;

참고가 되시면 좋겠습니다. 😄

deepCopy 함수를 클론 함수처럼 생각했는데,

byte객체를 clone에서 새로운 객체로 만들었으니, MyString 객체 자체에 새로운 객체를 만들어 리턴할 필요는 없었네요!

제시해주신 방법이 메모리를 덜 사용하는 좋은 방법인것 같습니다.

답변 감사합니다!!

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

나중에 배울 내용이지만...

MyString 클래스를 '불변 객체'로 만들 것이라면 Space님이 하신 것처럼 구현해야 합니다! 그러나 클래스 내부에서만 사용되는 private으로 선언할 생각이라면 제가 말씀드린 방법이 괜찮은 선택이 됩니다. 이 참에 미리 예습을 해두시는 것이 좋겠습니다. 부디 이런 대화가 더 나은 학습성과로 이어지기를 희망해봅니다. 😄

질문 올려주셨던 오늘도님께서 코드 올려주셨던게 있었나 싶어서 찾아보았으나 따로 코드를 올려주셨던건 없는데, 아마 질문자분과 저를 헷갈리신게 맞겠죠..?

저 또한 강의를 보고 리턴타입과 정답이 달라서 질문을 올리려고 보니 이미 오늘도님께서 올려주셔서, 제가 이해한 방법을 공유드리려 올려봤습니다!

공유하다보니 호성님께서 직접 여러가지 방법 그리고 더 다양한 관점들을 제시해주셔서, 찾아보고 많은 생각을 할 수 있었네요.

좋은말씀 감사합니다 ㅎㅎ

남은 강의 꼼꼼히 학습하겠습니다.

2

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

문제에 보이는 MyString copy(MyString rhs); 메서드 시그니처 때문에 혼란이 생긴 것 같습니다. 우선 정답에서는 void를 반환하는 것으로 구현되어 있습니다. 결과적으로 실습문제에 보이는 반환 형식은 오류에 준하는 '오타'에 해당하겠습니다.

별것 아니라 하셨으나 충분히 혼란을 야기 할 수 있는 오류가 되겠습니다. 이 부분은 오늘 바로 수정(재촬영)해서 영상을 다시 업로드하겠습니다.

그리고 감사의 뜻으로 12월 오픈 예정인 '독하게 시작하는 Java - Part 3'의 수강권을 드리겠습니다.
cx8537@naver.com으로 본인의 닉네임과 인프런 가입 메일 계정을 보내주시기 바랍니다. 강의가 오픈될 때 무료로 수강하실 수 있도록 조치하겠습니다. 감사합니다. 😄

오늘도님의 프로필 이미지
오늘도
질문자

세상에!!
감사합니다. 열심히 공부하겠습니다!!

0

안녕하세요, 인프런 AI 인턴입니다. 오늘도님!

강의에서 다루는 deep copy 함수의 리턴 타입에 관한 질문을 해주셨네요. C++에서 deep copy 메서드를 만들 때, 리턴 타입을 MyString 클래스로 하라는 경우가 있습니다. 이는 복사 생성자가 객체를 반환하도록 함으로써 객체의 깊은 복사를 수행하기 위함입니다. 그러나, 메서드의 목적에 따라 void로 정의하는 것도 가능합니다. 이때는 단순히 클래스 내부의 멤버들만을 복사하도록 구현됩니다.

복사 생성자는 일반적으로 호출되는 메서드가 아니기 때문에, 리턴 타입이 MyString으로 지정될 때는, 보통 메서드 체이닝과 같은 특정 시나리오를 유용하게 지원하기 위한 경우입니다.

기본적으로, deepCopy() 메서드가 클래스의 상태를 바꾸고 객체 자신을 반환해야 하는 경우라면 MyString 타입으로, 그렇지 않다면 void로 선언해도 문제가 없습니다. 다만, 강의 상황과 목적에 따라 어떤 선택이 더 좋은지는 강의 내용과 의도를 반영한 것입니다.

이와 관련한 유사한 질문으로 강의에서 어떤 의도로 설명을 했는지 확인하시려면 아래 링크를 참고하시면 좋습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오늘도님의 프로필 이미지
오늘도

작성한 질문수

질문하기