반응형
❓ C# Nullable 타입과 null 조건 연산자 완전 정복
프로그래밍을 하다 보면 "값이 없을 수도 있는 상황"이 자주 발생한다.
예를 들어, 점수가 없을 수도 있고, 데이터가 존재하지 않을 수도 있다.
이럴 때 무작정 값을 쓰려고 하면 오류가 발생할 수 있는데,
이걸 안전하게 처리하는 방법이 바로 Nullable 형식과 null 조건 연산자다!
✅ Nullable 형식 (?)
값 타입에도 null을 허용하도록 해주는 문법
int? score = null; // OK!
int score = null; // 오류! 기본 int는 null 불가
- int, float, bool 같은 값 타입은 기본적으로 null을 가질 수 없음
- int?, bool?처럼 ?를 붙이면 null을 담을 수 있는 형식이 된다
🔎 사용 예시
int? age = 25;
if (age.HasValue)
Console.WriteLine(age.Value); // 25 출력
else
Console.WriteLine("나이 정보 없음");
- HasValue: 값이 있는지 여부
- Value: 실제 값을 꺼냄 (null일 경우 예외 발생 주의)
✅ null 조건 연산자 (?.)
객체가 null인지 먼저 확인하고, null이 아니면 멤버에 접근
Player player = null;
int? level = player?.Level;
- ?. 연산자를 사용하면 player가 null일 경우 null 반환
- null이 아니면 .Level 값 반환
📌 예시
string name = null;
Console.WriteLine(name?.ToUpper()); // 출력 안됨, null
name = "철수";
Console.WriteLine(name?.ToUpper()); // CHULSU
null이 아니라면 .ToUpper() 실행,
null이라면 예외 없이 null 반환 (에러 없음)
✅ null 병합 연산자 (??)
왼쪽 값이 null이면 오른쪽 기본값 사용
string nickname = null;
string displayName = nickname ?? "이름 없음";
Console.WriteLine(displayName); // 이름 없음
- ??는 “null이면 이걸 대신 써라”는 뜻
- ??= 도 가능! (C# 8.0 이상)
nickname ??= "게스트";
✅ 종합 예제
int? score = null;
// 1. null 체크
if (score.HasValue)
Console.WriteLine(score.Value);
else
Console.WriteLine("점수 없음");
// 2. null 병합
int finalScore = score ?? 0;
Console.WriteLine($"최종 점수: {finalScore}");
// 3. null 조건 연산자
Player player = null;
int? level = player?.Level;
✅ 언제 쓰면 좋을까?
- DB에서 받아온 값이 null일 수 있는 경우
- 게임 캐릭터가 아직 생성되지 않은 경우
- UI 요소가 아직 초기화되지 않았을 때
- 선택적 설정값에 기본값 지정하고 싶을 때
✅ 정리하며
처음에는 int?, ?., ?? 같은 문법이 낯설었지만 이해하고 나니까,
null에 대한 코드가 훨씬 깔끔해지는 느낌이었다!
사실 처음 알게된 내용인데 아직 익숙하진 않지만 생각하며 자주 사용해봐야겠다!
✔️ null 체크를 if문으로 일일이 하지 않아도 되고
✔️ 안정적인 코드 작성이 가능하다는 점에서 정말 중요한 기능이다.
반응형
'C#' 카테고리의 다른 글
C# - TextRPGGame(Console) (0) | 2025.07.11 |
---|---|
C# - StringBuilder - 문자열 성능 최적화 (6) | 2025.07.09 |
C# - 델리게이트와 람다, 함수도 변수처럼! + LINQ (5) | 2025.07.09 |
C# - 값형(Value Type)과 참조형(Reference Type) 그리고 박싱(Boxing) & 언박싱(Unboxing) (0) | 2025.07.09 |
C# - 예외처리(Exception Handling) (0) | 2025.07.09 |