본문 바로가기
TIL

11.15 (TIL)

by 오랑이귀엽다 2023. 11. 15.

델리게이트 ( Delegate )

1) 델리게이트란?

델리게이트(delegate)는 메서드를 참조하는 타입

다른 프로그래밍 언어에서는 함수 포인터라는 용어를 사용하기도 함

델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.

 

간단 구현

더보기

using System;

// 델리게이트 선언
public delegate void SimpleDelegate(string message);

class DelegateExample
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성
        SimpleDelegate simpleDelegate = new SimpleDelegate(DisplayMessage);

        // 델리게이트를 사용하여 메서드 호출
        simpleDelegate("Hello, Delegate!");

        // 다른 메서드 등록
        simpleDelegate += DisplayGreetings;
        simpleDelegate += DisplayCustomMessage;

        // 등록된 모든 메서드 호출
        simpleDelegate("Delegate Example");
    }

    // 델리게이트와 호환되는 메서드
    static void DisplayMessage(string message)
    {
        Console.WriteLine("DisplayMessage: " + message);
    }

    static void DisplayGreetings(string message)
    {
        Console.WriteLine("DisplayGreetings: Greetings, " + message);
    }

    static void DisplayCustomMessage(string message)
    {
        Console.WriteLine("DisplayCustomMessage: Custom Message - " + message);
    }
}
// SimpleDelegate라는 델리게이트를 선언

// DelegateExample 클래스에서 Main 메서드에서 델리게이트를 생성하고, 메서드를 등록하여 사용

// DisplayMessage, DisplayGreetings, DisplayCustomMessage라는 메서드들은 델리게이트와 호환되도록 정의

// simpleDelegate 인스턴스를 통해 등록된 모든 메서드를 호출

사용 예제

더보기

// 델리게이트 선언
public delegate void EnemyAttackHandler(float damage);

// 적 클래스
public class Enemy
{
    // 공격 이벤트
    public event EnemyAttackHandler OnAttack;

    // 적의 공격 메서드
    public void Attack(float damage)
    {
        // 이벤트 호출
        OnAttack?.Invoke(damage);
// null 조건부 연산자
// null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
    }
}

// 플레이어 클래스
public class Player
{
    // 플레이어가 받은 데미지 처리 메서드
    public void HandleDamage(float damage)
    {
        // 플레이어의 체력 감소 등의 처리 로직
        Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
    }
}

// 게임 실행
static void Main()
{
    // 적 객체 생성
    Enemy enemy = new Enemy();

    // 플레이어 객체 생성
    Player player = new Player();

    // 플레이어의 데미지 처리 메서드를 적의 공격 이벤트에 추가
    enemy.OnAttack += player.HandleDamage;

    // 적의 공격
    enemy.Attack(10.0f);
}

// 공격 콜백 받기

// 다음 예제에서는 event 를 붙여서 사용했다

// event는 할당연산자( = )를 사용할 수 없으며, 클래스 외부에서는 직접 이벤트를 호출할 수 없다.

 

 

람다 ( Lambda )

1) 람다란?

람다(lambda)는 익명 메서드를 만드는 방법

람다를 사용하면 메서드의 이름 없이 메서드를 만들 수 있다.

람다는 델리게이트를 사용하여 변수에 할당하거나, 메서드의 매개변수로 전달할 수 있다.

 

간단 구현

더보기

using System;

// 델리게이트 선언
public delegate int CalculateDelegate(int x, int y);

class LambdaExample
{
    static void Main()
    {
        // 델리게이트에 람다 표현식 등록
        CalculateDelegate add = (x, y) => x + y;
        CalculateDelegate subtract = (x, y) => x - y;

        // 람다 표현식을 사용하여 메서드 호출
        int resultAdd = add(5, 3);
        int resultSubtract = subtract(10, 4);

        Console.WriteLine("Addition result: " + resultAdd);
        Console.WriteLine("Subtraction result: " + resultSubtract);
    }
}

// CalculateDelegate라는 델리게이트를 선언

// LambdaExample 클래스에서 Main 메서드에서 델리게이트에 람다 표현식을 등록

// add 람다 표현식은 두 개의 정수를 더하고, subtract 람다 표현식은 두 개의 정수를 빼는 동작을 정의

// addsubtract를 호출하여 결과를 출력

// 람다 표현식은 익명으로 메서드를 생성하는 간결한 방법

// 특히 델리게이트나 LINQ에서 사용될 때 코드의 가독성을 향상시킬 수 있다.

 

 

Func과 Action

1) Func, Action 란?

Func과 Action은 델리게이트를 대체하는 미리 정의된 제네릭 형식

Func는 값을 반환하는 메서드를 나타내는 델리게이트, 마지막 제네릭 형식 매개변수는 반환 타입을 나타냄

Action은 값을 반환하지 않는 메서드를 나타내는 델리게이트, Action은 매개변수를 받아들이지만, 반환 타입이 없다.

Func 및 Action은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있다.

 

간단 구현

더보기

Func

 

using System;

class FuncExample
{
    static void Main()
    {
        // Func 델리게이트 선언
        Func<int, int, int> addFunc = (x, y) => x + y;

        // Func 델리게이트를 사용하여 메서드 호출
        int result = addFunc(5, 3);

        Console.WriteLine(" Addition result: " + result);
    }
}

// Func<int, int, int>는 두 개의 int 매개변수를 받아들이고 int를 반환하는 델리게이트를 선언

// addFunc에는 (x, y) => x + y 람다 표현식을 할당하여 두 정수를 더하는 동작을 정의

// addFunc를 호출하여 결과를 출력

 

 

Action

using System;

class ActionExample
{
    static void Main()
    {
        // Action 델리게이트 선언
        Action<string> printAction = message => Console.WriteLine(message);

        // Action 델리게이트를 사용하여 메서드 호출
        printAction("Hello, Action!");

        // 다른 Action 델리게이트 선언 (매개변수 없음)
        Action greetAction = () => Console.WriteLine("Greetings!");

        // 다른 Action 델리게이트 호출
        greetAction();
    }
}

// Action<string>string을 매개변수로 받아들이고 반환 값이 없는 델리게이트를 선언

// printAction에는 message => Console.WriteLine(message) 람다 표현식을 할당하여 메시지를 출력하는 동작을

정의

// printAction를 호출하여 메시지를 출력

// Action은 매개변수가 없는 델리게이트를 선언하며, greetAction에는 () => Console.WriteLine("Greetings!")를 할당하여 동작을 정의

// greetAction을 호출하여 인사말을 출력

 

 

LINQ (Language Integrated Query)

1) LINQ란?

.NET 프레임워크에서 제공되는 쿼리 언어 확장

데이터 소스(예: 컬렉션, 데이터베이스, XML 문서 등)에서 데이터를 쿼리하고 조작하는데 사용

데이터베이스 쿼리와 유사한 방식으로 데이터를 필터링, 정렬, 그룹화, 조인 등 다양한 작업을 수행할 수 있다.

LINQ는 객체, 데이터베이스, XML 문서 등 다양한 데이터 소스를 지원

 

2) 구조

더보기

var result = from 변수 in 데이터소스
             [where 조건식]
             [orderby 정렬식 [, 정렬식...]]
             [select 식];

  • var 키워드는 결과 값의 자료형을 자동으로 추론합니다.
  • from 절에서는 데이터 소스를 지정합니다.
  • where 절은 선택적으로 사용하며, 조건식을 지정하여 데이터를 필터링합니다.
  • orderby 절은 선택적으로 사용하며, 정렬 방식을 지정합니다.
  • select 절은 선택적으로 사용하며, 조회할 데이터를 지정합니다

 

간단 예시

더보기

using System;
using System.Linq; 

// LINQ를 사용하기 위한 네임스페이스

class LinqExample
{
    static void Main()
    {
        // 데이터 소스 생성
        int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        // LINQ 쿼리 작성
        var evenNumbers = from num in numbers
                          where num % 2 == 0
                          select num;

        // LINQ 쿼리 결과 출력
        Console.WriteLine("짝수만 추출한 결과:");
        foreach (var evenNumber in evenNumbers)
        {
            Console.Write(evenNumber + " ");
        }
    }
}

// numbers 배열을 데이터 소스로 사용

// LINQ 쿼리를 작성하여 numbers 배열에서 짝수만 추출

// where을 사용하여 조건을 지정하고, select를 사용하여 원하는 결과를 선택

// foreach 루프를 사용하여 LINQ 쿼리 결과를 출력

 

 

Nullable 형

1) null

null은 "아무것도 없음"을 의미

참조형 변수가 어떠한 객체를 참조하지 않을 때 사용

 

2) Nullable 란?

Nullable은 C#에서 null 값을 가질 수 있는 값형에 대한 특별한 형식

기본적으로 값형은 null을 허용하지 않는다.

값형 변수에 null 값을 지정할 수 있는 방법을 제공하여 값형이나 구조체를 사용하는 프로그램에서 null 상태를 나타낼 수 있다.

형식은 ? 연산자를 사용하여 선언됩니다. 예를 들어, int?는 int 형식에 null을 할당할 수 있는 Nullable<int> 형식을 나타냄

 

간단 예제

더보기

using System;

class NullableExample
{
    static void Main()
    {
        // 일반적인 값 형식
        int regularInt = 5;

        // Nullable 형식을 사용한 값 형식
        int? nullableInt = 10; // Nullable<int>와 동일

        // Nullable 형식에 null 할당
        int? nullableNull = null;

        // 값 출력
        Console.WriteLine("일반적인 값 형식: " + regularInt);
        Console.WriteLine("Nullable 형식 (값이 있는 경우): " + nullableInt);
        Console.WriteLine("Nullable 형식 (값이 null인 경우): " + nullableNull);

        // Nullable 형식에서 값 가져오기
        int valueFromNullable = nullableInt ?? 0; // 값이 있으면 그 값을 사용, 아니면 기본값 0 사용
        Console.WriteLine("Nullable 형식에서 값 가져오기: " + valueFromNullable);

        // Nullable 형식에서 null 여부 확인
        if (nullableInt.HasValue)
        {
            Console.WriteLine("Nullable 형식에 값이 있습니다: " + nullableInt.Value);
        }
        else
        {
            Console.WriteLine("Nullable 형식에 값이 없습니다.");
        }
    }
}

// int?Nullable<int> 형식의 축약된 표현으로 사용

// nullableInt 변수에 10을 할당하고, nullableNull 변수에는 null을 할당

// ?? 연산자를 사용하여 nullableInt의 값을 가져오고, 값이 없으면 기본값인 0을 사용

// HasValue 속성을 사용하여 nullableInt에 값이 있는지 확인

 

 

문자열 빌더 (StringBuilder)

1) StringBuilder 란?

문자열 조작

StringBuilder는 Append(), Insert(), Replace(), Remove() 등 다양한 메서드를 제공하여 문자열에 대한 추가, 삽입, 치환, 삭제 작업을 수행할 수 있다.

 

가변성

StringBuilder는 내부 버퍼를 사용하여 문자열 조작을 수행하므로 크기를 동적으로 조정할 수 있다.

 

효율적인 메모리 관리

문자열 조작 시 StringBuilder는 내부 버퍼를 사용하여 문자열을 조작하므로, 반복적인 문자열 조작 작업이 발생해도 메모리 할당 및 해제 오버헤드가 크게 감소

 

2) 주요 메서드

Append: 문자열을 뒤에 추가합니다.

Insert: 문자열을 지정한 위치에 삽입합니다.

Remove: 지정한 위치에서 문자열을 제거합니다.

Replace: 문자열의 일부를 다른 문자열로 대체합니다.

Clear: StringBuilder의 내용을 모두 지웁니다.

 

간단 예제

더보기

using System;
using System.Text; 

// StringBuilder를 사용하기 위한 네임스페이스

class StringBuilderExample
{
    static void Main()
    {
        // StringBuilder 인스턴스 생성
        StringBuilder stringBuilder = new StringBuilder();

        // 문자열 추가
        stringBuilder.Append("Hello, ");

        // 다른 문자열 추가
        stringBuilder.Append("StringBuilder!");

        // 문자열 삽입
        stringBuilder.Insert(7, "C# ");

        // 특정 위치부터 문자열 삭제
        stringBuilder.Remove(0, 7);

        // 특정 위치에 문자열 삽입
        stringBuilder.Insert(0, "Greetings, ");

        // 문자열 변경
        stringBuilder.Replace("C#", "World");

        // 최종 문자열 출력
        Console.WriteLine(stringBuilder.ToString());
    }
}

// StringBuilder 인스턴스를 생성

// Append 메서드를 사용하여 문자열을 추가

// Insert 메서드를 사용하여 특정 위치에 문자열을 삽입

// Remove 메서드를 사용하여 특정 위치부터 문자열을 삭제

// Replace 메서드를 사용하여 문자열을 변경

// ToString 메서드를 사용하여 StringBuilder의 내용을 최종적으로 문자열로 출력

 

'TIL' 카테고리의 다른 글

11.17 (TIL)  (1) 2023.11.17
11.16 (TIL)  (0) 2023.11.16
11.14 (TIL)  (0) 2023.11.14
11.13 (TIL)  (0) 2023.11.13
11.10 (TIL)  (0) 2023.11.10