C#/기초

C# 개념 정리 5 / 인터페이스, 열거형, 델리게이트, 이벤트, 람다, 제너릭, Func, Action, Predicate / 면접 대비

근본넘치는개발자 2024. 9. 27. 00:00

개념 정리 4에서 이어집니다.

2024.09.25 - [C#/기초] - C# 개념 정리 4/ 상속, 다형성, out, ref / 면접 대비

 

인터페이스 

클래스가 구현해야 하는 맴버 정의하는 것

 

인터페이스 특징 

다중 상속 지원

클래스가 인터페이스를 구현할 경우 모든 인터페이스 맴버를 구현해야 한다.

 

인터페이스 와 추상 클래스 차이?

 

인터페이스 

 

메서드를 정의만 할 뿐 구현을 갖지 않는다.

모든 맴버가 public

 

추상 클래스 

 

일부 동작 구현을 가지며, 추상 메서드를 포함 할 수 있다.

-> 개념 정리 4 오버라이딩 예시 참고

 

클래스이므로 단일 상속만 가능하다.

 

 

※ C# 8.0부터는 인터페이스도 기본 구현을 제공할 수 있고,

정적 필드를 갖는 게 가능하다. 

 

 

열거형

서로 관련된 상수들의 집합을 정의할 때 사용

열거형의 각 상수는 정수 값으로 지정된다.

 

enum ItemType
{
    무기 = 1,
    방어구,
    신발 = 5,
    투구 = 7,
    반지
}

// ItemType.방어구 이런식으로 이름을 그대로 가져와 사용가능
// 값을 명시적으로 지정하지 않은 것들은 이전값에서 1을 증가시킨 값
// 방어구의 경우 2, 반지의 경우 8이다.

 

델리게이트(Delegate / 대리자)

메서드를 참조하는 타입으로서,

메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.

(= 콜백 메서드를 정의하는 데 사용)

 

 

delegate void MyDelegate(string message);

static void PrintMessage(string msg) 
{
    Console.WriteLine(msg);
}


static void PrintMessage2(string msg) 
{
    Console.WriteLine("Message 2: " + msg);
}

public class Program {
    static void Main() {
     
        //메서드 등록
        MyDelegate del = PrintMessage;
        
        //델리게이트 사용
        del("Hello"); // Hello 출력
        
        //멀티케스트 델리게이트 +-로 추가 및 제거 가능
        del+= PrintMessage2;
       
        del("Hello"); // "Hello", "Message 2 : Hello" 출력
        
    }
}

 

이벤트 

클래스나 개체가 알림을 제공할 수 있도록 하는 델리게이트

event 키워드를 사용해 선언

 

" = " 으로 이벤트를 할당할 수 없으며 

클래스 외부에서는 직접 이벤트를 호출할 수 없다.

 

// 델리게이트 선언
public delegate void Notify(); 

public class Process {

    //이벤트 선언
    public event Notify ProcessCompleted;  
    
    public void StartProcess() {
    
        Console.WriteLine("Process started...");
        OnProcessCompleted(); 
    }

    protected virtual void OnProcessCompleted() {
        if (ProcessCompleted != null) {
            ProcessCompleted();  
        }
    }
}

 

람다(Lambda)

메서드의 이름 없이 메서드를 만드는 방법

델리게이트를 사용하여 변수에 할당하거나, 메서드의 매개변수로 전달 가능

delegate void MyDelegate(string message);

public class Program {
    static void Main() {
        
        //델리게이트 인스턴스 생성 및 람다식 할당
        MyDelegate del = (msg) => Console.WriteLine(msg);

        del("Hello"); // Output: Hello
    }
}

 

제너릭(Generic)

클래스나 메서드를 일반화시켜 다양한 자료형에 대응할 수 있는 기능

<T>형태의 키워드 이용하여 선언.

 

// 제너릭 클래스 예시
public class Pair<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }

    public Pair(TKey key, TValue value)
    {
        Key = key;
        Value = value;
    }
}


// 제너릭 메소드 예시
public static class Utilities
{
    public static void PrintArray<T>(T[] array)
    {
        foreach (T element in array)
        {
            Console.Write(element + " ");
        }
        Console.WriteLine();
    }
}


class Program
{
    static void Main(string[] args)
    {
        // 제너릭 클래스 사용
        var pair1 = new Pair<string, int>("Age", 30);
        var pair2 = new Pair<double, string>(3.14, "Pi");

        Console.WriteLine($"{pair1.Key}: {pair1.Value}");
        Console.WriteLine($"{pair2.Key}: {pair2.Value}");

        // 제너릭 메소드 사용
        int[] intArray = { 1, 2, 3, 4, 5 };
        double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5 };
        string[] stringArray = { "Hello", "World", "Generics" };

        Utilities.PrintArray(intArray);
        Utilities.PrintArray(doubleArray);
        Utilities.PrintArray(stringArray);
    }
}

 

Func과 Action, Predicate

델리게이트를 대체하는, 미리 정의한 제네릭 형식의 델리게이트

Action

반환 값이 없는 메소드를 나타내는 델리게이트.

Func

하나 이상의 입력 매개변수와 하나의 반환 값을 가진 메소드를 나타내는 델리게이트

마지막 타입 매개변수가 반환 타입

Predicate 

리턴값이 bool인 메소드를 나타내는 델리게이트

 

static void Main()
    {
        // Func 사용 예시 (입력 매개변수와 반환 값이 있는 메소드를 나타냄)
        Func<int, int, string> add = (x, y) => $"{x} + {y} = {x + y}";
        Console.WriteLine(add(3, 5));  // 출력: 3 + 5 = 8

        // Action 사용 예시 (반환 값이 없는 메소드를 나타냄)
        Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
        greet("Alice");  // 출력: Hello, Alice!

        // Predicate 사용 예시 (조건을 검사하고 bool을 반환하는 메소드를 나타냄)
        Predicate<int> isEven = num => num % 2 == 0;
        Console.WriteLine(isEven(4));  // 출력: True
        Console.WriteLine(isEven(7));  // 출력: False

        
    }

 

 

 

개념 정리 6으로 이어집니다.

 

 

참고하면 좋을 내용

https://www.php.cn/ko/faq/360233.html

 

125가지 기본 C# 인터뷰 질문 및 답변 공유-C#.Net 튜토리얼-php.cn

이 문서는 125개의 기본 C# 인터뷰 질문과 답변 목록입니다. 이러한 인터뷰 질문은 간단하고 직설적이며 C#의 가장 기본적인 개념을 다루고 있으며, 그 중 대부분은 개체 지향 개념과 관련되어 있

www.php.cn

https://www.guru99.com/ko/c-sharp-interview-questions.html

 

상위 50개 C# 인터뷰 질문 및 답변(2024)

신입생 및 경력자를 위한 C# 인터뷰 질문: 다음은 신입생 및 2/3/5/10년 경력 전문가를 위한 기본부터 고급 C# 인터뷰 질문과 답변 목록입니다.

www.guru99.com

https://shypang.tistory.com/16

 

C# 해외 면접시 TOP50

가장 인기있는 C # 인터뷰 질문 및 답변기본 개념에 대한 질문Q # 1) 객체와 클래스 란 무엇입니까?Ans : 클래스는 실시간 엔터티를 나타내는 데 사용되는 속성 및 메서드의 캡슐화입니다. 모든 인

shypang.tistory.com