트랙
/
C#
C#
/
연습 문제
/
마케팅팀의 Tim
마케팅팀의 Tim

마케팅팀의 Tim

학습 연습 문제

소개

Null 허용

C#에서 null 리터럴은 값이 없음을 나타낼 때 사용해요. Null 허용 형식은 null 값을 허용하는 형식이에요.

C# 8.0 이전에는 참조 형식은 항상 null을 허용했고, 값 형식은 그렇지 않았어요. 값 형식은 뒤에 물음표(?)를 붙여서 null을 허용하도록 만들 수 있어요.

string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable

int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable

int? nullableValueType = 5; // Define nullable value type
nullableValueType = null;   // Valid as type is nullable

null인 변수의 멤버에 접근해도 컴파일 오류는 발생하지 않지만, 런타임에 NullReferenceException이 발생해요.

string sentence = null;

// Throws NullReferenceException at runtime
sentence.Length;

이런 흔한 실수를 막기 위해, C# 8에서는 참조 형식을 기본적으로 null을 허용하지 않도록 만드는 기능을 선택적으로 사용할 수 있어요.

string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)

string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable

Null 허용 값을 안전하게 다루려면, 사용하기 전에 값이 null인지 확인해요.

string NormalizedName(string? name)
{
    if (name == null)
    {
        return "UNKNOWN";
    }

    // Value is not null at this point, so no compile warning
    // and no runtime NullReferenceException being thrown
    return name.ToUpper();
}

NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"

?? 연산자는 값이 null일 때 기본값을 반환할 수 있게 해줘요.

string? name1 = "John";
name1 ?? "Paul"; // => "John"

string? name2 = null;
name2 ?? "George"; // => "George"

?. 연산자는 null일 수도 있는 값의 멤버를 안전하게 호출할 수 있게 해줘요.

string? fruit = "apple";
fruit?.Length; // => 5

string? vegetable = null;
vegetable?.Length; // => null

지침

이 연습 문제에서는 공장 직원용 배지를 출력하는 코드를 작성해요.

1. 직원의 배지를 출력해요

직원에게는 ID, 이름, 부서 이름이 있어요. 직원 배지 라벨은 다음과 같은 형식이에요: "[id] - name - DEPARTMENT". 직원의 배지 라벨을 반환하도록 (static) Badge.Print() 메서드를 구현해요:

Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"

라벨에서는 부서 이름을 대문자로 표시해야 해요.

2. 신입 직원의 배지를 출력해요

컴퓨터 시스템의 특이한 점 때문에, 신입 직원은 공장에서 일을 시작할 때 아직 ID가 없는 경우가 가끔 있어요. 배지는 반드시 필요하기 때문에, ID 접두사 없이 임시 배지를 받게 돼요. 아직 ID가 없는 신입 직원을 지원하도록 (static) Badge.Print() 메서드를 수정해요:

Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"

3. 공장주의 배지를 출력해요

공장주조차도 항상 배지를 달고 있어야 해요. 하지만 공장주에게는 부서가 없어요. 이 경우 라벨에는 부서 이름 대신 "OWNER"가 출력되어야 해요. 공장주의 라벨을 출력하도록 (static) Badge.Print() 메서드를 수정해요:

Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"

공장주가 신입 직원일 수도 있다는 점에 유의해요:

Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
C# Exercism

마케팅팀의 Tim 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 C# 트랙을 개념 62개연습 문제 178개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.