30. [C#닷넷강좌]C# Generic(일반화 프로그래밍), TYPE T
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Generic이란? 클래스에 사용할 타입을 디자인시에 정하는 것이 아니라 클래스를 사용할 때 지정한 후 사용하는 기술이다.
예를 들어서 두수의 합을 구하는 sum(int i, int j) 메소드를 생각해 보자. 처음 설계할 때는 int형만 더 하는 관점에서 설계했지만 추후 float, double, long… 다른 타입들의 합을 구하는 기능이 추가 된다고 생각해 보자. 매번 sum() 메소드를 오버로딩 시켜서 만든다는 것은 여간 불편한 일이 아닐 수 없다. 이러한 관점에서 도입된 프로그래밍 기법이 일반화(Generic)프로그래밍 기법이다.
제너릭은 형식 안전성을 위해서,캐스팅, 박싱(Boxing)과 언방식(UnBoxing)으로 인한 부하가 없다.
다음 예문을 보자.
- Object형을 매개변수로
class Onj {
private Object data = null;
public void SetData(Object data) { this.data = data; }
public Object GetData() { return this.data; }
}
String str = “oraclejavanew.kr”;
Onj o = new Onj();
o.SetData(str);
String myStr = (String)o.GetData();
- Generic을 매개변수로
class Onj<T> {
private T data = null;
public void SetData(T data) { this.data = data; }
public T GetData() { return this.data; }
//T라는 타입은 아직 결정되지 않았으며 사용시 결정하여 사용
}
String str = “oraclejavanew.kr”;
Onj<String> o = new Onj<String>();
o.SetData(str);
//Top<String>을 사용했으므로 GetData()메소드는 String을 리턴
String myStr = o.GetData();
스택 클래스를 보자.
//처음에는 int로 스택구성
class Stack{
private int top = 0;
private int[ ] ar = new int[10];
public void Push(int i){
ar[top] = i;
top++;
}
public int Pop(){
top--;
return ar[top];
}
}
//두번째는 string으로 스택구성
class Stack{
private int top = 0;
private string[ ] ar = new string[10];
public void Push(string obj){
ar[top] = obj;
top++;
}
public string Pop(){
top--;
return ar[top];
}
}
//세번째는 object로 스택구성
class Stack{
private int top = 0;
private Object[ ] ar = new Object[10];
public void Push(Object obj){
ar[top] = obj;
top++;
}
public Object Pop(){
top--;
return ar[top];
}
}
//Generic으로 스택 구성
class Stack<T>{
private int top = 0;
private T[ ] ar = new T[10];
public void Push(T i){
ar[top] = i;
top++;
}
public T Pop(){
top--;
return ar[top];
}
}
컬렉션의 제너릭 전환
일반 컬렉션 클래스
|
제너릭 클래스
|
ArrayList
|
List<T>
|
Hashtable
|
Dictionary<T>
|
SortedList
|
SortedDictionary<T>
|
Stack
|
Stack<T>
|
Queue
|
Queue<T>
|
List<T>
List<string> onj = new List<string>();
Dictionary<K, V>
Dictionary<string, string> onj = new Dictionary<string, string>();
onj.Add("name", "Onj");
SortedDictionary<K, V>
SortedDictionary<int, string> onj = new SortedDictionary<int, string>();
onj.Add(1, "오라클자바커뮤니티" );
[예제1, 일반화클래스]
using System;
using System.Collections.Generic;
using System.Text;
namespace GenericArray
{
class MyArray<T> // T 형은 매개변수
{
private T[] onj;
//onj 배열을 초기화
public MyArray(int size)
{
onj = new T[size];
}
// onj의 배열에 데이타를 저장한다.
public void SetElement(int index, T value)
{
onj[index] = value;
}
// onj배열에 해당 index 데이터를 반환
public T GetElement(int index, T value)
{
return onj[index];
}
// onj의 모든 요소를 출력한다.
public void PrintElements()
{
foreach (T o in onj)
{
Console.WriteLine(o);
}
}
}
class MainApp
{
public static void Main(string[] args)
{
//int 형을 매개 변수로 MyArray<T>의 객체를 생성.
MyArray<string> array = new MyArray<string>(4);
array.SetElement(0, "OnjOracleJava");
array.SetElement(1, "OracleJava Commmunity");
array.SetElement(2, "oraclejavacommunity.com");
array.SetElement(3, "oraclejavanew.kr");
array.PrintElements();
}
}
}
[결과]
OnjOracleJava
OracleJava Commmunity
oraclejavacommunity.com
oraclejavanew.kr
[예제2, 일반화메소드]
using System;
using System.Collections.Generic;
using System.Text;
namespace GenericMethod
{
class MainApp
{
static T[] GetArray<T>(int size, T val)
{
T[] array = new T[size];
for (int i = 0; i < size; i++)
{
array[i] = val;
}
return array;
}
static void Main(string[] args)
{
string[] str_array = GetArray<string>(3, "오라클자바커뮤니티,오라클자바커뮤니티프로그래밍");
foreach (string s in str_array)
Console.WriteLine(s);
}
}
}
[결과]
오라클자바커뮤니티,오라클자바커뮤니티프로그래밍
오라클자바커뮤니티,오라클자바커뮤니티프로그래밍
오라클자바커뮤니티,오라클자바커뮤니티프로그래밍
[진짜실무교육&환급100%]SQL/자바/스프링/안드로이드/닷넷C#/웹… | 12-27 | 2362 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1710 | ||
53 | [평일전액환급실무교육]Spring,자바&JSP,안드로이드,웹퍼블리싱,… | 03-15 | 1524 | |
52 | [주말]C#,ASP.NET마스터 | 01-31 | 1632 | |
51 | [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… | 01-31 | 2099 | |
50 | [평일주간야간,주말]C기본&자료구조,알고리즘 | 01-31 | 1285 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1592 | |
48 | [평일야간,주말]안드로이드개발자과정(Android기초실무) | 01-11 | 1425 | |
47 | [평일야간,주말주간,주말야간]JAVA,Network&JSP&Spring,MyBatis,… | 01-03 | 1962 | |
46 | [진짜실무교육&환급100%]SQL/자바/스프링/안드로이드/닷넷C#/웹… | 12-27 | 2362 | |
45 | [기업100%환급]자바웹개발기초과정(JAVA,JDBC,JSP,Servlet,Aajx,… | 12-19 | 1692 | |
44 | [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… | 12-14 | 1667 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1710 | |
42 | [기업100%환급]웹퍼블리싱마스터(HTML5,CSS3,JavaScript,jQUERY) | 12-09 | 1358 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1583 | |
40 | [기업100%환급]오라클&자바웹스프링신입과정3주(SQL,JAVA,JSP,Se… | 12-01 | 1761 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1237 |
댓글 없음:
댓글 쓰기