728x90
반응형

using System;
// C# 예외 처리와 값형식과 참조형식
// 예외 처리
// 예외 처리는 프로그램 실행 중에 발생하는 예외를 처리하는 것을 말한다.
// 예외는 프로그램 실행 중에 발생하는 오류를 말한다.
// 예외는 프로그램 실행 중에 발생하는 오류로, 예외가 발생하면 프로그램이 비정상적으로 종료된다.
// 예외 처리는 예외가 발생했을 때 프로그램이 비정상적으로 종료되는 것을 방지하고, 프로그램의 안정성을 높이기 위해 사용한다.
// C#에서는 try-catch-finally 블록을 사용하여 예외를 처리한다.
// try-catch-finally 블록
// try-catch-finally 블록은 예외 처리를 위한 블록으로, try 블록에서 예외가 발생하면 catch 블록에서 예외를 처리한다.
// try 블록은 예외가 발생할 수 있는 코드를 포함하고, catch 블록은 예외를 처리하는 코드를 포함한다.
// finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 포함한다.
// try 블록
// try 블록은 예외가 발생할 수 있는 코드를 포함한다.
// try 블록은 catch 블록이나 finally 블록과 함께 사용된다.
// catch 블록
// catch 블록은 예외를 처리하는 코드를 포함한다.
// catch 블록은 try 블록에서 예외가 발생하면 예외를 처리하는 코드를 포함한다.
// catch 블록은 try 블록에서 발생한 예외를 처리하기 위해 사용된다.
// finally 블록
// finally 블록은 예외 발생 여부와 상관없이 항상 실행되는 코드를 포함한다.
// finally 블록은 try 블록이나 catch 블록과 함께 사용된다.
// finally 블록은 try 블록이나 catch 블록에서 return 문을 사용하더라도 항상 실행된다.
// 예외 처리의 예
class ExceptionHandling
{
static void Main()
{
try
{
int[] arr = new int[10]; // 배열의 크기는 10
arr[10] = 100; // 배열의 인덱스가 10이므로 예외가 발생한다.
}
catch (IndexOutOfRangeException e) // IndexOutOfRangeException 예외를 처리한다.
{
Console.WriteLine("예외가 발생했습니다: " + e.Message); // 예외 메시지를 출력한다.
}
finally // finally 블록은 항상 실행된다.
{
Console.WriteLine("finally 블록이 실행되었습니다."); // finally 블록이 실행되었음을 출력한다.
}
}
}
// Catch 블록의 우선순위
// catch 블록은 여러 개 사용할 수 있으며, catch 블록은 여러 개의 예외를 처리할 수 있다.
// 위에서부터 아래로 순서대로 catch 블록을 검사하며, 예외가 발생하면 해당 catch 블록을 실행한다.
// 예외 타입은 상속 관계에 있는 경우 상위 예외 타입을 먼저 선언해야 한다.
// 다중 catch 블록의 예
class ExceptionHandling2
{
static void Main()
{
try
{
int[] arr = new int[10]; // 배열의 크기는 10
arr[10] = 100; // 배열의 인덱스가 10이므로 예외가 발생한다.
}
catch (IndexOutOfRangeException e) // IndexOutOfRangeException 예외를 처리한다.
{
Console.WriteLine("예외가 발생했습니다: " + e.Message); // 예외 메시지를 출력한다.
}
catch (Exception e) // Exception 예외를 처리한다.
{
Console.WriteLine("예외가 발생했습니다: " + e.Message); // 예외 메시지를 출력한다.
}
finally // finally 블록은 항상 실행된다.
{
Console.WriteLine("finally 블록이 실행되었습니다."); // finally 블록이 실행되었음을 출력한다.
}
}
}
// 예외 객체
// Chach 블록에서는 예외 객체를 사용하여 예외의 정보를 확인 및 엑세스 할 수 있다.
// 예외 객체를 사용하여 예외의 정보를 확인하고, 예외의 정보를 출력할 수 있다.
// Finally 블록의 실행 시점
// 1. 예외가 발생한 경우 : 예외가 발생하면 catch 블록이 실행되고, finally 블록이 실행된다.
// 2. 예외가 발생하지 않은 경우 : finally 블록이 실행된다.
// 사용자 정의 예외
// 사용자 정의 예외는 사용자가 직접 정의한 예외를 말한다.
// 사용자 정의 예외는 Exception 클래스를 상속받아 사용자가 직접 예외를 정의할 수 있다.
// 사용자 정의 예외의 예
class MyException
{
public class MyCustomException : Exception // 사용자 정의 예외를 정의한다.
{
public MyCustomException(string message) : base(message) // 사용자 정의 예외 생성자를 정의한다.
{
}
}
static void Main()
{
try
{
throw new MyCustomException("사용자 정의 예외가 발생했습니다."); // 사용자 정의 예외를 발생시킨다.
}
catch (MyCustomException e) // 사용자 정의 예외를 처리한다.
{
Console.WriteLine("예외가 발생했습니다: " + e.Message); // 예외 메시지를 출력한다.
}
}
}
// 위처럼 예외를 정의하여 추가적인 기능이나 정보를 제공할 수 있다.
// 값형식과 참조형식
// 값형식
// 값형식은 스택 메모리에 저장되는 데이터 형식을 말한다.
// 값형식은 데이터를 스택 메모리에 저장하고, 데이터를 복사할 때 값이 복사된다.
// 값형식은 int, float, double, char, struct 등이 있다.
// struct MyStruct
// {
// public int Value;
// }
// MyStruct struct1 = new MyStruct();
// struct1.Value = 10;
// MyStruct struct2 = struct1; // struct2는 struct1의 값 복사
// struct2.Value = 20;
// Console.WriteLine(struct1.Value); // 출력 결과: 10
// 참조형식
// 참조형식은 힙 메모리에 저장되는 데이터 형식을 말한다.
// 참조형식은 데이터를 힙 메모리에 저장하고, 데이터를 복사할 때 참조가 복사된다.
// 참조형식은 클래스, 인터페이스, 델리게이트 등이 있다.
// class MyClass
// {
// public int Value;
// }
// MyClass obj1 = new MyClass();
// obj1.Value = 10;
// MyClass obj2 = obj1; // obj2는 obj1과 동일한 객체를 참조
// obj2.Value = 20;
// Console.WriteLine(obj1.Value); // 출력 결과: 20
// 값형식과 참조형식의 차이
// 값형식은 스택 메모리에 저장되고, 참조형식은 힙 메모리에 저장된다.
// 값형식은 데이터를 복사할 때 값이 복사되고, 참조형식은 데이터를 복사할 때 참조가 복사된다.
// 값형식은 데이터를 복사할 때 값이 복사되므로 서로 독립적이다.
// 참조형식은 데이터를 복사할 때 참조가 복사되므로 서로 동일한 객체를 참조한다.
// 박싱과 언박싱
// 박싱
// 박싱은 값형식을 참조형식으로 변환하는 것을 말한다.
// 박싱은 값형식을 object 형식으로 변환하는 것을 말한다.
// 박싱은 값형식을 힙 메모리에 저장하고, object 형식으로 변환한다.
// 박싱된 값형은 참조로 전달되므로 메모리 사용량이 증가하고, 성능이 저하된다.(오버헤드 발생가능성)
// 언박싱
// 언박싱은 박싱된 값을 다시 값형식으로 변환하는 것을 말한다.
// 언박싱은 참조형식을 값형식으로 변환하는 것을 말한다.
// 언박싱은 명시적으로 타입 캐스팅을 해야 하며, 런타임에서 타입 검사를 수행한다.
// 잘못된 방식으로 언박싱을 하면 InvalidCastException 예외가 발생한다.(런타임 오류)
// 박싱과 언박싱의 예
class BoxingAndUnboxing
{
static void Main()
{
// 값형
int x = 10;
int y = x; // 값형식은 값이 복사된다.
y = 20;
Console.WriteLine("x: " + x); // 출력 결과: 10
Console.WriteLine("y: " + y); // 출력 결과: 20
// 참조형
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 4;
Console.WriteLine("arr1[0]: " + arr1[0]); // 출력 결과: 4
Console.WriteLine("arr2[0]: " + arr2[0]); // 출력 결과: 4
// 박싱과 언박싱
int num1 = 10;
object obj = num1; // 박싱
int num2 = (int)obj; // 언박싱
Console.WriteLine("num1: " + num1); // 출력 결과: 10
Console.WriteLine("num2: " + num2); // 출력 결과: 10
}
}728x90
반응형
'C#' 카테고리의 다른 글
| C# 델리게이트 (0) | 2025.03.06 |
|---|---|
| C# 인터페이스와 열거형 (0) | 2025.03.03 |
| C# 고급 문법과 기능 (0) | 2025.02.20 |
| C# 클래스와 객체 (0) | 2025.02.13 |
| C# 메서드(Method)와 구조체(Structures) (0) | 2025.02.11 |