C#에서 직접 캐스팅과 'as' 연산자 비교

2024-07-27

직접 캐스팅

직접 캐스팅은 형식 변환을 명시적으로 요구하는 가장 간단한 방법입니다. 변수 뒤에 원하는 형식을 괄호 안에 작성하여 수행됩니다. 예를 들어, 문자열 값을 정수로 변환하려면 다음과 같이 작성합니다.

string strValue = "123";
int intValue = (int)strValue;

직접 캐스팅은 다음과 같은 경우 유용합니다.

  • 변환하려는 값의 형식을 정확히 알고 있는 경우
  • 데이터 손실이 허용되는 경우

하지만 주의해야 할 점도 있습니다.

  • 변환하려는 값이 실제로 원하는 형식이 아닌 경우 런타임 오류가 발생할 수 있습니다.
  • 데이터 손실이 발생할 수 있습니다. 예를 들어, 큰 숫자를 작은 정수 형식으로 변환하면 일부 정보가 손실될 수 있습니다.

'as' 연산자

'as' 연산자는 변환이 안전한지 확인하는 데 유용합니다. 변수 뒤에 'as' 키워드를 사용하고 원하는 형식을 괄호 안에 작성합니다. 변환이 성공하면 변수에 값이 할당되고, 실패하면 null 값이 할당됩니다. 예를 들어, 문자열 값을 정수로 변환하려면 다음과 같이 작성합니다.

string strValue = "123";
int? intValue = strValue as int;

if (intValue != null)
{
  Console.WriteLine("변환 성공: {0}", intValue);
}
else
{
  Console.WriteLine("변환 실패");
}

'as' 연산자는 다음과 같은 경우 유용합니다.

  • 변환하려는 값의 형식이 확실하지 않은 경우
  • 데이터 손실을 방지하고 싶은 경우

'as' 연산자는 직접 캐스팅보다 느리지만, 코드를 더 안전하고 읽기 쉽게 만들 수 있습니다.

결론

직접 캐스팅과 'as' 연산자는 모두 C#에서 유용한 도구이지만, 상황에 따라 적합한 방법이 달라집니다. 변환하려는 값의 형식을 정확히 알고 있고 데이터 손실이 허용되는 경우 직접 캐스팅을 사용하는 것이 더 간편합니다. 하지만 변환하려는 값의 형식이 확실하지 않거나 데이터 손실을 방지하고 싶은 경우 'as' 연산자를 사용하는 것이 더 안전합니다.




C# 직접 캐스팅 vs 'as' 연산자 예제 코드

예제 1: 문자열을 정수로 변환

string strValue = "123";

// 직접 캐스팅
int intValue = (int)strValue;
Console.WriteLine("직접 캐스팅: {0}", intValue);

// 'as' 연산자
int? intValueAs = strValue as int;

if (intValueAs != null)
{
  Console.WriteLine("'as' 연산자: {0}", intValueAs);
}
else
{
  Console.WriteLine("'as' 연산자: 변환 실패");
}

이 코드를 실행하면 다음과 같은 출력이 생성됩니다.

직접 캐스팅: 123
'as' 연산자: 123

예제 2: 문자열을 부울로 변환

string strValue = "true";

// 직접 캐스팅
bool boolValue = (bool)strValue;
Console.WriteLine("직접 캐스팅: {0}", boolValue);

// 'as' 연산자
bool? boolValueAs = strValue as bool;

if (boolValueAs != null)
{
  Console.WriteLine("'as' 연산자: {0}", boolValueAs);
}
else
{
  Console.WriteLine("'as' 연산자: 변환 실패");
}
직접 캐스팅: True
'as' 연산자: True

예제 3: 잘못된 형식 변환

string strValue = "abc";

// 직접 캐스팅 - 런타임 오류 발생
int intValue = (int)strValue;
// 'as' 연산자 - 변환 실패
bool? boolValueAs = strValue as bool;

if (boolValueAs != null)
{
  Console.WriteLine("'as' 연산자: {0}", boolValueAs);
}
else
{
  Console.WriteLine("'as' 연산자: 변환 실패");
}
Unhandled exception: System.InvalidCastException: 문자열을 정수로 변환할 수 없습니다.
'as' 연산자: 변환 실패

위의 예제에서 볼 수 있듯이, 직접 캐스팅은 변환하려는 값의 형식을 정확히 알고 있고 데이터 손실이 허용되는 경우에만 사용해야 합니다. 'as' 연산자는 변환하려는 값의 형식이 확실하지 않거나 데이터 손실을 방지하고 싶은 경우에 사용하는 것이 더 안전합니다.




  • 다른 형식으로 변환할 수 있는 값을 가진 변수나 리터럴에 직접 적용하는 연산자입니다.
  • 가장 일반적인 명시적 형식 변환 연산자는 다음과 같습니다.
    • (int): 값을 정수로 변환합니다.
    • (double): 값을 실수로 변환합니다.
    • (bool): 값을 부울 값으로 변환합니다.

예제:

int intValue = (int)123.45;
double doubleValue = (double)"789";
string stringValue = (string)true;
bool boolValue = (bool)0;

Parse 메서드:

  • 문자열을 기본 형식 값으로 변환하는 데 사용되는 메서드입니다.
  • int.Parse(), double.Parse(), bool.Parse(), DateTime.Parse() 등 다양한 형식에 대한 Parse 메서드가 제공됩니다.
  • Parse 메서드는 문자열 값이 유효한 형식인지 확인합니다. 유효하지 않은 경우 형식 예외가 발생합니다.
string strValue1 = "123";
string strValue2 = "789.123";
string strValue3 = "true";

int intValue = int.Parse(strValue1);
double doubleValue = double.Parse(strValue2);
bool boolValue = bool.Parse(strValue3);

Console.WriteLine(intValue); // 123
Console.WriteLine(doubleValue); // 789.123
Console.WriteLine(boolValue); // True

Convert 클래스:

  • 다양한 형식 간의 변환을 제공하는 클래스입니다.
  • Convert.ToInt32(), Convert.ToDouble(), Convert.ToString(), Convert.ToBoolean() 등 다양한 형식 변환 메서드를 제공합니다.
  • Convert 클래스 메서드는 값이 유효한 형식인지 확인하지 않습니다. 따라서 유효하지 않은 값을 변환하려고 시도하면 오류가 발생할 수 있습니다.
string strValue1 = "123";
string strValue2 = "789.123";
string strValue3 = "true";

int intValue = Convert.ToInt32(strValue1);
double doubleValue = Convert.ToDouble(strValue2);
bool boolValue = Convert.ToBoolean(strValue3);

Console.WriteLine(intValue); // 123
Console.WriteLine(doubleValue); // 789.123
Console.WriteLine(boolValue); // True

사용자 정의 변환 연산자:

  • 기본 제공 형식 변환 연산자로 변환할 수 없는 사용자 정의 형식 간의 변환을 정의하는 데 사용되는 연산자입니다.
  • op_Explicit()op_Implicit() 연산자를 사용하여 정의됩니다.
class Color
{
  public int Red { get; set; }
  public int Green { get; set; }
  public int Blue { get; set; }

  public static implicit operator Color(string hexValue)
  {
    if (hexValue.Length != 6)
    {
      throw new ArgumentException("Invalid hex value");
    }

    int red = int.Parse(hexValue.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
    int green = int.Parse(hexValue.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
    int blue = int.Parse(hexValue.Substring(4, 2), System.Globalization.NumberStyles.HexNumber);

    return new Color() { Red = red, Green = green, Blue = blue };
  }

  public override string ToString()
  {
    return string.Format("#{0:X2}{1:X2}{2:X2}", Red,

c# casting



C#에서 String과 string의 차이점

1. String 클래스String은 . NET Framework의 기본 문자열 클래스입니다. 문자열 데이터를 다루기 위한 다양한 메서드와 속성을 제공하며, 다음과 같은 특징을 가집니다.불변: String 객체는 생성 후 변경할 수 없습니다...


C#에서 "Flags" 특성을 가진 열거형의 의미

1. 플래그 열거형 정의:[Flags] 특성은 열거형이 플래그로 사용될 수 있음을 나타냅니다.각 멤버 값은 2의 제곱수(1, 2, 4, 8 ...)로 정의되어 비트 연산에 사용됩니다.None 멤버는 모든 비트가 꺼진 상태(0)를 나타냅니다...


C#의 숨겨진 기능들

다음은 C#의 숨겨진 기능 몇 가지와 간단한 예시입니다:1. 범위 변수 (Range Variables)범위 변수는 for 루프에서 반복 횟수를 간결하게 표현하는 데 사용할 수 있는 변수입니다. 예를 들어, 다음 코드는 1부터 10까지 반복하며 각 숫자를 출력합니다...


C#, .NET, LINQ를 사용한 DataTable 쿼리 프로그래밍

LINQ to DataSet을 사용하여 DataTable을 쿼리할 수 있습니다.AsEnumerable() 메서드 사용: DataTable을 IEnumerable<DataRow> 인터페이스를 구현하는 개체로 변환합니다...


C#에서 기본 생성자 호출에 대한 심층 설명

C#에서 기본 생성자 호출은 객체 지향 프로그래밍의 핵심 개념인 상속과 밀접한 관련이 있습니다. 상속을 통해 만들어진 자식 클래스는 부모 클래스의 특성을 물려받게 되는데, 이때 부모 클래스의 초기화를 위해 기본 생성자를 호출하는 것이 필수적입니다...



c# casting

C#, .NET, DateTime을 이용한 나이 계산

해결 방법:DateTime 타입 변수 선언: 생일을 저장할 DateTime 타입 변수 birthday를 선언합니다. 예시: DateTime birthday = new DateTime(1990, 1, 1);DateTime 타입 변수 선언:


C#에서 상대 시간 계산

1. DateTime 구조체 사용DateTime 구조체는 날짜와 시간을 나타내는 데 사용됩니다. DateTime 객체에서 다른 DateTime 객체를 빼면 두 날짜/시간 사이의 차이를 나타내는 TimeSpan 객체를 얻을 수 있습니다


C#에서 사전을 값으로 정렬하는 방법

1. Linq 사용하기LINQ(Language Integrated Query)는 C#에 내장된 기능으로, 데이터 쿼리 및 변환을 쉽게 수행할 수 있도록 합니다. 사전을 값으로 정렬하려면 다음과 같은 코드를 사용할 수 있습니다


C#, .NET 및 성능과 관련된 Type에서 새 개체 인스턴스를 만드는 방법

1. new 키워드 사용:위 코드는 MyClass 형식의 새 인스턴스를 myObject 변수에 할당합니다. new 키워드는 메모리에 새 개체를 할당하고 해당 클래스의 생성자를 호출합니다.2. Activator 클래스 사용:


C# 반복문에서 break와 continue 사용법

break가장 가까운 바깥쪽 반복문 또는 switch 문을 종료합니다.종료된 문 다음에 오는 문으로 제어 흐름을 이동합니다 (있는 경우).예시:위 코드는 0부터 9까지 숫자를 출력하는 for 루프입니다. 하지만 i가 5가 되면 break 키워드를 만나 루프를 탈출하고 다음 문 (본 예시에서는 없음)으로 이동합니다