인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Lucas님의 프로필 이미지

작성한 질문수

C# 프로그래밍 기초부터 실전 활용까지

Type 변환(as)

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

해결된 질문

작성

·

110

·

수정됨

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);

답변 2

1

Kaburi님의 프로필 이미지
Kaburi
지식공유자

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

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

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

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

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

 

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

 

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

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

 

아래의 코드는

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

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

감사합니다.

Lucas님의 프로필 이미지
Lucas
질문자

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

친절한 답변 감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 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 연산자 사용법 이해하기
- 참조 타입과 값 타입 간의 변환 시 주의사항

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

Lucas님의 프로필 이미지

작성한 질문수

질문하기