C#

C# 고급 문법과 기능

anvil925 2025. 2. 20. 20:22
728x90
반응형

using System;

class AdvancedSyntaxAndFeatures
{
    // C# 고급 문법과 기능

    // 제너릭(Generic)
    // - 클래스나 메서드를 정의할 때, 데이터 형식을 일반화하는 것
    // - 클래스나 메서드를 선언할 때, 데이터 형식을 지정하지 않고, 인스턴스를 생성할 때 데이터 형식을 지정할 수 있다.
    // - 제너릭을 사용하면 코드의 재사용성을 높일 수 있다.
    // - 제너릭 클래스를 선언할 때는 클래스 이름 뒤에 <T>를 붙이고, 메서드를 선언할 때는 메서드 이름 뒤에 <T>를 붙인다.
    // - T는 임의의 데이터 형식을 나타내는 식별자이다.
    // - 제너릭 클래스나 메서드를 사용할 때는 클래스나 메서드 이름 뒤에 <데이터 형식>을 붙인다.
    // - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정해야 한다.
    // - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정하지 않으면 컴파일 오류가 발생한다.
    // - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정할 수 있는데, 이를 형식 매개변수(Type Parameter)라고 한다.
    // - 제너릭 클래스나 메서드를 사용할 때는 데이터 형식을 지정할 수 있는데, 이를 형식 인수(Type Argument)라고 한다.
    // 제너릭 클래스 선언 예시
    class Stack<T>
    {
        private T[] elements;
        private int top;

        public Stack()
        {
            elements = new T[100];
            top = 0;
        }

        public void Push(T item)
        {
            elements[top++] = item;
        }

        public T Pop()
        {
            return elements[--top];
        }
    }
    public static void TestGeneric()
    {
        Stack<int> intStack = new Stack<int>();
        intStack.Push(1);
        intStack.Push(2);
        intStack.Push(3);
        Console.WriteLine(intStack.Pop());
        Console.WriteLine(intStack.Pop());
        Console.WriteLine(intStack.Pop());

        Stack<string> stringStack = new Stack<string>();
        stringStack.Push("A");
        stringStack.Push("B");
        stringStack.Push("C");
        Console.WriteLine(stringStack.Pop());
        Console.WriteLine(stringStack.Pop());
        Console.WriteLine(stringStack.Pop());
    }

    // Out, Ref 키워드
    // - Out 키워드 : 메서드의 반환값이 여러 개일 때 사용
    // - Ref 키워드 : 메서드의 매개변수를 참조로 전달할 때 사용

    // out 키워드 사용 예시
    static void Divide(int a, int b, out int quotient, out int remainder)
    {
        quotient = a / b;
        remainder = a % b;
    }


    // ref 키워드 사용 예시
    static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }

    static void TestOutRef()
    {
        int quotient, remainder;
        Divide(7, 3, out quotient, out remainder);
        Console.WriteLine($"몫 : {quotient}, 나머지 : {remainder}");

        int x = 1, y = 2;
        Swap(ref x, ref y);
        Console.WriteLine($"x : {x}, y : {y}");
    }

    // Null 조건부 연산자
    // - Null 조건부 연산자는 ?.로 표시하며, 참조형식 변수가 null이 아닐 때만 멤버에 접근한다.

    // Null 조건부 연산자 사용 예시
    static void PrintLength(string message)
    {
        Console.WriteLine(message?.Length);
    }

    static void TestNullConditionalOperator()
    {
        string message = null;
        PrintLength(message);
        // message가 null이므로 null이 출력된다.
    }

    // Null 병합 연산자
    // - Null 병합 연산자는 ??로 표시하며, 왼쪽 피연산자가 null이 아니면 왼쪽 피연산자를 반환하고, null이면 오른쪽 피연산자를 반환한다.

    // Null 병합 연산자 사용 예시
    static void PrintMessage(string message)
    {
        Console.WriteLine(message ?? "기본 메시지");
    }

    static void TestNullCoalescingOperator()
    {
        string message = null;
        PrintMessage(message);
        // message가 null이므로 "기본 메시지"가 출력된다.
    }

    // 문자열 보간
    // - 문자열 보간은 문자열 안에 변수나 식을 삽입하는 것을 말한다.
    // - 문자열 보간은 $를 문자열 앞에 붙이고, 중괄호 {} 안에 변수나 식을 넣는다.

    // 문자열 보간 사용 예시
    static void TestStringInterpolation()
    {
        int x = 10;
        int y = 20;
        Console.WriteLine($"x : {x}, y : {y}, x + y : {x + y}");
        // x : 10, y : 20, x + y : 30이 출력된다.
    }

    // 람다식
    // - 람다식은 익명 메서드를 간결하게 표현하는 방법이다.
    // - 람다식은 매개변수 목록, 화살표(=>), 식으로 구성된다.
    // - 람다식은 무명 메서드와 달리 람다식이 선언된 위치에 따라 컴파일러가 자동으로 형식을 추론한다.

    // 람다식 사용 예시
    static void TestLambdaExpression()
    {
        Func<int, int, int> add = (a, b) => a + b;
        Console.WriteLine(add(1, 2));
        // add는 두 개의 int형 매개변수를 받아 더한 결과를 반환하는 람다식이다.
        // add(1, 2)는 1 + 2를 계산한 결과인 3을 출력한다.
    }
}
728x90
반응형

'C#' 카테고리의 다른 글

C# 예외 처리, 값형과 참조형식  (0) 2025.03.04
C# 인터페이스와 열거형  (0) 2025.03.03
C# 클래스와 객체  (0) 2025.02.13
C# 메서드(Method)와 구조체(Structures)  (0) 2025.02.11
C# 배열과 컬렉션  (1) 2025.02.10