해결된 질문
작성
·
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
만 발생하고 코드가 실행되는데, int
나 float
등의 경우 error
가 발생합니다.
혹시 이 둘의 차이를 알 수 있을까요?
ps. 이 다음 강의인 Convert Class를 듣고 Convert.ToInt32()를 사용하니 아무런 에러 발생 없이 실행되네요. 명시적으로 변환을 지정해서 그런걸까요?
object value = 3.14;
int result = Convert.ToInt32(value);
답변 2
1
AI가 답변을 잘해줬네요 ㅎㅎ
메모리 관리 방식 차이가 있습니다.
class : 참조 타입
/ int : 값 타입
참조 타입은 힙(Heap)
에 저장되므로, 객체가 없을 수도 있기 때문에 null
이 필요합니다.
값 타입은 스택(Stack)
에 직접 값을 저장하며, 항상 메모리를 차지해야 하므로 null
이 불가능합니다.
as
연산자는 참조 타입 및 Nullable<T>
에서만 사용 가능합니다.
따라서 string 은 Nullable
로 명시를 해주지 않아도 참조 타입이라서 경고만 발생된 것이고,
int는 값 타입이므로 에러가 발생하는 것 입니다.
아래의 코드는
object value = 3.14;
int result = Convert.ToInt32(value);
명시적으로 변환을 하는 것이기 때문에 오류가 발생하지 않습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. Lucas님.
질문하신 내용과 관련하여 C#의 as
연산자와 관련된 몇 가지 중요한 개념을 함께 알아보겠습니다.
as
연산자는 주로 참조 타입 혹은 nullable value 타입(Nullable<T>
)으로의 안전한 타입 변환을 위해 사용됩니다. 이때 주의할 몇 가지 규칙이 있습니다:
참조 타입 변환:
as
연산자는 참조 타입 간의 변환과 nullable 타입으로의 변환에 사용됩니다. 문자열(string
)은 참조 타입이기 때문에 as
연산자를 사용할 수 있습니다. 그러나 변환이 실패하면 null
을 반환하므로, 엄격한 null 처리 없이 사용할 경우 null
가능성에 대해 컴파일러 경고가 발생할 수 있습니다.
값 타입 변환:
int
와 같은 값 타입은 as
연산자로 직접 변환할 수 없습니다. 결과적으로 이는 컴파일 에러를 발생시킵니다. 대안으로 int
값을 허용하는 Nullable<int>
(int?
) 타입으로 변환할 수 있지만, 이 역시 value
타입이 int
가 아닌 경우 변환에 실패하여 null
값을 반환할 수 있습니다. 따라서 변환 후에는 이를 int
로 명시적으로 캐스팅하거나, int
를 기대하는 자리에서 사용하는 데 주의가 필요합니다.
구체적인 예로 코드에서 int
에 as int
를 사용할 수 없고, int?
로 먼저 변환 후 이를 명시적으로 int
로 캐스트해야 합니다:
object value = 3.14;
int? nullableInt = value as int?;
if (nullableInt.HasValue)
{
int result = (int)nullableInt;
}
관련된 예제와 설명을 담은 링크들이 아래에 있으며, 도움이 되시길 바랍니다:
- C#의 as 연산자 사용법 이해하기
- 참조 타입과 값 타입 간의 변환 시 주의사항
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
앗 제가 답글을 늦게 확인했습니다. 참조 타입과 값 타입간에 저장 방식 차이까지 알려주셔서 더 이해가 잘 되었습니다.
친절한 답변 감사합니다!