inflearn logo
강의

Course

Instructor

[Unity Level Up!] Quest & Achievement System Developed Modularly

Task implementation

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

20

caleb

5 asked

0

using UnityEngine; using System;   [CreateAssetMenu(fileName = "Category_", menuName = "Girl/Category")] public class Category : ScriptableObject, IEquatable<Category> {     [SerializeField] private string codeName;     [SerializeField] private string nameKey;      public string CodeName => codeName;     public string NameKey => nameKey;          #region Operator     public bool Equals(Category other)     {         if (other == null) return false;         if(ReferenceEquals(other, this)) return true;         if(GetType() != other.GetType()) return false;         return codeName == other.CodeName;     }      public override int GetHashCode() => (CodeName, NameKey).GetHashCode();     public override bool Equals(object obj) => base.Equals(obj);      public static bool operator ==(Category left, string right)     {         if (left is null)         return ReferenceEquals(right, null);         return left.CodeName == right || left.nameKey == right;     }     public static bool operator !=(Category left, string right)=> !(left == right);     #endregion } 

 

 

Category 또한 object라서 base 함수를 쓰면 우리가 만든 Equal이 사실상 안쓰이게 되는거 아닌지 궁금합니다!

unity

Answer 2

0

Developer G

수강해주셔서 감사합니다.
수강생분의 말씀이 맞습니다.

public override bool Equals(object other) => Equals(other as Category);

위와 같이 코드가 수정되어야 맞습니다.
과거에 자료 수정을 했었는데 왜인지 반영이 안된 것 같습니다.
불편을 드려 죄송합니다.

감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.
백용익님이 질문하신 내용에 대해 안내드리겠습니다.

Category 클래스에서 Equals 메소드를 직접 구현하고 계신데, 이와 관련된 몇 가지 혼란이 있을 수 있습니다.

  1. Equals(Category other) 메소드: 이 메소드는 IEquatable<Category> 인터페이스의 구현으로, 같은 타입의 다른 Category 인스턴스와 비교하기 위해 사용됩니다. 여기서 중요한 것은 같은 클래스 타입 내의 두 객체가 codeName을 기준으로 동일한지를 비교한다는 점입니다.

  2. Equals(object obj) 메소드: 이 메소드는 .NET의 기본 메소드로, 기본적으로 System.Object의 Equals 메소드를 사용하게 됩니다. 위 코드에서는 객체 형으로 들어온 obj가 Category 타입인지 아닌지를 분별하기 위해선 Equals(Category other) 메소드를 호출할 수 있는 로직이 필요합니다. 이 부분이 작성되지 않으면, 기본적으로 base.Equals(obj)를 호출하여 Category 클래스의 비교 로직이 아닌, System.Object의 비교 메소드를 사용하게 되어 예상치 못한 결과가 나올 수 있습니다.

  3. GetHashCode 메소드: 이 메소드는 객체의 해시코드를 제공하며, Equals 메소드와 함께 Dictionary나 HashSet같은 컬렉션에서 사용됩니다. 두 객체가 Equals메소드상 동일하게 되면, 같은 GetHashCode를 반환하게 설계해야 합니다.

참고하기 좋은 게시물을 추천드립니다. 아래 링크는 IEquatable 인터페이스를 활용할 때의 다른 경우들을 설명하고 있으니 도움이 되실 것입니다:

위 답변들은 특정 맥락을 기반으로 제공된 것으로, 코드 작성 시 상황에 맞춰 구현해야 합니다.

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

Quest System의 확장성에 대한 질문

0

104

1

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

0

141

2

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

0

165

2

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

0

148

2

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

0

111

2

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

0

99

2

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

0

165

2

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

1

128

3

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

0

84

1

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

0

117

1

Task 에서 Object 타입 사용

0

119

2

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

0

217

1

Destroy() 지연 파괴에 관하여

0

139

1

Action & Delegate

0

178

2

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

0

274

1

궁금한게있습니다

0

293

1

스크립터블 오브젝트 Instantiate?

0

436

1

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

0

338

1

Quest Cancel() 메소드

0

262

2

Task의 IsEqual

0

225

1

실전예제 UI 자료

0

193

1

스크립터블 오브젝트

1

323

1

Task 예시

1

165

1

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

1

305

2