개발 보안

제네릭과 무명메소드

아엠그라운드 2022. 4. 4. 13:00

제네릭 (Generics)

제네릭은 다양한 자료형에 적용될 수 있는 일반적인 클래스를 정의한다. 제네릭은 사용할 자료형을 매개변수로로 전달 받는다. 이를 사용하면 하나의 클래스로 다양한 자료형을 지원할 수 있다. 예를 들어, 스택 클래스를 고려해 보자. 만약 정수형을 저장할 수 있는 스택과 실수를 저장할 수 있는 스택이 필요하다고 하자. 그러면 아래와 같이 int 스택 클래스와 float 스택 클래스를 정의해야 한다.

 

public class IntStack {

int[] items;

int count;

public void Push(int item) {... }

public int Pop() {... }

}

 

public class FloatStack {

float[] items;

int count;

public void Push(float item) {... }

public float Pop() {... }

}

 

두 개의 클래스를 비교해 보면 알겠지만 구조나 기능이 동일하다. 단지, 다루는 자료형에서만 차이가 있다. 만약 자료형을 매개변수로 줄 수 있다면 위 두개의 클래스는 아래와 같은 하나의 일반적인 클래스로 정의할 수 있다. 이 클래스가 바로 제네릭 클래스이다.

 

public class Stack<T> {

T[] items;

int count;

public void Push(T item) {... }

public T Pop() {... }

}

 

사용하는 실제 자료형을 매개변수로 지정하여 제네릭 클래스로부터 객체를 생성하여 사용하면 된다. 만약 int 스택이 필요하다면 아래처럼 객체를 생성한 후 사용하면 된다.

 

Stack<int> stack = new Stack<int>();

stack.Push(3);

int x = stack.Pop();

 

 

무명 메소드 (anonymous method)

2.0보다 이전 버전의 C#에서는 대리자 선언에 명명된 메서드만을 사용해야 했는데 C# 2.0에서는 무명 메서드가 도입되었다. 무명 메소드는 말 그대로 이름이 없는 메소드를 의미한다. 무명 메소드가 도입됨으로써 메소드 이름이 아닌 코드 블록 자체를 대리자의 매개변수로 사용할 수 있다. 무명 메서드를 사용하면 별도의 메서드를 만들 필요가 없으므로 대리자를 인스턴스화하는 데 따르는 코딩 오버헤드를 줄일 수 있다. 아래의 코드를 무명 메소드를 사용하여 재작성하면

 

public MyForm() {

addButton.Click += new EventHandler(AddClick);

}

void AddClick(object sender, EventArgs e) {

MessageBox.Show(textBox.Text);

}

 

아래와 같다.

 

public MyForm() {

addButton.Click += delegate {MessageBox.Show(textBox.Text); }

}

 

만약, 매개변수가 필요한 무명메소드를 사용할 경우는 아래와 같이 필요한 매개변수를 delegator 뒤에 기술해 주고 뒤 따르는 코드 블록 내에서 이 매개변수를 사용하면 된다.

 

addButton.Click += delegate(object sender, EventArgs e) {

MessageBox.Show(((Button)sender).Text); }