본문 바로가기
C#/책 정리

C# 정리 ) object 기본 메서드 확장

2021. 12. 3.

objcet 클래스의 ToString의 경우 인스턴스 값을 적절하게 표현하는 내용으로 재정의 하는것이 보통이다.

ToString을 다시 설명하자면, ToString 메서드는 호출시 해당 인스턴스가 속한 클래스의 전체 이름(FQDN)을 리턴한다.

 

클래스이름 test = new 클래스이름();
string getToString = test.ToString();

이 코드에서 getToString은 test의 전체 이름 : 프로젝트이름.클래스이름 이다.

 

이 ToString을 오버라이드 하면 상당히 편리한데, 특히 C#으로 윈도우 GUI를 제작할 때 ToString 오버라이드의

진가가 발휘된다.

using System;

namespace Project1
{
    class 테스트
    {
        private string 난이것을출력하고싶어 = "출력";
    }
    class Class1
    {
        public static void Main(string[] args)
        {
            
        }
    }
}

이런 코드가 있다.

테스트 클래스 안의 난이것을출력하고싶어 필드를 출력을 하고 싶다.

물론 get을 이용한 프로퍼티나 메서드를 하나 만들 수도 있지만 여기서는 ToString을 오버라이드 하기로 한다.

using System;

namespace Project1
{
    class 테스트
    {
        private string 난이것을출력하고싶어 = "출력";
        public override string ToString()
        {
            return 난이것을출력하고싶어;
        }
    }
    class Class1
    {
        public static void Main(string[] args)
        {
            테스트 생성 = new 테스트();
            Console.WriteLine(생성.ToString());
        }
    }
}

코드를 이렇게 바꾸어 주면 ToString이 클래스가 속한 전체 이름을 리턴하는 것이 아닌

난이것을출력하고싶어를 리턴한다.


위에서 C#으로 GUI 프로그램을 만들때 이 ToString의 오버라이드가 진가를 발휘한다고 작성했는데, 본인은 이 ToString 오버라이드를 리스트박스와 결합하여 정말 유용하게 쓰고있기 때문이다.

 

리스트박스 안에 객체를 대입하고, 해당 클래스 안에서 ToString을 오버라이드 한다.

리턴되는 변수는 리스트박스 안에 출력하고 싶은 값을 리턴한다.

그렇다면 리스트박스 안에 객체가 들어가지만, 리스트박스에 표시되는 각각의 인덱스는 본인이 설정한 특정 문자열이 표시되기 때문이다.


ToString만 오버라이드 할 수 있는것이 아니다.

Equals를 오버라이드 하는것을 보자.

using System;

namespace Project1
{
    class 테스트
    {
        public string 이름;
        public string 주민등록번호;
        public override bool Equals(object obj)
        {
            if(obj == null)
            {
                return false;
            }
            테스트 비교용객체 = obj as 테스트;
            if (비교용객체 == null)
            {
                return false;
            }
            return this.주민등록번호 == 비교용객체.주민등록번호;
        }
    }
    class Class1
    {
        public static void Main(string[] args)
        {
            테스트 첫번째 = new 테스트();
            테스트 두번째 = new 테스트();

            첫번째.이름 = "박덕수";
            첫번째.주민등록번호 = "612354-149643";

            두번째.이름 = "김순자";
            두번째.주민등록번호 = "514564-242353";

            if (첫번째.Equals(두번째))
            {
                Console.WriteLine("두 사람은 같아요");
            }
            else
            {
                Console.WriteLine("두 사람은 달라요");
            }
        }
    }
}

이런식으로 비교할 수 있다.

출력은 두 사람이 다르다고 한다.

 

GetHashCode 또한 오버라이드 할 수 있는데, 이는 내가 지금까지 한번도 활용해본적이 없어 기회가 생기면 이 아래에 추가하겠다.

댓글