[TIL] C# - 예외 처리 , 박싱 & 언박싱

MINO·2024년 4월 29일
0
post-thumbnail

2024-04-29

주말 간의 달디단 휴식이 끝나고, 새로운 팀 프로젝트가 시작되었다.
지난 주에 제작한 개인 프로젝트 Sparta Dungeon 텍스트형 RPG 를 업데이트하여
턴제 전투 기능과 새로운 직업, 스킬을 추가하는 것이 목표이다.

첫번째 날, 저장/불러오기 기능을 맡아 구현하였고,
기존에 사용했던 Player 클래스를 상속 받아 Warrior 클래스와 Mage 클래스를 생성해주었다.


예외 처리

프로그램 실행 중에 발생하는 예기치 않은 상황을 예외 라고 부른다.

  • 예외 처리를 통해 오류 상황을 적절히 처리하고, 프로그램의 실행을 유지
  • 프로그램의 안정성을 높이고, 디버깅을 용이하게 함

C# 에서는 try-catch 블록을 사용하여 예외 처리를 수행
try - 블록 내에서 예외가 발생할 수 있는 코드를 작성
catch - 블록에서 예외를 처리


특징

catch 블록

  • catch 블록은 위에서부터 순서대로 실행되며, 해당하는 첫 번째 catch 블록이 실행됨
  • 예외 타입이 상속 관계에 있는 경우, 상위 예외 타입의 catch 블록이 먼저 실행됨

finally 블록

  • finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드 블록
  • finally 블록은 예외 처리의 마지막 단계로, 예외 발생 시 정리 작업이나 리소스 해제 등의 코드를 포함
  • try-catch 블록 뒤에 작성되며, 생략이 가능

사용자 정의 예외 클래스

  • 필요에 따라 자신만의 예외 클래스를 작성할 수 있음
  • 사용자 정의 예외 클래스는 Exception 클래스를 상속받아 작성할 수 있음

예외 예시

  • 숫자 나누기 예외 처리
try
{
	int result = 10 / 0; // ArithmeticException 발생
    Console.WriteLine("결과 " + result);
}
catch (DivideByZeroException ex)
{
	Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (Exception ex)
{
	Console.WriteLine("예외가 발생했습니다. " + ex.Message);
}
finally
{
	Console.WriteLine("finally 블록이 실행되었습니다.");
}

  • 사용자 정의 예외 처리
    (0 ~ 4 까지 수를 랜덤으로 뽑는데, 2 이상의 수가 나오면 잘못된 범위로 예외 처리를 하고 싶다.)
public class WrongNumberException : Exception
{
	public WrongNumberException(string message) : base(message) // 이니셜라이저
    {
    }
}

Random random = new Random();
try
{
	int number = random.Next(0,5);
    
    if(number >= 2)
    {
    	throw new WrongNumberException("범위에 벗어난 수 입니다.");
	}
}
catch (WrongNumberException ex)
{
	Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
	Console.WriteLine("예외가 발생했습니다. " + ex.Message);
}

이니셜라이저(Initializer)

Exception 을 상속 받은 WrongNumberException 의 생성자 부분에 : base(message) 를 나타내는 말이다.

뿐만 아니라,

  • 변수 선언과 동시에 초기화 : int a = 10;
  • List 생성과 동시에 초기화 : List<int> list = new List<int> {1,2,3};
  • 객체 생성과 동시에 초기화 : Player player = new Player(name = "Kim", atk = 10, def = 5};

처럼 선언과 동시에 초기화를 해주는 메서드를 뜻한다.

여기서 : base(message) 코드는
WrongNumberException 의 생성자가 호출되기 전에,
부모 클래스인 Exception 의 생성자가 먼저 호출되어야 한다는 것을 알려주는 이니셜라이저 이다.


박싱 & 언박싱

값형과 참조형 사이의 변환

값형

변수에 값을 직접 저장하는 형태

  • 변수가 실제 데이터를 보유하고 있음
  • 해당 변수를 다른 변수에 할당하거나 전달할 때, 값이 복사됨
  • 해당 값형 변수의 수정은 다른 변수에 영향을 주지 않음
  • int , float , double , bool 등의 기본 데이터 타입들

참조형

변수가 데이터에 대한 참조(메모리 주소)를 저장하는 형태

  • 변수가 실제 데이터를 가리키는 참조를 갖고 있음
  • 해당 변수를 다른 변수에 할당하거나 전달할 때, 참조가 복사됨
  • 참조형 변수의 수정은 동일한 데이터를 가리키고 있는 다른 변수에 영향을 줄 수 있음
  • 클래스 , 배열 , 인터페이스 등

박싱

값형을 참조형으로 변환하는 과정

  • 값형 변수의 값을 메모리의 힙 영역에 할당된 객체로 래핑
  • 참조로 전달되므로 메모리 오버헤드가 발생할 수 있음
int num1 = 10;
object obj = num1; // 박싱

언박싱

박싱된 객체를 다시 값형으로 변환하는 과정

  • 명시적으로 타입 캐스팅을 해야 함
  • 잘못된 형식으로 언박싱하면 런타임 에러가 발생할 수 있음
int num2 = (int)obj; // 언박싱

특징

  • 값형과 참조형 사이의 변환 작업은 성능에 영향을 미칠 수 있음
  • 박싱된 객체는 힙 영역에 할당되므로 가비지 컬렉션의 대상이 될 수 있음
  • object 는 .NET Common Type System (CTS) 의 일부로, 모든 클래스의 직간접적인 상위 클래스

TIL 마무리

다시 팀 프로젝트가 진행되어, 새로운 기능을 구현하거나 공부하기 전까진 TIL 에 쓸 내용이 별로 없을 것 같다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글