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#' 카테고리의 다른 글
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 |