내일배움캠프 - TIL/내일배움캠프 - TIL

내일배움캠프 4일차 TIL 2주차 강의 4~

rudals4469 2025. 4. 15. 19:57

잊어버리기 쉬운 중요 개념 정리 - 2

이번 포스트에서는 2주차 강의에서 들었던 개념들을 내가 헷갈릴만한 내용들을 다시 한 번 정리하는 시간을 가져보겠다.

이 외에도 더 많은 개념들이 있지만 오늘 포스트에선 쉬운 내용일 순 있지만 확실히 짚고 넘어가야 하는 키워드만 모아보았다.

  1. 예외 처리
  2. 델리 게이트
  3. 람다
  4. Func, Action
  5. Nullable

사실 위의 개념들은 거의 처음 접해보는 개념이긴 한데 튜터님께서 꽤나 자주 사용하는 키워드라고 하시니 까먹지 않게 정리 해볼려고 한다.

 

1. 예외 처리

  • 예외란
    • 예외는 프로그램 실행 중에 발생하는 예기치 않은 상황을 의미한다.
    • 프로그램의 정상적인 흐름을 방해하고 오류를 야기할 수 있다.
  • 필요성과 장점
    • 예외 상황에 대비하여 프로그램을 안정적으로 유지하는데 도움을 준다
    • 오류 상황을 적절히 처리하고, 프로그램의 실행을 계속할 수 있다.
    • 프로그램의 안정성을 높이고 디버깅을 용이하게 한다.
  • 예외 처리 구현
    • try-catch 블럭을 사용한다.
try
{
    // 예외가 발생할 수 있는 코드
}
catch (ExceptionType1 ex)
{
    // ExceptionType1에 해당하는 예외 처리
}
catch (ExceptionType2 ex)
{
    // ExceptionType2에 해당하는 예외 처리
}
finally
{
    // 예외 발생 여부와 상관없이 항상 실행되는 코드
}
  • catch 블록의 우선순위는 위에서 부터 순서대로 실행되며 상속 관계에 있는 경우 상위 예외 타입의 블록이 먼저 실행된다.
  • finally 블록
    • 역할과 사용법 
      • 예외 발생 여부와 상관없이 항상 실행되는 코드 블록이다.
      • 예외 처리의 마지막 단계로, 예외 발생 시 정리 작업이나 리소스 해제 등의 코드를 포함할 수 있다.
      • try-catch 블록 뒤에 작성되며, 생략 가능하다.
    • 실행 지점
      • 예외가 발생한 경우에는 예외 처리 과정을 마친 후, 예외가 없어도 정상적으로 실행된다.
  • 사용자 정의 예외
    • 사용자 정의 예외 클래스 작성
      • 사용자는 필요에 따라 자신만의 예외 클래스를 작성할 수 있다.
      • 사용자 정의 예외 클래스는 Exception 클래스는 상속받아 작성하며, 추가적인 기능이나 정보를 제공한다.
    • 사용자 정의 예외 처리
      • 사용자 정의 예외가 발생한 경우, try-catch 블록에서 해당 예외를 처리할 수 있다.
      • catch 블록에서 사용자 정의 예외 타입을 명시하여 예외를 처리하고, 예외에 대한 적절한 처리 로직을 작성할 수 있다.
// 플레이어 이동
try
{
    // 플레이어 이동 코드
    if (IsPlayerCollidingWithWall())
    {
        throw new CollisionException("플레이어가 벽에 충돌했습니다!");
    }
}
catch (CollisionException ex)
{
    // 충돌 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 리소스 로딩
try
{
    // 리소스 로딩 코드
    LoadResource("image.png");
}
catch (ResourceNotFoundException ex)
{
    // 리소스가 없는 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}
catch (ResourceLoadException ex)
{
    // 리소스 로딩 중 오류가 발생한 경우 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}


// 게임 상태 전이
try
{
    // 상태 전이 코드
    if (currentGameState != GameState.Playing)
    {
        throw new InvalidStateException("게임이 실행 중이 아닙니다!");
    }
    // 게임 상태 전이 실행
}
catch (InvalidStateException ex)
{
    // 상태 예외 처리
    Debug.Log(ex.Message);
    // 예외에 대한 추가 처리
}

2. 델리게이트

  • 델리게이트란
    • 메서드를 참조하는 타입
    • 다른 프로그래밍 언어에서는 포인터라는 용어를 사용한다.
    • 델리게이트를 이용하면 메서드를 매개변수로 전달하거나 변수에 할당할 수 있다.
  • 구현
    • 메서드 등록해서 사용하기
delegate void MyDelegate(string message);

static void Method1(string message)
{
    Console.WriteLine("Method1: " + message);
}

static void Method2(string message)
{
    Console.WriteLine("Method2: " + message);
}

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성 및 메서드 등록
        MyDelegate myDelegate = Method1;
        myDelegate += Method2;

        // 델리게이트 호출
        myDelegate("Hello!");

        Console.ReadKey();
    }
}

 

  • 사용 예제
    • 공격 콜백 받기
      • 다음 예제에서는 event를 붙여서 사용했다
      • event는 할당 연사자를 사용할 수 없으면, 클랫 ㅡ외부에서는 직접 이벤트를 호출할 수 없다.
      •  
// 델리게이트 선언
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);
}

3. 람다

  • 람다란
    • 람다는 익명 메서드를 만드는 방법입니다.
    • 람다는 사용하면 메서드의 이름 없이 메서드를 만들 수 있다.
    • 델리게이트를 사용하여 변수에 할당하거나, 메서드의 매개변수로 전달할 수 있다.
  • 사용예제
using System;

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

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성 및 람다식 할당
        MyDelegate myDelegate = (message) =>
        {
            Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
        };

        // 델리게이트 호출
        myDelegate("안녕하세요!");

        Console.ReadKey();
    }
}

 

4. Func, Action

  • Fucn과 Action은 델리게이트를 대체하는 미리 정의된 제네릭 형식이다.
  • Func은 값을 반환하는 메서드를 나타내는 델리게이트이다. 마지막 제네릭 형식 매개변수는 반환 타입을 나타낸다.
  • 예를 들어 Func<int, string>은 int를 입력받아 string을 반환하는 메서드를 나타낸다.
  • Action은 값을 반환하지 않는 메서드를 나타내는 델리게이트이다. Action은 매개변수를 받아들이지만, 반환 타입이 없다..
  • 예를 들어 Action<int, string>은 int와 string을 입력으로 받고, 아무런 값을 반환하지 않는 메서드를 나타낸다.
  • Fucn 및 Action은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있다.
  • 예제
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
    return x + y;
}

// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);

// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
    Console.WriteLine(message);
}

// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");

 

5. Nullable

  • Nullable은 C#에서 numm 값을 가질 수 있는 값형에 대한 특별한 형식이다.
  • 기본적으로 값형은 null을 허용하지 않는다
  • 값형 변수에 null 값을 지정할 수 있는 방법을 제공하여 값형이나 구조체를 사용하는 프로그램에서 null 상태를 나타낼 수 있다. 주로 값형 변수가 null인지 아닌지는 확인하고 처리해야 할 때 유용하다.
  • 형식은 ? 연산자를 사용하여 선언된다. 예를 들어 int?은 int 형식에 null을 할당할 수 있는 Nullable<int> 형식이다.
// Nullable 형식 변수 선언
int? nullableInt = null;
double? nullableDouble = 3.14;
bool? nullableBool = true;

// 값 할당 및 접근
nullableInt = 10;
int intValue = nullableInt.Value;

// null 값 검사
if (nullableDouble.HasValue)
{
    Console.WriteLine("nullableDouble 값: " + nullableDouble.Value);
}
else
{
    Console.WriteLine("nullableDouble은 null입니다.");
}

// null 병합 연산자 사용
// nullableInt ?? 0과 같이 사용되며, nullableInt가 null이면 0을 반환합니다.
int nonNullableInt = nullableInt ?? 0;
Console.WriteLine("nonNullableInt 값: " + nonNullableInt);

 


 

회고

오늘은 바로 개인 과제를 미리 하기 위해 이번 주차 강의를 다 봤다. 어려운 내용이 많긴 했지만 그럭저럭 이해하며 들으만 했었던 같다. 아직 용어 정리를 다 한 건 아니지만 나머지는 알고리즘 쪽이라 따로 묶어서 한 번 정리를 하고 싶어서 일부러 한 번 끊어서 정리할려고 한다. 개인과제도 기본 구현은 얼추 돌아가는데 아직 최적화는 안되있고 쭉 작성만 되있는 형태이고 쪼금만 더 다듬어 지면 포스트 한 번 해보겠다. 하루 종일 과제만 만지고 있었는데 아직 절반도 안온 것 같아서 뭔가 뭔가 뭔가 아쉬운 하루였다.

하루하루 열심히 쌓여서 어느새 실력이 늘어있기를 간절히 빌어보는 또 하루였다.