[C#] null을 비교하기위한 여정1, ==와 Equals()

2023. 1. 18. 05:08·STUDY/유니티
 if (instance == null)
        {
            instance = this;
        }
        else if (instance != this)
            Destroy(gameObject);

싱글톤 코드를 작성하면서  들었던 의문이 있었습니다.

==대신에 Equals()를 써서 null인지를 체크할 수는 없을까?

 

Equals로 인한 비교는 총 두가지 방법이 있습니다.

매개변수를 1개 쓰는것과 2개쓰는것 

 

instance.Equals(null) 을 사용했을때 뜨는 에러

신기하게도 

instance.Equals(null)를 쓰면 에러가 뜨지만

Equals(instance,null)을 쓰면 에러가 뜨지 않았습니다.

 

이유는 일단 instance는 null인 상태입니다.

그리고 그 null인 instance를 참조할려고하니 NullReferenceException 오류가 뜨는건 당연했죠.

 

하지만 instance.Equals(null)은 Null인 오브젝트의 값을 확인한다음,

매개변수의 값을 비교해야하기때문에 NULL값을 참조할려고해서 바로 에러가 뜨는거였고

Equals(instance,null)같은 경우는 마이크로소프트 .NET7 설명서에 따르면

매개변수 두개 다 NULL일경우 TRUE를 반환하여 오류가 발생하지 않는것이었습니다.

 

그렇다면 매개변수를 하나만 쓰는 Equals보다 매개변수 두개를 쓰는 Equals는 

NULL값 참조라는 검증이 빠지기때문에 좀 더 빠르지 않을까? 란 생각이 들었습니다.

 

바로 검증해보죠

 void Start()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test test1= TestClass1;
        Test test2= TestClass1;

        for (int i=0;i<100000000;i++)
        {
            if (Equals(test1, test2));
        }
        sw.Stop();

        UnityEngine.Debug.Log("Equals(object,object) : " + sw.Elapsed);
    }
void Start()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test test1= TestClass1;
        Test test2= TestClass1;

        for (int i=0;i<100000000;i++)
        {
            if (test1.Equals(test2));
        }
        sw.Stop();

        UnityEngine.Debug.Log("Object.Equals(object) : " + sw.Elapsed);
    }

코드는 매개변수가 두개인 Equals함수와 매개변수가 하나인 Equals함수가

동작하는 시간을 재는 코드입니다.

위 : 매개변수2개  Equals, 아래:매개변수1개 Equals

예상과 동일하게 객체의 값을 참조하고 난 다음에 값을 비교하는것보다

두개의 객체를 한번에 올려놓고 비교하는것이 훨씬 더 빠릅니다.

 

물론 횟수자체를 많이하여 극단적이긴하지만

같은 기능을 수행한다면 Equals(object,object)가 훨씬 빠르단걸 알게되었습니다.

하지만,  Null값을 참조한다는 경고를 하지 않는단건 분명 수행도중에 null이 되었을 경우

나도 모르게 그냥 넘어갈 수 있다는 점입니다. 이 점만 유의한다면 속도향상에 좋을것같습니다.

.

.

.

.

실제 Equals 코드가 어떻게 구현되어있고 다른지를 보지 못해서 아쉽지만,

== 대신 Equals(object,object)를 사용하여 null체크를 할 수 있고,

Equals(object,object)가 Object.Equals(object)보다 속도가 빠르단걸 알 수 있게되었습니다.

 

그리고 마지막에 ==을 이용해 똑같이 검증을 해본 결과, Equals(object,object)보다 속도가 느린것으로 나왔습니다.

최종적으로 Equals(object,object)> object==object > object.Equals(object)순으로

속도가 빠르네요.

 

이와 관련해서는 또 자료를 찾아본 뒤 글을 적도록하겠습니다.

 

'STUDY > 유니티' 카테고리의 다른 글

[C#] null을 비교하기위한 여정3, ==과 is 그리고 Equals(,) 속도  (1) 2023.01.22
[C#] null을 비교하기위한 여정2, is 와 FakeNull  (0) 2023.01.21
[Unity] 메지카복셀에서 내가 만든 캐릭터 유니티로 불러오기  (0) 2022.09.10
[Unity] C# 문자열보간  (0) 2022.08.02
[UniRx] UniRx에 대해서 알아보기  (0) 2022.08.02
'STUDY/유니티' 카테고리의 다른 글
  • [C#] null을 비교하기위한 여정3, ==과 is 그리고 Equals(,) 속도
  • [C#] null을 비교하기위한 여정2, is 와 FakeNull
  • [Unity] 메지카복셀에서 내가 만든 캐릭터 유니티로 불러오기
  • [Unity] C# 문자열보간
wise_
wise_
  • wise_
    WHY'S BlOG
    wise_
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • PROJECT (19)
        • 젯슨나노 프로젝트 (0)
        • 유니티 (9)
      • STUDY (37)
        • 코딩문제 (13)
        • 알고리즘 (0)
        • Effective C++ (14)
        • 유니티 (8)
        • 언리얼 (2)
      • ERROR (7)
        • 오류덩어리들 (7)
      • REVIEW (0)
      • LIFE (0)
        • 작고 소중한 내 일상 (0)
        • 작고 귀여운 내 취미 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    귀여운
    error
    백준
    개발일지
    와이즌
    wisen
    인디게임
    게임개발
    유니티
    null
    힐링게임
    C++
    힐링
    1인개발
    unity
    깊이우선탐색
    퍼즐게임
    코딩
    알고리즘
    스마일게이트
    ==
    언리얼
    게임
    플로이드와샬
    여우는오늘도친구를구한다
    c#
    TheFoxSeeksFriend
    개발
    윈터데브캠프
    모바일게임
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
wise_
[C#] null을 비교하기위한 여정1, ==와 Equals()
상단으로

티스토리툴바