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

TaeChoon Pakr님의 프로필 이미지
TaeChoon Pakr

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

복사(값)와 참조

9:55 knight.clone()호출시 원본의 제거

작성

·

229

0

안녕하세요

9:55를 보면 Knight class객체를 하나 생성하여 그 객체를 리턴하는 Knight 클래스의 함수 clone()을 이용하여  Main에서 새로운 Knight class객체를 생성하고 있는데요 , 

강의에서 말씀하셨다시피 클래스는 전달시 참조가 기본방식으로 알고있습니다.

그럼 clone 함수내에서 생성된 Knight 클래스 객체를 리턴시 참조로 리턴되는것이고 

그럼 Main에서 Knight2 객체는 clone함수내에서 생성된 knight클래스 객체를 참조하는것이 되는것인데 문제는 clone함수가 호출이 종료되며 knight2클래스가 참조로 나타내는 knight클래스객체가 소멸되는건데 , c++ 에서는 이러면 원본이 삭제되는것이니 문제가 발생하는것으로 알고있습니다.

답변부탁드립니다!

답변 2

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

clone함수가 호출이 종료되며 knight2클래스가 참조로 나타내는 knight클래스객체가 소멸되는건데

-> 그렇지 않습니다! 함수 호출 완료와 객체 소멸은 별다른 연관성이 없습니다.

c++ 에서는 이러면 원본이 삭제되는것이니 문제가 발생하는것으로 알고있습니다.

-> C++에서도 역시나 함수 호출과 원본 삭제는 무관합니다.
아마 이런 오해를 하시는 것은 다음 상황과 착각을 하시는 것으로 보입니다.
1. 함수 호출이 완료되면서 스택 프레임이 정리되고
2. 스택 메모리에 있던 데이터는 유효하지 않으니
3. 혹시라도 스택의 주소를 포인터로 return하면 문제가 된다

new이용한 동적 할당을 하면
스택이 아닌 힙에 객체가 올라가기 때문에,
함수 호출이 완료된다 하더라도 별다른 문제가 발생하지 않습니다.

참고로 C++로 비유하면 현재 상황은 shared_ptr을 만들고 return해준 상황입니다.
(C#은 정확히 refcount 방식으로 관리되진 않지만, 개념적으로는 어쨋든 살아 있다고 보시면 됩니다.)

0

TaeChoon Pakr님의 프로필 이미지
TaeChoon Pakr
질문자

아하^^~~ 

답변과함께 바로 다음강이 이내용을 다루고있어 다음강을 보니 더 자세히 이해되네요!!

Knight클래스 본체 개체는 힙에 동적할당되고 그 주소를 가져오는개념인지는 몰랐네요

좋은답변과 강의 감사합니다^^

TaeChoon Pakr님의 프로필 이미지
TaeChoon Pakr

작성한 질문수

질문하기