[Unity]/[Unity]

[Unity] IComparer, IComparable 인터페이스

극꼼 2022. 2. 10. 18:48
반응형


1. IComparer, IComparable 인터페이스

: 개체의 값을 비교하기 위한 인터페이스.

.NET 프레임워크에서 제공하는 객체의 선후 관계를 정의하는 인터페이스입니다.

 


2. IComparer, IComparable의 차이점

: 둘 다 개체의 값을 비교하는 인터페이스인데요, 사용 방법은 거의 비슷한데 차이점을 둔다면, IComparable은 현재의 개체를 같은 타입의 다른 개체와 비교(같은 타입끼리 비교)한다면 IComparer는 두 개의 서로 다른 개체를 비교(제 3자와  비교하는 것)한다는 것입니다.


3. IComparable

IComparable 인터페이스에는 CompareTo()라는 메서드만 정의되어 있습니다.

CompareTo() 메서드를 정의해두면, Array.Sort()메서드를 사용했을 때 CompareTo를 사용해 정렬해줍니다.

 

* CompareTo() : 현재의 객체가 대상 객체보다 작으면 0보다 작은 값을, 같으면 0을, 크면 0보다 큰 값을 반환.

using System;

public class GreedyAlgorithm : IComparable
{
    int weight, value;
    public GreedyAlgorithm(int weight, int value)
    {
        this.weight = weight;
        this.value = value;
    }

    void Start()
    {
        //부분 배낭 문제
        // 무게 제한이 k인 배낭에 최대 가치를 가지도록 물건을 넣는 문제

        //풀이 방법 : 무게 당 가치가 높은 물건 먼저 가방에 넣음

        GreedyAlgorithm[] objectArray = new GreedyAlgorithm[5];
        objectArray[0] = new GreedyAlgorithm(10, 10);
        objectArray[1] = new GreedyAlgorithm(30, 5);
        objectArray[2] = new GreedyAlgorithm(25, 8);
        objectArray[3] = new GreedyAlgorithm(20, 10);
        objectArray[4] = new GreedyAlgorithm(15, 12);

        sortObjects(50, objectArray);
    }

    public int CompareTo(object obj) //IComparable 메서드
    {
        GreedyAlgorithm nowObj = obj as GreedyAlgorithm;
        if (nowObj.weight == 0) Debug.Log("개체x");
        return (weight / value).CompareTo(nowObj.weight / nowObj.value);
    }

    public void sortObjects(int totalWeight, GreedyAlgorithm[] objectArray)
    {
        Array.Sort(objectArray); //CompareTo 메서드를 이용해 정렬
        int totalValue = 0;
        int nowWeight = totalWeight;
        for (int i = 0; i < objectArray.Length; i++)
        {
            if(totalWeight > objectArray[i].weight)
            {
                totalWeight -= objectArray[i].weight;
                totalValue += objectArray[i].value;
            }
        }
    }
}

 


4. IComparer

위의 코드와 비교했을 때, CompareTo 메서드 대신 Compare 메서드를 썼다는 차이점이 있습니다.

public class GreedyAlgorithm : IComparer
{
    int weight, value;
    public GreedyAlgorithm(int weight, int value)
    {
        this.weight = weight;
        this.value = value;
    }

    void Start()
    {
        //부분 배낭 문제
        // 무게 제한이 k인 배낭에 최대 가치를 가지도록 물건을 넣는 문제

        //풀이 방법 : 무게 당 가치가 높은 물건 먼저 가방에 넣음

        GreedyAlgorithm[] objectArray = new GreedyAlgorithm[5];
        objectArray[0] = new GreedyAlgorithm(10, 10);
        objectArray[1] = new GreedyAlgorithm(30, 5);
        objectArray[2] = new GreedyAlgorithm(25, 8);
        objectArray[3] = new GreedyAlgorithm(20, 10);
        objectArray[4] = new GreedyAlgorithm(15, 12);

        sortObjects(50, objectArray);
    }

    // 양수값이 리턴되면 x가 앞으로 오고,
    // 음수값이 리턴되면 y가 앞으로 오면서 정렬
    public int Compare(object x, object y)
    {
        GreedyAlgorithm _x = x as GreedyAlgorithm;
        GreedyAlgorithm _y = y as GreedyAlgorithm;
        return (_x.weight /_x.value) - (_y.weight / _y.value); //오름차순
        return (_y.weight / _y.value) - (_x.weight / _x.value); //내림차순
    }

    public void sortObjects(int totalWeight, GreedyAlgorithm[] objectArray)
    {
        Array.Sort(objectArray); //CompareTo 메서드를 이용해 정렬
        int totalValue = 0;
        int nowWeight = totalWeight;
        for (int i = 0; i < objectArray.Length; i++)
        {
            if(totalWeight > objectArray[i].weight)
            {
                totalWeight -= objectArray[i].weight;
                totalValue += objectArray[i].value;
            }
        }
    }
}

 

 

반응형