Null 문제?
C# 프로그래밍을 하다 보면 NullReferenceException 이라는 오류를 종종 봤을 것이다.
이 오류는 객체가 null인데 그 객체의 메서드나 프로퍼티에 접근하려고 했을 때, 런타임에서 프로그램이 터져버리는 문제다.
예를 들어, 캐릭터를 형변환(as)했는데 실패하면 null이 반환된다.
그런 상황에서 그 캐릭터 클래스의 내부 데이터나 메서드에 접근하려고 하면 오류가 발생한다.
(party[0] as Hunter).Roll(); // 변환 실패 시 null.Roll() - NullReferenceException 발생
Null 조건부 연산자 (?.)
C# 6.0 부터 도입된 Null 조건부 연산자(?.)는, 객체가 null인지 아닌지를 간단히 확인하고, null일 경우 뒤에 메서드 호출이나 프로퍼티 접근을 건너뛰는 기능이다.
Javascript에서도 해당 기능을 볼 수 있다.
(party[0] as Hunter)?.Roll();
위 코드 블럭의 코드에서 party[0] as Hunter 변환을 성공하면 Hunter 타입 객체로 변환 후 Roll()을 실행할 수 있다.
하지만 변환 실패시 null이 반환되기 때문에 ?.를 통해 Roll()을 호출하지 않고 넘어가서 오류를 피할 수 있다.
프로그램이 오류를 마주할 때마다 터져버려서야 유저 입장에서는 너무 불편할 것이다.
이런 예외처리를 잘 해두는 것이 프로그래밍에서는 아주 중요하다.
abstract class Character
{
public abstract void BaseAttack();
}
class Mage : Character
{
public override void BaseAttack() => Console.WriteLine("스태프로 공격!");
public void Teleport() => Console.WriteLine("텔레포트!");
}
class Hunter : Character
{
public override void BaseAttack() => Console.WriteLine("총으로 공격!");
public void Roll() => Console.WriteLine("구른다!");
}
class Program
{
static void Main(string[] args)
{
Character[] party = { new Mage(), new Hunter() };
// Null 조건부 연산자 사용
(party[0] as Hunter)?.Roll(); // 출력 없음 (Mage는 Hunter가 아님 → null)
(party[1] as Hunter)?.Roll(); // "구른다!" 출력
}
}
is / as 와도 조합해서 사용할 수 있다.
foreach (var c in party)
{
if (c is Mage)
(c as Mage).Teleport();
else if (c is Hunter)
(c as Hunter).Roll();
}
// 위처럼 작성된 코드를 아래처럼 간단하게 바꿀 수 있다.
foreach (var c in party)
{
(c as Mage)?.Teleport();
(c as Hunter)?.Roll();
}
Nullable Value Type
?. 는 참조 타입뿐 아니라 Nullabel 값 타입에도 활용된다
예를들어 int?는 int에 null을 허용하는 타입이다.
int? score = null;
Console.WriteLine(score?.ToString() ?? "점수 없음");
// score가 null이면 "점수 없음" 출력
여기서 ??는 null 병합 연산자로, 왼쪽이 null이면 오른쪽 값을 반환한다.
즉 ?.와 함께 쓰면 안전하게 null 확인 + 기본값 제공 까지 쉽게 할 수 있다.
'C#' 카테고리의 다른 글
| C# - 제네릭 (Generic) (0) | 2025.09.21 |
|---|---|
| C# - 추상 클래스 실습 문제 풀이 (0) | 2025.09.21 |
| C# - 추상 클래스 (Abstract Class) (0) | 2025.09.21 |
| C# - 오버로딩과 오버라이딩의 차이 (0) | 2025.09.19 |
| C# - 클래스 Static 실습 문제 풀이 (0) | 2025.09.19 |