강께르의 개발일지

[문제 풀기] boxing, unboxing과 인터페이스에 대하여 본문

프로그래밍/C#

[문제 풀기] boxing, unboxing과 인터페이스에 대하여

강께르 2021. 9. 17. 01:12

1. boxing과 unboxing이 왜 나쁜가? 언제 일어나는가?

boxing은 값형 변수를 참조형 변수로 형 변환하는 경우에 스택 영역에 있던 데이터를 힙 영역으로 로드하는 것을 의미한다.

unboxing은 참조형 변수를 값형 변수로 형 변환하는 경우에 힙 영역에 있던 데이터를 스택 영역으로 로드한 것을 의미한다.

 

대표적으로 object 클래스로 매개변수를 전달 받을 때, 그 매개변수로 기본 데이터형이 전달되어서 발생하는 경우이다.

 

boxing의 경우, 불필요하게 스택 영역의 데이터를 힙 영역에 올리기 위해 메모리 공간을 확보하고 데이터를 올리는 일련의 과정을 수행되어야한다는 점에서 나쁘다고 이야기할 수 있고,

unboxing의 경우, 형 변환이 수행되는 과정에서 올바른 형 변환을 하고 있는지 컴파일 타임에서 타입 검사를 하지 않으며 런타임에 타입 검사를 하기에 프로그램이 런타임 중에 종료되는 현상을 발생할 수 있어 나쁘다고 이야기할 수 있다.

 

2. 나만의 배열을 만들어 복사, 인덱스 참조, 정렬, 이진탐색을 구현하라.

using System;

namespace ConsoleApp6
{
    class MyArray
    {
        public static void Copy(int[] sour, int[] dest, int length)
        {
            for (int i = 0; i < length; i++)
            {
                dest[i] = sour[i];
            }
        }
        public static void Copy(int[] sour, int sourStart, int[] dest, int destStart, int length)
        {
            for(int i = 0; i < length; i++)
            {
                dest[destStart + i] = sour[sourStart + i];
            }
        }
        public static int IndexOf(int[] array, int number)
        {
            for(int idx = 0; idx < array.Length; idx++)
            {
                if(array[idx] == number)
                {
                    return idx;
                }
            }

            return -1;
        }
        public static void Sort(int[] array)
        {
            for (int idx = 0; idx < array.Length - 1; idx++)
            {
                for(int innerIdx = 0; innerIdx < array.Length - 1 - idx; innerIdx++)
                {
                    if (array[innerIdx] >= array[innerIdx + 1])
                    {
                        int temp = array[innerIdx];
                        array[innerIdx] = array[innerIdx + 1];
                        array[innerIdx + 1] = temp;
                    }
                }
            }
        }

        public static int BinarySearch(int[] array, int number)
        {
            int mid = array.Length / 2;
            int min = 0;
            int max = array.Length - 1;
            while(true)
            {
                if (array[mid] == number)
                    return mid;

                if (min > max)
                    return -1;

                if(array[mid] > number) // 왼쪽
                {
                    max = mid - 1;
                    mid = (min + max) / 2;
                }
                else if(array[mid] < number) // 오른쪽
                {
                    min = mid + 1;
                    mid = (min + max) / 2;
                }
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 10, 30, 50, 20, 40, 100, -50};
            int[] dest = new int[array.Length];

            MyArray.Copy(array, dest, array.Length);
            MyArray.Copy(array, 0, dest, 0, array.Length);

            Console.WriteLine("copy");
            foreach (var number in dest)
            {
                Console.WriteLine(number);
            }

            Console.WriteLine();
            Console.WriteLine("indexOf");
            var find = MyArray.IndexOf(array, 100);
            Console.WriteLine(find);
            find = MyArray.IndexOf(array, 30);
            Console.WriteLine(find);

            Console.WriteLine();
            Console.WriteLine("sort");
            MyArray.Sort(array);

            foreach (var number in array)
            {
                Console.WriteLine(number);
            }

            Console.WriteLine();
            Console.WriteLine("binarySearch");
            find = MyArray.BinarySearch(array, 10);
            Console.WriteLine(find);
            find = MyArray.BinarySearch(array, 30);
            Console.WriteLine(find);
            find = MyArray.BinarySearch(array, 40);
            Console.WriteLine(find);
            find = MyArray.BinarySearch(array, 20);
            Console.WriteLine(find);
            find = MyArray.BinarySearch(array, -50);
            Console.WriteLine(find);
        }
    }
}

3. 인터페이스를 이용하여 CompareTo를 재정의하라.

using System;

namespace ExerciseArray
{
    // 매개변수보다 더 작으면 음수
    // 매개변수와 같으면 0
    // 매개변수보다 더 크면 양수
    class MyClass : IComparable
    {
        public string name;
        public int number;

        // number 기준 비교
        //public int CompareTo(Object obj)
        //{
        //    MyClass temp = obj as MyClass;
        //    return number - temp.number;
        //}
        // name 기준 비교
        public int CompareTo(Object obj)
        {
            MyClass temp = obj as MyClass;
            return name.CompareTo(temp.name);
        }
        

        public override string ToString()
        {
            return $"name : {name} / number : {number} ";
        }

        public static void Sort(MyClass[] array)
        {
            for (int idx = 0; idx < array.Length - 1; idx++)
            {
                for (int innerIdx = 0; innerIdx < array.Length - 1 - idx; innerIdx++)
                {
                    if (array[innerIdx].CompareTo(array[innerIdx + 1]) == 1)
                    {
                        MyClass temp = array[innerIdx];
                        array[innerIdx] = array[innerIdx + 1];
                        array[innerIdx + 1] = temp;
                    }
                }
            }
        }

    }


    class Program
    {
        public static void Main()
        {
            var array = new MyClass[10];
            var rnd = new Random();

            for (var i = 0; i < array.Length; ++i)
            {
                int rndNum1 = rnd.Next(0, 999);
                int rndNum2 = rnd.Next(0, 999);
                array[i] = new MyClass() { name = rndNum1.ToString(), number = rndNum2 };
            }

            MyClass.Sort(array);

            // number 기준으로 오름차순 정렬
            foreach (var obj in array)
            {
                Console.WriteLine(obj); // name: ??? / number: ???
            }
        }
    }
}

'프로그래밍 > C#' 카테고리의 다른 글

[문제 풀기] Bit Flags, Generics, Delegate에 대하여  (0) 2021.09.18
[수업] 20210917_5일차  (0) 2021.09.18
[수업] 20210916_4일차  (0) 2021.09.17
[문제 풀기] 클래스에 관하여  (0) 2021.09.16
[수업] 20210915_3일차  (0) 2021.09.16