본문 바로가기
공부/C#

C# 공부(10) 93~100

by 라이티아 2024. 8. 27.

93. 일반화 메소드

using System;

namespace P93
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = { 1, 2, 3 };
            double[] d = { 0.1, 0.2, 0.3 };
            string[] s = { "AB", "BC", "CD" };

            Print<int>(a);
            Print<double>(d);
            Print<string>(s);
        }
        private static void Print<T>(T[] values)
        {
            foreach (var v in values)
            {
                Console.Write(v + " ");
            }
            Console.WriteLine();
        }
    }
}

 

결과

1 2 3
0.1 0.2 0.3
AB BC CD

 

오버로딩을 하기 귀찮을 경우, 제네릭 메소드를 사용하는 방법에 대한 코드이다. 이전 코드와 다른 점은 main안에 <자료형>을 추가해서 사용하는것이다.

 

94. 일반화 클래스

using System;

namespace P94
{
    class MyClass<T>
    {
        private T[] arr;
        private int count = 0;

        public MyClass(int length)
        {
            arr = new T[length];
            count = length;
        }

        public void Insert(params T[] arr)
        {
            for (int i = 0; i < this.arr.Length; i++)
            {
                this.arr[i] = arr[i];
            }
        }
        public void Print()
        {
            foreach(T n in arr)
                Console.Write(n + " ");
            Console.WriteLine();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass<int> a = new MyClass<int>(10);
            MyClass<string> s = new MyClass<string>(5);

            a.Insert(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            s.Insert("AB", "BC", "CD", "DE", "EF");

            a.Print();
            s.Print();
        }
    }
}

 

결과

1 2 3 4 5 6 7 8 9 10
AB BC CD DE EF

 

클래스에 <T>를 넣어 제네릭 클래스로 만드는 코드이다.

 

95. dynamic형을 사용하는 일반화 프로그램

using System;

namespace P95
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] a = { 10, 45, 32, 47, 85, 46, 85, 46, 93, 47, 50, 71 };
            float[] b = { 1.2f, 5.3f, 7.8f, 6.1f, 3.4f, 8.8f };

            Calc<int>(a);
            Calc<float>(b);
            Print<int>(a);
            Print<float>(b);
        }

        private static void Calc<T>(T[] values) where T : struct
        { 
            T sum = default(T);
            T avg = default(T);
            T max = default(T);

            foreach (dynamic item in values)
            {
                if (max < item) max = item;
                sum += item;
            }
            avg = (dynamic)sum / values.Length;
            Console.WriteLine($"{sum,5}, {avg,5}, {max,5}");
        }

        private static void Print<T>(T[] values) where T : struct
        {
            foreach (var item in values) Console.Write(item + " ");
            Console.WriteLine();
        }
    }
}

 

결과

는 없다

 

max < item에서 문제가 생기는데, T로 만든 변수들은 bool로 비교가 되지 않는다고 한다...

책이 이상한데

 

96. LinkedList의 구현

using System;
namespace P96
{
    class Node
    {
        internal int data;
        internal Node next;
        public Node(int data)
        {
            this.data = data;
            next = null;
        }
    }
    class LinkedList
    {
        Node head;
        internal void InsertFront(int data)
        {
            Node node = new Node(data);
            node.next = head;
            head = node;
        }
        internal void InsertBack(int data)
        {
            Node node = new Node(data);
            if(head == null)
            {
                head = node;
                return;
            }
            Node last = GetLastNode();
            last.next = node;
        }

        internal Node GetLastNode()
        {
            Node temp = head;
            while(temp.next != null)
            {
                temp = temp.next;
            }
            return temp;
        }

        internal void InsertAfter(int prev, int data)
        {
            Node prevNode = null;

            for (Node temp = head; temp != null; temp = temp.next)
            {
                if (temp.data == prev)
                    prevNode = temp;
                Node node = new Node(data);
                node.next = prevNode.next;
                prevNode.next = node;
            }
        }

        //등등....
    }
}

 

더 많은 기능이 있다만, 이미 매커니즘은 알고있어서 스킵했다.

 

97. LinkedList 클래스를 활용한 프로그램

class Program
{
    static void Main(string[] args)
    {
        LinkedList list = new LinkedList();
        Random r= new Random();

        for (int i = 0; i < 5; i++)
        {
            list.InsertLast(r.Next(100));
        }
list.Print();

list.InsertFront(1);
list.InsertLast(30);
list.Print();
    }
}

 

결과

84 26 66 39 4
1 84 26 66 39 4 30

 

너무 길어서 클래스만 잘라서 넣었다

그냥 연결 리스트 메소드를 공부하는 코드이다.

 

98. Stack<T>의 구현

using System;

namespace P98
{
    class Stack<T>(T data)
    {
        const int max = 10;
        private T[] arr = new T[max];
        private int top;
        public Stack()
        {
            top = 0;
        }

        public void Push(T item)
        {
            if (top < max) {
                arr[top] = item;
                top++;
            }
            else
            {
                Console.WriteLine("stack full");
                return;
            }
        }

        public T Pop()
        {
            if(top > 0)
            {
                --top;
                return arr[top];
            }
            else
                return default(T);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

        }
    }
}

 

스택을 클래스로 만들어보는 코드다.

 

99. 스택을 이용한 프로그램

using System;

namespace P99
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack<int> stack = new Stack<int>();
            Random r = new Random();

            for (int i = 0; i< 10; i++)
            {
                int val = r.Next(100);
                stack.Push(val);
                Console.Write(val + " push ");
            }
            Console.WriteLine();

            for (int i = 0; i< 10;i++)
            {
                Console.Write("pop() = " + stack.Pop() + ", "); ;
            }
        }
    }
}

 

결과

35 push 39 push 83 push 70 push 95 push 52 push 3 push 15 push 29 push 53 push
pop() = 53, pop() = 29, pop() = 15, pop() = 3, pop() = 52, pop() = 95, pop() = 70, pop() = 83, pop() = 39, pop() = 35,

 

스택을 확인해보는 코드이다.

 

100. Queue<T>의 구현

using System;

namespace P100
{
    class Node<T>
    {
        internal T value;
        internal Node<T> next;

        public Node (T value)
        {
            this.value = value;
            this.next = null;
        }
    }
    class Queue<T>
    {
        internal Node<T> first = null;
        internal Node<T> last = null;

        internal void EnQueue(Node<T> node)
        {
            if (last == null)
            {
                first = last = node;
            }
            else
            {
                last.next = node;
                last = node;
            }
        }
        internal T DeQueue()
        {
            if (first == null)
                return default(T);
            else
            {
                T value = first.value;
                first = first.next;
                return value;
            }
        }

        internal void Print()
        {
            for (Node<T> node = first; node != null; node = node.next)
                Console.Write(node.value + ", ");
            Console.WriteLine();
        }
    }
    class Program
    {

    }
}

 

큐를 클래스로 구현한 코드이다.

 

 

C-sharp-Studying/Part2 at main · NoNamed02/C-sharp-Studying

C#언어 공부 정리. Contribute to NoNamed02/C-sharp-Studying development by creating an account on GitHub.

github.com

 

'공부 > C#' 카테고리의 다른 글

C# 공부(12) 111~124(Part3 End && C# 언어 공부 End)  (0) 2024.08.28
C# 공부(11) 101~110  (0) 2024.08.27
C# 공부(10) 91~92(Part2 End)  (0) 2024.08.26
C# 공부(9) 81~90  (0) 2024.08.26
C# 공부(8) 71~80  (0) 2024.08.26