본문 바로가기

C#/기본 문법

C# Nullable

 

오늘은  Nullable에 대해서 간단하게 알아보려고 한다.

 

 

Null이란 일반적으로 비어있음 을 표현하는 것으로 비어있는 참조를 접근할 때 NullReferenceException 등이 뜨는 것으로 익숙한 그것이며, 일반적으로 참조 타입 (string, class) 등에만 사용할 수 있다.


 

우리의 C#은 Nullability라는 것으로 값 타입 형식의 (int,float,bool..) 등이 가질 수 없는 null값을 가질 수 있게 주며, 아래와 같은 방식을 통해 null값을 가질 수 있게 가능하다.

// null을 허용하지 않는 일반적인 참조타입
string notNullable = "Hello World!";

// 명시적 nullable
string? nullable = null;

 


 

이러한 Nullable은 사용에 있어서 여러 장점이 있는데

 

1. 명시적으로 "값 없음"을 표현가능 하다.

int? userAge = GetUserAgeFromDatabase();
if (userAge == null)
{
    Console.WriteLine("사용자의 나이를 찾을 수 없습니다.");
}

 

위와 같이 데이터 베이스에서 값을 가져올 때, 값이 없는 경우 null을 사용하여 직관적으로 분류가 가능하다.

 

 

2. 안전한 null 처리 (?. 연산자)

int? length = myString?.Length;  // myString이 null이면 length도 null

 

위와 같이 ?. 연산자를 사용하면 null 체크 없이도 값을 안전하게 가져올 수 있다.

 

 

3. 명확한 의도의 전달

public int? GetAge()  // null을 반환할 수 있음
{
    return null;  
}

public int GetAgeOrDefault()  // 항상 값을 반환해야 함
{
    return 0;  
}

 

위와 같이 int? 를 사용하면 해당 메서드에 접근/사용하는 다른 사용자들에게 "이 값은 없을 수도 있다"라는 의도를 명확히 전달할 수 있기에, 협업 시에도 유용히 활용된다.

 

 

 

 

이러한 장점들이 있으며, 이전 작성한 함수 포인터 (Action, func) 부분에서도 아래와 같이 활용한 적이 있다.

https://toacode.tistory.com/10

public Action skillOnWaiting;


public class SkillUseOnAnim : StateMachineBehaviour
{
    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        MonsterObject monsterObject = animator.GetComponent<MonsterObject>();
        monsterObject.skillOnWaiting?.Invoke();//action 대리자가 비어있을 수 있다는 명시.
        monsterObject.skillOnWaiting = null;
    }
}

 

 


 

두줄 요약

1. nullable을 사용시 null을 다룰 때 예외 없이 안전한 코드 작성이 가능하다.

2. 코드의 가독성과 유지보수성, 협업시의 안정성이 향상된다.

'C# > 기본 문법' 카테고리의 다른 글

C# HashSet<T> (자료구조)  (0) 2025.02.12
C# Stack (자료구조)  (0) 2025.02.11
(C#) 람다식 + (무명 메소드)  (0) 2024.03.09
(C#) 델리게이트  (0) 2024.03.06
(C#) 인터페이스  (0) 2024.02.24