TypeScript/JavaScript에서 null과 undefined의 차이

기본 개념

  • undefined: 값이 할당되지 않은 상태
  • null: 의도적으로 값이 없음을 나타내는 상태

undefined를 사용하는 경우

1. 선택적 매개변수 (Optional Parameters)

interface QueryParams {
  slug: string;
  token?: string;  // undefined 사용
}

function getArticle({ slug, token }: QueryParams) {
  // token이 전달되지 않으면 undefined
}

2. 아직 값이 할당되지 않은 상태

interface User {
  id: number;
  name: string;
  deletedAt?: Date;  // 삭제되지 않은 상태 = 값이 없는 상태
}

3. API 요청 전 초기 상태

const [data, setData] = useState<Data | undefined>();
// 데이터를 아직 받아오지 않은 상태

null을 사용하는 경우

1. 의도적으로 값을 비워둔 상태

interface UserProfile {
  id: number;
  name: string;
  phoneNumber: string | null;  // "전화번호를 입력하지 않겠다"를 선택
  profileImage: string | null;  // "프로필 이미지를 사용하지 않겠다"를 선택
  notificationToken: string | null;  // "알림을 받지 않겠다"를 선택
}

2. 사용자가 명시적으로 선택한 빈 값

interface FormData {
  name: string;
  age: number;
  bio: string | null;  // 사용자가 의도적으로 비워둔 자기소개
}

실제 사용 예시

undefined 사용이 적절한 경우

// 1. 선택적 props
interface ComponentProps {
  title?: string;  // 제공되지 않을 수 있는 prop
  onClick?: () => void;  // 선택적 이벤트 핸들러
}

// 2. API 응답 타입
interface ApiResponse {
  data?: {
    user?: {
      settings?: UserSettings;  // 계층적 데이터에서 없을 수 있는 값
    }
  }
}

// 3. 초기 상태
const [searchResults, setSearchResults] = useState<Result[] | undefined>();

null 사용이 적절한 경우

// 1. 사용자 설정
interface UserPreferences {
  theme: string;
  customBackground: string | null;  // 배경 이미지 사용하지 않음 선택
}

// 2. 폼 데이터
interface RegistrationForm {
  name: string;
  email: string;
  referralCode: string | null;  // 추천인 코드 없음을 명시
}

결론

  • undefined는 "아직 값이 할당되지 않은 상태" 또는 "선택적인 값"을 나타낼 때 사용
  • null은 "의도적으로 값을 비워둔 상태"를 나타낼 때 사용
  • TypeScript의 엄격한 타입 체킹과 함께 사용할 때 이러한 구분은 더욱 명확한 코드를 작성하는 데 도움이 됨

+ Recent posts