inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템

Task 구현

Task 에서 Object 타입 사용

119

코딩하고시펑

작성한 질문수 3

0

안녕하세요! 강의 잘 듣고 있습니다.

Object 타입을 사용하면 박싱 - 언박싱이 발생할 것 같은데 큰 문제는 없는 건가요? 박싱과 언박싱을 지양하라는 글을 많이 봐서 그런지 거부감이 큰 것 같습니다. 성능에 안 좋다는데 사용해도 될지 의문입니다.

unity

답변 2

1

Developer G

수강해주셔서 감사합니다.

같은 질문이 있었던지라 답변을 똑같이 드리겠습니다.
(https://www.inflearn.com/community/questions/450293/tasktarget%EC%9D%84-%ED%95%A0%EB%96%84)

C# 문법서나 강의에서 제대로 설명하지 않아서 가장 많은 오해를 많이 받는게 object형의 퍼포먼스인데요, object형이 퍼포먼스에 안좋다는 이유는 Value 타입의 변수를 박싱할 때 heap에 값의 재할당이 일어나고 언박싱을 할 때 캐스팅한 타입으로 박싱한 것인지 확인 후 다시 value 타입으로 값의 재할당이 일어나기 때문입니다.
(마이크로스프트 공식 문서 https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing)

하지만 애초에 heap에 할당된 reference 타입의 변수들은 재할당(박싱/언박싱)이 일어나지 않기 때문에 퍼포먼스에 문제가 없습니다.
이는 char형을 랩핑한 class인 string형도 포함되는 사항입니다.
(마이크로소프트에서 제공하는 Type 정보를 보면 string형은 reference 타입으로 되어있습니다. https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/built-in-types)

그러니 int, float, struct 같은 Value Type의 변수들을 쓰는 것이 아니라면 퍼포먼스에 대해서는 걱정하지 않으셔도 되구요, 설사 Value Type을 박싱/언박싱하더라도 박싱/언박싱이 매 프레임마다 다수 일어나는 것이 아닌 특정 상황에서 소수로 일어나는 것이기 때문에 퍼포먼스 이슈가 생길 가능성은 극히 낮습니다. 남용해선 안되겠지만 반대로 너무 사용을 두려워하실 필요도 없습니다. 필요한 곳에 쓰라고 만든 것이니까요.

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 코딩하고시펑님.

Object 타입을 사용하는 경우 박싱과 언박싱이 발생하게 되면 성능에 영향을 줄 수 있다는 점에서 우려가 있으신 것 같습니다. 박싱과 언박싱은 값 형식을 객체 형식으로 변환하거나 그 반대로 변환하는 과정에서 발생하는 비용 때문에 성능 저하가 발생할 수 있습니다.

그러나 실제로 이는 상황에 따라 다르게 영향을 미칠 수 있습니다. 예를 들어 참조 타입을 주로 사용하는 경우라면 이러한 비용이 덜할 수 있으며, 특별히 성능을 최적화할 필요가 없는 소규모 프로젝트에서는 큰 문제가 되지 않을 수도 있습니다. 다만, 대규모 데이터 구조나 성능이 중요시되는 게임 환경에서는 주의가 필요합니다.

유사 질문 및 답변 링크:

  1. TaskTarget을 할 때 Object 형식 사용 관련 성능 문제

    • 이 답변에서는 object 타입의 박싱과 언박싱에 관련한 성능 이슈와 이를 최적화하는 방법에 대해 다루고 있습니다.

박싱과 언박싱을 우려하신다면 해당 부분을 다른 데이터 구조로 교체하거나, 처음부터 최적화를 고려한 설계를 진행하시는 것도 좋은 방법입니다. 프로젝트의 요구사항에 맞추어 적절한 방법을 선택하시는 것을 추천드립니다.

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

Task 구현 28:36 Equals 에서 잘 모르는 부분이 있습니다.

0

21

2

Quest System의 확장성에 대한 질문

0

106

1

공부 방향에 대해 궁금한 점이 있습니다.

0

141

2

End()와 Complete() 함수를 따로 구현한 의도

0

165

2

Target의 value에 Object 자료형 관련 질문입니다!

0

149

2

TaskGroupState에 대하여 질문이 있습니다

0

111

2

Elite와 Normal Germ의 IsTarget()질문입니다.

0

99

2

퀘스트 시스템을 확장하면서 생긴 의문점 입니다.

0

166

2

퀘스트 클리어해도 동일 퀘스트가 노출됩니다

1

129

3

퀘스트 누적 클리어 횟수에 대해 여쭤보고싶습니다.

0

85

1

프로퍼티 사용 질문입니다.

0

117

1

파일 저장방식, 퀘스트 실패에 관하여 여쭤보고싶습니다.

0

217

1

Destroy() 지연 파괴에 관하여

0

140

1

Action & Delegate

0

178

2

강의에서 리워드 관련 언급은 없으셔서 질문드립니다.

0

276

1

궁금한게있습니다

0

293

1

스크립터블 오브젝트 Instantiate?

0

436

1

원하는 타이밍에 퀘스트를 등록하고 싶다면 어떻게 해야할까요

0

339

1

Quest Cancel() 메소드

0

263

2

Task의 IsEqual

0

227

1

실전예제 UI 자료

0

194

1

스크립터블 오브젝트

1

325

1

Task 예시

1

167

1

퀘스트의 상태인 QuestState를 다른 스크립트에서 받을 수 있나요

1

306

2