inflearn logo
강의

Course

Instructor

C# Programming: From Fundamentals to Practical Application

Type conversion (as)

type변환 as에서 string과 int, int? 차이 질문입니다.

Resolved

196

Lucas

27 asked

0

안녕하세요!

object value = 3.14;
string result = value as string;
//  warning CS8600: Converting null literal or possible null value to non-nullable type.

int result2 = value as int;
// error CS0077: The as operator must be used with a reference type or nullable type ('int' is a non-nullable value type)

int result3 = value as int?;
//  error CS0266: Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?)
// warning CS8629: Nullable value type may be null.

int? result4 = value as int;
// error CS0077: The as operator must be used with a reference type or nullable type ('int' is a non-nullable value type)

위 코드처럼 string의 경우 ? 를 안붙이면 warning만 발생하고 코드가 실행되는데, intfloat 등의 경우 error가 발생합니다.

혹시 이 둘의 차이를 알 수 있을까요?

 

 

ps. 이 다음 강의인 Convert Class를 듣고 Convert.ToInt32()를 사용하니 아무런 에러 발생 없이 실행되네요. 명시적으로 변환을 지정해서 그런걸까요?

object value = 3.14;
int result = Convert.ToInt32(value);

C# .net

Answer 2

1

Kaburi

AI가 답변을 잘해줬네요 ㅎㅎ

메모리 관리 방식 차이가 있습니다.

class : 참조 타입 / int : 값 타입

참조 타입은 힙(Heap)에 저장되므로, 객체가 없을 수도 있기 때문에 null이 필요합니다.

값 타입은 스택(Stack)에 직접 값을 저장하며, 항상 메모리를 차지해야 하므로 null이 불가능합니다.

 

as 연산자는 참조 타입 및 Nullable<T>에서만 사용 가능합니다.

 

따라서 string 은 Nullable로 명시를 해주지 않아도 참조 타입이라서 경고만 발생된 것이고,

int는 값 타입이므로 에러가 발생하는 것 입니다.

 

아래의 코드는

object value = 3.14;
int result = Convert.ToInt32(value);

명시적으로 변환을 하는 것이기 때문에 오류가 발생하지 않습니다.

감사합니다.

1

Lucas

앗 제가 답글을 늦게 확인했습니다. 참조 타입과 값 타입간에 저장 방식 차이까지 알려주셔서 더 이해가 잘 되었습니다.

친절한 답변 감사합니다!

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. Lucas님.

질문하신 내용과 관련하여 C#의 as 연산자와 관련된 몇 가지 중요한 개념을 함께 알아보겠습니다.

as 연산자는 주로 참조 타입 혹은 nullable value 타입(Nullable<T>)으로의 안전한 타입 변환을 위해 사용됩니다. 이때 주의할 몇 가지 규칙이 있습니다:

  1. 참조 타입 변환:
    as 연산자는 참조 타입 간의 변환과 nullable 타입으로의 변환에 사용됩니다. 문자열(string)은 참조 타입이기 때문에 as 연산자를 사용할 수 있습니다. 그러나 변환이 실패하면 null을 반환하므로, 엄격한 null 처리 없이 사용할 경우 null 가능성에 대해 컴파일러 경고가 발생할 수 있습니다.

  2. 값 타입 변환:
    int와 같은 값 타입은 as 연산자로 직접 변환할 수 없습니다. 결과적으로 이는 컴파일 에러를 발생시킵니다. 대안으로 int 값을 허용하는 Nullable<int>(int?) 타입으로 변환할 수 있지만, 이 역시 value 타입이 int가 아닌 경우 변환에 실패하여 null 값을 반환할 수 있습니다. 따라서 변환 후에는 이를 int로 명시적으로 캐스팅하거나, int를 기대하는 자리에서 사용하는 데 주의가 필요합니다.

구체적인 예로 코드에서 intas int를 사용할 수 없고, int?로 먼저 변환 후 이를 명시적으로 int로 캐스트해야 합니다:

object value = 3.14;
int? nullableInt = value as int?;
if (nullableInt.HasValue)
{
    int result = (int)nullableInt;
}

관련된 예제와 설명을 담은 링크들이 아래에 있으며, 도움이 되시길 바랍니다:
- C#의 as 연산자 사용법 이해하기
- 참조 타입과 값 타입 간의 변환 시 주의사항

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

UI있는 Designer 오류 발생 질문입니다.

0

70

2

CancelationTokenSource 질문이있습니다.

0

51

2

비동기 2강 UI가 없는 환경 질문입니다.

0

65

1

16_Collection 에서 Stack_ 후입선출에 질문입니다.

0

59

2

꼭 vs2022 로 다운받아야 하나요?

1

114

2

공부 문의드립니다,,

0

77

2

똑같이 따라서 ^1 했는데 에러가 떠요.

0

68

1

영상 구문 그대로 따라했는데 에러가 나요.

0

56

1

30강 듣고 질문이있습니다.

0

62

1

오늘 첫 강의를 들었습니다.

0

80

2

159번 강의 보는데 궁금한게 있습니다

0

62

3

asp.net blazor 강의는 현재 계획없으신가요

0

77

2

강의자료

1

171

2

메소드 호출이 되는이유?

0

76

1

~ 연산자 이해가 안되요

0

166

5

thread join 사용

0

176

4

블로그 글

0

107

2

Delegate 내용은 어디서 다루나요?

0

106

2

Xunit private 메서드 테스트

0

120

2

자원정리 개념

0

113

2

강의 영상 오류

0

88

1

this string text의 동작 과정이 궁금합니다.

0

128

2

접근 제어자로 필드를 만들어 파생 클래스에서 사용할 때 질문입니다.

0

115

2

상속 부분 강좌에서 upcasting을 하는 이유가 궁금합니다.

0

134

2