TILs

50일차 TIL( 타입의 정의 / 종류)

API284 2023. 7. 26. 20:52

타입은 왜 알아야 하는가?
코드의 품질과 유지 보수의 향상
= 실수를 줄일 수 있게 된다

타입 정의
프로그래밍 언어에서 변수는 데이터 저장하는 공간
데이터에는 여러가는 타입이 있을 수 있다 ; 숫자 문자열 논리값 배열 객체 등
타입을 이해하고 올바르게 사용해야 가독성 안정이 향상돼

타입에 따른 오류 방지
예상치 못한 타입이 사용될 경우에는 오류가 발생할 수 있다.
이러한 오류는 컴파일 타임에 발생하지 않고 실행 시간에 발생하게 된다
= 복잡해질수록 찾기 어려워진다

타입 안정성 , 코드 품질
타입 안정성은 코드가 예상한 타입대로 동작함을 보장하는 것
안정성이 높을수록 코드 품질이 좋아지며 실행 시간에 발생할 수 있는 오류를 줄일 수 있다
타입을 제대로 이해하고 쓰면 코드의 안정성이 향상되며 테스트와 디버깅 시간을 줄일 수 있다

원활한 협업이 가능
타입을 명확하게 명시하고 사용하면 코드의 가독성이 올라감
타 개발자들이 이해하기 쉽고 유지보수가 용이해짐
1) boolean
2) number 정수 실수 진수.. 
3) string
4) 배열
5) 튜플(tuple)
6) enum

1) let 재할당 ㄱㄴ
2) const 재할당 ㅂㄱ
3) readonly 재할당 ㅂㄱ 객체 속성을 불변으로 만드는데 사용됨

불변성의 중요성

1) any 타입
TypeScript에서 any 타입은 모든 타입의 슈퍼 타입
JavaScript의 object 타입과 같은 최상위 타입이라고 생각하면 돼
TypeScript를 사용하는 주된 이유 중 하나는 **프로그램의 타입 안정성을 확보**하기 위함!
-any타입은 그러한 우리의 믿음을 송두리째 저버릴 수 있는 아주 위험한 친구.
- any 타입은 코드의 안정성과 유지 보수성을 저해할 수 있어요. 가급적 사용을 하지 마셔야 합니다!

2) ) unknown 타입

- `unknown` 타입은 `any` 타입과 비슷한 역할을 하지만 **더 안전한 방식으로 동작**합니다.
- unknown 타입의 변수에도 모든 타입의 값을 저장할 수 있어요.
- 하지만, 그 값을 다른 타입의 변수에 할당하려면 명시적으로 **타입을 확인해야 합니다!**

let unknownValue: unknown = '나는 문자열이지롱!';
console.log(unknownValue); // 나는 문자열이지롱!

let stringValue: string;
stringValue = unknownValue; // 에러 발생! unknownValue가 string임이 보장이 안되기 때문!
stringValue = unknownValue as string;
console.log(stringValue); // 나는 문자열이지롱!

- `stringValue = unknownValue as string;` 코드를 **Type Assertion(타입 단언)**이라고 합니다.
- unkwown 타입의 변수를 다른 곳에서 사용하려면 타입 단언을 통해 타입 보장을 하여 사용할 수 있어요!

3) union
- `union` 은 **여러 타입 중 하나를 가질 수 있는 변수를 선언할 때 사용**됩니다!
- union은 **`|`** 연산자를 사용하여 여러 타입을 결합하여 표현합니다.

type StringOrNumber = string | number; // 원한다면 | boolean 이런식으로 타입 추가가 가능해요!

function processValue(value: StringOrNumber) {
  if (typeof value === 'string') {
    // value는 여기서 string 타입으로 간주됩니다.
    console.log('String value:', value);
  } else if (typeof value === 'number') {
    // value는 여기서 number 타입으로 간주되구요!
    console.log('Number value:', value);
  }
}

processValue('Hello');
processValue(42);


기억해야할 부분은

- TypeScript를 쓰면서 여러 타입을 하나의 변수로 해결하겠다는 생각은 안하는게 좋다
- 사소한 습관들이 코드의 안정성을 높이고 유지 보수성을 개선할 수 있다

 

enum 과 object literal 비교

enum 간단한 상숫값 : 열거형 (상수의 그룹화)
- enum 타입은 코드의 가독성을 높이고 명확한 상수 값을 정의할 수 있다
- 또한, 컴파일 시에 자동으로 숫자 값으로 매핑되므로 따로 값을 할당할 필요가 없음
    - 하지만, 특정 숫자 값으로 매핑되어야 하면 그것은 직접 할당을 해주시면 됨

object literal 복잡한 구조 다양한 데이터 타입

const obj = {
  a: [1,2,3],
  b: 'b',
  c: 4
}

- 겉으로 보면 enum과 매우 흡사함 / enum이라는 키워드가 아니고 const라는 키워드를 사용하다
    - const 뿐 아니라 let도 사용이 가능
- `객체 리터럴`은 **키 + 값의 쌍(pair)**으로 구성된 **객체**를 정의하는 방식
- 위의 예제 코드에서는 a, b, c라는 키가 있고 각각 [1,2,3], ‘b’, 4 라는 값으로 바인딩이 되어있다

enum에 비해 object literal이 가지는 장점
- enum의 각 멤버는 상수였기 때문에 number, string 타입의 값만 대입할 수 있음
   enum의 각 멤버가 자주 변하면 안된다. 계속해서 유지 보수를 해줘야하기 때문에;

- 하지만, 객체 리터럴에서는 어떤 타입의 값도 대입을 할 수 있다
- 즉, 객체 리터럴은 복잡한 구조나 다양한 데이터 타입을 지원하며 유연한 구조를 가질 수 있다
- 코드 내에서 사용하기 전에 값이 할당되어야 하므로, 런타임 에러를 방지할 수 있음