Coding-Village-Protector / woowahan-ts

[우아한 타입스크립트 with 리액트] 북 스터디 📚
14 stars 2 forks source link

3.2.7_`any` 타입과 제네릭 타입을 사용하여 배열을 생성했을 때의 차이점을 설명해주세요. #8

Closed eeeyooon closed 9 months ago

eeeyooon commented 9 months ago

📝 107p

any 타입과 제네릭 타입을 사용하여 배열을 생성했을 때의 차이점을 설명해주세요.

107쪽에서

앞서 제네릭이 일반화된 데이터 타입을 말한다고 했는데, 이 표현만 보면 any의 쓰임과 혼동할 수도 있을 것이다. 하지만 둘은 명확히 다르다. 둘의 차이는 배열을 떠올리면 쉽게 알 수 있다.

라고 서술하고 있는데, 둘의 차이점이 무엇이 있는 지 설명해주세요.

Stilllee commented 9 months ago

any 타입의 배열에는 모든 타입의 요소가 들어갈 수 있습니다. 타입 검사를 하지 않고 모든 타입이 허용되는 타입으로 취급되기 때문에 요소들의 타입이 전부 같지 않을 수 있습니다.

제네릭은 배열 생성 시점에 원하는 타입으로 특정할 수 있어 배열 요소가 전부 동일한 타입이라고 보장할 수 있으며 타입 검사가 이루어지기 때문에 타입 오류를 사전에 방지할 수 있습니다.

sryung1225 commented 9 months ago

any는 모든 타입을 허용하는 데에 반면, generic은 모든 타입을 허용한다는 의미가 아닌 사용 시점에 원하는 타입으로 선언을 진행합니다.

// any 타입의 배열 : 배열 요소들의 타입이 서로 다를 수 있음
const arrayAny: any[] = [1, "two", true];

// generic 타입의 배열 : 배열 요소들이 특정된 타입으로 선언되어 동일함
const arrayGeneric: Array<number> = [1, "two", true];
// 🚨 Type 'string' is not assignable to type 'number'.
// 🚨 Type 'boolean' is not assignable to type 'number'.
lulla-by commented 9 months ago

any 타입은 모든 타입을 받기 때문에 any 타입으로 배열 요소들의 타입을 지정할 경우 모든 타입의 값들이 배열 요소로 들어갈 수 있습니다. 반면 제네릭은 배열생성시점에 타입 변수에 원하는 타입을 특정함으로써 배열의 구성요소들의 동일성을 보장할 수 있습니다.

eeeyooon commented 9 months ago

any 타입의 배열은 배열의 각 요소가 어떤 타입이든 될 수 있습니다. 어떤 타입의 데이터도 저장될 수 있지만, 타입 검사를 하지않고 모든 타입이 허용되는 타입으로 취급되기 때문에 타입 안정성이 떨어지고 런타임에 타입 관련 오류가 발생할 가능성이 높아집니다.

let arrayAny: any[] = [1, "string", true, { key: "value" }];

제네릭 타입의 배열은 배열 생성 시점에 원하는 타입을 지정하며, 선언 시 지정된 타입의 요소만 포함할 수 있습니다. 그렇기 때문에 배열의 모든 요소가 동일한 타입임을 보장합니다. 이는 타입 안정성을 높이고, 오류 가능성을 줄입니다.

let arrayGeneric: Array<number> = [1, 2, 3, 4];
arrayGeneric = [1, "string", true];
// error: Type 'string' is not assignable to type 'number'
//        Type 'boolean' is not assignable to type 'number'