이 Step에서 다루는 것

  • nullptr가 왜 필요한지: 0/NULL의 모호성을 제거
  • 포인터 함수가 “못 찾으면 없음”을 표현하는 가장 흔한 방식: null 반환
  • 널 체크의 핵심 기술: 짧은 회로(Short-circuit) 로 안전하게 깊은 멤버 접근하기

학습 목표

  • nullptr가 “포인터 전용 값”이라는 의미를 설명할 수 있다.
  • “반환값이 포인터인 함수는 null일 수 있다”는 전제를 코드로 안전하게 처리할 수 있다.
  • a != nullptr && a->b != nullptr 패턴이 왜 안전한지(평가 순서/단락 평가)를 설명할 수 있다.

nullptr = “포인터 전용으로 의미가 확실한 없음”

  • C++에서는 0이나 NULL 대신 nullptr를 씁니다.
  • 이유: 0/NULL은 정수와 섞여서 의미가 헷갈릴 수 있지만, nullptr는 “포인터용 null”이기 때문입니다.

추가로 많이 하는 습관:

delete p;
p = nullptr; // "이 포인터는 더 이상 유효한 대상을 가리키지 않는다"를 명확히 표시

단, 이건 “p 하나만” 안전해지는 것이고, 같은 대상을 가리키던 다른 포인터까지 자동으로 안전해지진 않습니다(이전 Step의 다중 포인터 문제).


포인터 반환 함수: “없음”은 nullptr로 표현

Player* FindPlayer(int id)
{
    // ... 로그인된 플레이어 검색 ...
    return nullptr; // 못 찾으면
}

int main()
{
    Player* p = FindPlayer(123);
    if (p != nullptr) {
        // 안전하게 사용
    }
}

핵심:

  • “포인터를 반환한다”는 말은 “실패/없음”을 nullptr로 표현하는 경우가 매우 많다는 뜻입니다.
  • 따라서 호출자는 사용 전에 널 체크를 기본값으로 깔고 들어가는 게 안전합니다.

널 체크의 정석: 짧은 회로(Short-circuit)

다음 코드는 안전합니다.

if (player != nullptr && player->_target != nullptr) {
    player->_target->_hp = 100;
}

왜 안전한가?

  • &&는 왼쪽이 false면 오른쪽을 평가하지 않습니다(단락 평가).
  • 그래서 player == nullptr이면 player->_target 같은 접근 자체가 실행되지 않습니다.

실전 규칙:

  • “깊게 들어갈수록” (a->b->c) 왼쪽부터 차례대로 확인하는 습관을 들이면 사고가 크게 줄어듭니다.

체크 질문 (스스로 답해보기)

  • 0/NULL 대신 nullptr를 쓰는 이유는?
  • FindPlayer() 같은 함수가 nullptr를 반환한다는 건 어떤 의미인가?
  • if (p && p->next)가 안전한 이유는? (&&의 동작 관점에서)

profile
李家네_공부방

0개의 댓글