잊어버리기 쉬운 중요 개념 정리 - 2
이번 포스트에서는 2주차 강의에서 들었던 개념들을 내가 헷갈릴만한 내용들을 다시 한 번 정리하는 시간을 가져보겠다.
이 외에도 더 많은 개념들이 있지만 오늘 포스트에선 쉬운 내용일 순 있지만 확실히 짚고 넘어가야 하는 키워드만 모아보았다.
- 예외 처리
- 델리 게이트
- 람다
- Func, Action
- 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);
회고
오늘은 바로 개인 과제를 미리 하기 위해 이번 주차 강의를 다 봤다. 어려운 내용이 많긴 했지만 그럭저럭 이해하며 들으만 했었던 같다. 아직 용어 정리를 다 한 건 아니지만 나머지는 알고리즘 쪽이라 따로 묶어서 한 번 정리를 하고 싶어서 일부러 한 번 끊어서 정리할려고 한다. 개인과제도 기본 구현은 얼추 돌아가는데 아직 최적화는 안되있고 쭉 작성만 되있는 형태이고 쪼금만 더 다듬어 지면 포스트 한 번 해보겠다. 하루 종일 과제만 만지고 있었는데 아직 절반도 안온 것 같아서 뭔가 뭔가 뭔가 아쉬운 하루였다.
하루하루 열심히 쌓여서 어느새 실력이 늘어있기를 간절히 빌어보는 또 하루였다.
'내일배움캠프 - TIL > 내일배움캠프 - TIL' 카테고리의 다른 글
| 내일배움캠프 6일차 TextRPG (5) | 2025.04.17 |
|---|---|
| 내일배움캠프 5일차 TIL 2주차 강의 5 (0) | 2025.04.16 |
| 내일배움캠프 3일차 TIL 2주차 강의 1~4 (0) | 2025.04.14 |
| 내일배움캠프 2일차 TIL 1주차 강의 완 (0) | 2025.04.11 |
| 내일배움캠프 1일차 TIL 빗물받는 르탄이, 게임 속 상호작용 분석 컨텐츠 (1) | 2025.04.10 |