버그 해결을 위한 모든 질문을 던져
+1 vote
488 views
public void MakeSheet()
{
	var sheet = m_sheetTechTree;
	if (sheet == null) return false;

	sheet.Clear();


	sheet.AddItem(); // 아이템 추가.

	sheet.Update(); // 업데이트
}

 

간단하게 예를 들면 위에서와 같이 멤버 변수를 지역 변수로 받아서 데이터를 추가하고 업데이트하도록 되어있습니다.

멤버 변수를 사용하지않고 굳이 지역 변수로 받아 쓰는 이유가 있을까요?

 

asked (8 point) , 488 views
C#알못이라 잘 모르겠지만 별 의미가 없어 보이는데 혹시 이유가 있다면 정말 궁금하군요
의미가 있다면 진짜 궁금하네요 ㅋㅋㅋ 아무 의미 없어보이는데

3 answers

+3 votes
우수 답변
만약 위의 코드가 멀티 스레드로 돌아간다는 가정하에서

저 코드를 짜신 개발자분의 의도는 MakeSheet를 처리하는 스레드의 동시성을 올리기 위한것으로 추정됩니다.

객체 참조 복사도 C#에서는 아토믹하게 이루어지기 때문에 잠금 코드를 제거하고 저렇게 하면 넌블러킹 + No 잠금 코드로

이루어져서 가독성도 좋죠. 실제로 저도 특수한 경우에 자주 쓰는 방법입니다.

대신 sheet 객체 내부 데이터에 대한 스레드 세이프는 보장해줘야겠죠
answered (81 point)
선택됨
좋은 답변인것 같습니다. 제가 C#을 잘 몰라서 추가로 궁금한 점이 있는데요. 객체 참조 복사 과정이 질문에서 표기된 것처럼 단순한 할당으로도 가능한가요? 짧은 검색으로는 객체 참조 복사를 하고자 한다면 따로 메소드를 호출해서 새로운 객체를 생성해야 하는 것 같아 보이는데...
참조 복사는 ref 니까요?... 그냥 포인터 하나 할당한거죠. m_sheetTechTree = null 을 해주는 메소드가 있다던지.라면 해당 방법이 괜찬을듯 싶네요. 중간에 cancel 을 구현 해야 된다던지..
c++ 에 비유하자면, 레퍼런스 카운터가 하나 올라가는 거랑 비슷한 건가요?
좋은 답변 감사합니다. 배워가네요 ㅜㅜ.

그런데 만약 위의 코드가 멀티스레드 환경이 아니라면 굳이 저런 방식인 이유가 있을까요...?
+2 votes

단순히 코딩의 편의성을 위해 쓰는 경우도 있겠지만 위에 써주신 예와 상관없이 하나 다른 경우를 들자면 스레드 안전성을 확보하기 위한 용도로 쓰이기도 합니다. 해당 멤버 변수가 여러 스레드에서 접근되는 놈이라면 함수 실행 중에도 값이 바뀔 수 있기 때문에 로컬 변수에 복사해 놓고 그 값을 사용하면 안전하죠(물론 뮤텍스로 감싸고 만드는 것이 더 권장됩니다).

하지만 이건 어디까지나 intstring같이 값 자체가 복사되는 기본형에 유효한 것이고 질문에 써주신 코드에서 그 효과를 보기는 어려울 것 같습니다.

answered (99 point)
수정됨
+1 vote

질문자님은 기본적으로 지역변수 sheet 와 멤버변수 m_sheetTechTree 를 설계적 관점에서 완전 동일시 하고 있습니다.

하지만 지역변수 와 멤버변수는 할당되는 순간부터 각각의 의미가 부여됩니다.

저 코드를 짠 프로그래머의 마음을 제가 100% 이해하진 못하겠지만, 두 변수는 서로 다른의도로 만들어진 것입니다.

코드자체가 한눈에 파악할정도로 간단해보이기 때문에, 멤버변수로 지역변수를 대체하여 작성하여도 큰 문제가 없을 것 처럼 보이지만, 의도가 분리되는 순간 변수도 분리되는게 맞다는 생각이 듭니다.

저도 질문자님과 비슷한 생각을 많이 했었기에 제 생각이 도움이 되었으면 좋겠습니다.

answered (10 point)
전달하고자 하신 생각이 어떤지 이해했습니다! 감사합니다 ^^!

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

170 질문
273 answers
292 댓글
285 users