220715 TIL

CoderS·2022년 7월 15일
0

TIL DAY 191

오늘 배운 일

✔️ Typescript

💠 Polymorphism (다형성)

정의

  • 먼저 Poly 는 많은, 다수란 뜻이고 그리고 morphism 은 형태를 뜻한다.
  • 즉, 여러가지 다른 구조들이라는 의미!
  • 이전에 다양한 구조의 함수들이 보았듯이, 개념은 어렵지 않다.

다음으로...

예를 들어볼건데 배열을 받아, 그 배열의 결과를 print 해주는 함수를 만들어서 해다 요소를 하나씩 print 해준다.

정확히 말하자면, 숫자로 이루어져있는 배열을 받고, 숫자를 하나씩 출력해준다.

그리고 문자열로 이루어진 배열을 받아, 하나씩 출력해준다.

예 ) 숫자로 이루어진 배열의 요소 하나씩 출력하기

하지만 여기서 문제가 발생한다 !?

숫자뿐만 아니라 boolean 이나 객체의 형태인 배열을 받고 싶다면 어떻게 해야했을까?

쉽다!

arr 를 하나더 만들어서 boolean[] 으로 해주고 void 를 지정해주면 된다.

결과는...

그럼 이번에는 문자열 타입으로 배열을 보내면 어떻게 될까?

동작하지 않는다.

그러면 위에 처럼 똑같이 만들어야할까?

아니다!!!

이 때, 다형성을 활용한 더 좋은 방법이 있다.

type SuperPrint 한테 arr 의 타입들이 concrete type 이 아니라고 말해준다.

concrete type 이란?

  • number 타입
  • boolean 타입
  • string 타입
  • void 타입
  • unknown 타입

이러한 것들이 concrete type 에 해당한다!

본론으로 돌아가서, 우리는 타입스크립트한테 generic 타입을 받을 알려주면 된다.

🔑 Generic

◼ generic 이란

  • 타입의 placeholder 같은 것이다.

위의 코드처럼 concrete type 들을 작성할바에, generic 을 사용하면 된다!

예 ) 만약 argument 를 똑같은 타입이 아닌, 다양한 타입으로 구성된 배열이라면

경고가 뜨면서 동작하지 않는다.

작동하지 않는 이유는 call signature 가 없기 때문이다.

전처럼 해결하면...

이렇게 계속 아규먼트에 있는 요소 타입에 맞춰서 call signature 를 만들어야 한다.

이 때!!!

우리는 generic 를 사용한다.

Generic 을 사용하면 타입스크립트는 그 타입이 뭔지 알게 되고 타입스크립트가 그 타입을 유추한다.

◼ 그럼 왜 사용할까?

우리가 call signature 를 작성할 때, 각자의 타입들을 모를 때 사용한다.

◼ 사용방법

  1. 먼저, 타입스크립트한테 generic 을 사용하고 싶다고 알려준다.

위의 argument 가 제네릭을 받는다고 알려준다.

해당 argument 앞에 꺽쇠로 이루어진 제네릭 이름을 넣어준다.

안의 이름은 아무것이나 넣어주면 된다.

보통 개발자들은 'T' 나 'V' 이렇게 한 글자를 넣어서 사용한다.

우리는 그리하여 타입스크립트한테 위의 call signature 가 제네릭을 받는다는 것을 알려준다.

concrete type 이 아닌 제네릭 이름을 해당 타입 대신 작성해준다.

그러면 위의 코드에서 봤듯이, 아무런 경고없이 작동한다.

문제 없이 해결된 이유는...

argument 가 서로 다른 superPrint 함수들에 마우스를 갖다대면...

타입스크립트는 함수 안에 있는 arguments 를 확인해서 각 타입들을 유추한다.

그리고 유추한 타입으로 call signature 를 보여준다.

이것이 generic 에 핵심 개념이다.

보다시피 제네릭은 여전히 함수에 타입을 입력하는 것을 허용한다.
하지만 일일이 다 써줄 필요가 없어서 편리한 기능이다!

이번에는 superPrint 함수가 배열을 받아서 그 배열의 첫 번째 요소를 리턴하게 만들어준다.

void 에서 TypePlaceholder 로 바꾸면된다.

이게 바로 다형성 (polymorphism) 이다!
superPrint 함수는 많은 형태를 가지고 있어 generic 을 사용해준다!!!

일반 라이브러리들은 밑에 코드처럼 generic 을 쓴다.

아까 말했듯이, 간단히 T 로 대체해준다.

그리고 any 를 쓰지 않는 이유는 간단하다.

위에처럼 any 를 사용해도 경고는 뜨지 않는다.
하지만 더이상 지켜주지 않는다!

d 는 분명히 숫자 1을 리턴하지만, toUpperCase 메서드를 사용해도 경고가 없다.
그 이유는 any 타입을 사용해주었기 때문!

이렇게 타입스크립트 의도와 어긋나는 행동은 최대한 피해준다.

제네릭을 사용하면...

이렇게 경고가 발생한다.

더 나아가서...

SuperPrint 타입 제네릭을 하나 더 추가하고 싶다고 하면...

예 ) 두 개의 아규먼트가 있다면...

에러들을 확인해보면...

한개의 argument 가 아니라 두개의 arguments 가 필요한다고 말한다.

해결방법은...

아규먼트를 하나더 작성해준다.

결과적으로...

이렇게 하나의 고정된 타입이 아닌 다양한 타입을 가지고 있는 아규먼트를 작성해주면 된다.

끝으로 :

  • 오늘은 polymorphism 와 generic 에 대해 알아보았다.
  • 확실히 제네릭에 대해 배워보니 그전에 라이브러리들에서 본 기억이 난다.
profile
하루를 의미있게 살자!

0개의 댓글