옵셔널 체이닝(Optional Chaining, ?.)은 앞의 값이 null이나 undefined이면 에러를 내지 않고 undefined를 돌려주는 접근 연산자다. null 병합 연산자(Nullish Coalescing Operator, ??)는 왼쪽이 null·undefined일 때만 오른쪽 기본값을 쓴다.
user?.job?.title // job이 없으면 undefined (TypeError 아님)
user.greet?.() // 메서드가 있을 때만 호출
const input = ''
input || 'DEFAULT' // 'DEFAULT' — ''·0·false도 버린다
input ?? 'DEFAULT' // '' — null·undefined만 대체||는 falsy 값(0,'',false,NaN)을 모두 "없음"으로 본다. 0이나 빈 문자열이 정상 값인 폼 입력·설정값에서 버그가 난다. 이때??를 쓴다?.를 남발하면 "원래 없으면 안 되는 값"까지 조용히 넘어간다. 경계에서 한 번 검사하고 안쪽은 확정된 타입으로 다루는 편이 낫다(타입 좁히기와 타입 가드, 보호 구문)- TypeScript의
strictNullChecks를 켜면 어디에 이 연산자가 필요한지 컴파일러가 알려 준다(tsconfig 핵심 옵션) - null 대신 기본 동작을 가진 객체를 두는 설계는 특이 케이스와 널 객체