이번시간에는 Generic 타입에 대해 다루겠습니다.
Generic 타입은 타입스크립트에서  재사용성을 높이고 다양한 타입에 대해 범용적인 코드를 작성할수 있게 지원되는 기능입니다.

Generic 타입은 함수나 클래스,인터페이스를 대상으로 그 내부에서 사용하는 값에 대한  외부에서 매개변수로 전달해 전달된 타입을 기반으로 클래스나 함수의 기능을 보다 유연하게 구현할수 있게 해주는 타입입니다.
보통 <T> 형태로 함수/클래스 외부에서 특정 타입을 클래스나 함수내부로 주입시켜 동적으로 타입을 변경해 보다 확장가능하고 범용적인
클래스 또는 함수를 구현하는 방법을 제공합니다.

D:\TypeScript\3-TS-Core 폴더내에 generic.ts파일을 생성 합니다.

1) Generic  정의법 코딩하고 실행하기 
-하기 코드와 같이 코딩을 진행합니다.
-자세한 내용은 주석을 참고바랍니다.
-generic.ts


//Case1)함수에 제네릭 타입 전달하여 사용하기

//getRandomElement(배열타입매개변수 T[])함수에 숫자형,문자열 배열타입과 상관없는 그냥 배열타입을 전달하고
//반환값으로 다양한 타입을 반환하는 함수를 정의합니다.
//형식설명: 함수명<GenericType이 전달되어 넘어 온다고 명시>(매개변수명: 매개변수의 GenericType): 반환 GenericType
function getRandomElement<T>(list: T[]): T {
  //랜덤 숫자를 만들고 제공된 배열내의 해당 Index값를 반환합니다.
  //반환되는 값의 타입은 숫자배열이 넘어온경우는 number타입을 문자열 배열이 파라메터로 전달된경우는 문자열 타입 반환타입이 됩니다.
  const randIdx = Math.floor(Math.random() * list.length);
  return list[randIdx];
}

const randomString = getRandomElement(["a", "b", "c"]); // 무작위 문자열 반환
console.log("randomString:", randomString);

const randomNumber = getRandomElement([1, 2, 3]); // 무작위 숫자 반환
console.log("randomNumber:", randomNumber);

//CASE2) 클래스에 제너릭 타입을 사용하기
//형식설명: 클래스명<GenericType이 전달되어 넘어 온다고 명시>;
class Stack<T> {
  private items: T[] = [];

  push(item: T): void {
    this.items.push(item);
  }

  pop(): T | undefined {
    return this.items.pop();
  }
}

const stringStack = new Stack<string>();
stringStack.push("apple");
stringStack.push("banana");
const poppedString = stringStack.pop();
console.log("poppedString:", poppedString);

const numberStack = new Stack<number>();
numberStack.push(1000);
numberStack.push(2000);
const poppedNumber = numberStack.pop();
console.log("poppedNumber:", poppedNumber);

//tsc --strictNullChecks generic.ts
//node generic.js

-코딩을 모두 진행 저장하고 아래 명령어를 통해 터미널창에서 ts파일을 컴파일하고 컴파일 결과.js파일을 실행합니다.
D:\TypeScript\3-TS-Core
tsc --strictNullChecks generic.ts
node generic.js


2)코딩 핵심 내용 설명
-
Generic 타입은 타입스크립트에서  재사용성을 높이고 다양한 타입에 대해 범용적인 코드를 작성할수 있게 지원되는 기능
-<T> 형태로 함수/클래스 외부에서 특정 타입을 클래스나 함수내부로 주입시켜 동적으로 타입을 변경해 보다 확장가능하고 범용적인 클래스 또는 함수를 구현하는 방법을 제공


타입스크립트 기초 코딩 과정을 마무리하도록 하겠습니다.
자바스크립트 언어를 정적타입 기반 언어들인 자바,C#과 같은 컴파일언어와 같이 사용할수 있는 방법을 제공하는 타입스크립트 언어는
특히 자바스크립트 언어 기반 프론트엔드/백엔드 대규모 시스템 구축시 필수적으로 사용하고 있는 AltJS 언어입니다.

현대적인 프론트엔드 개발 프레임워크(Next.js)/백엔드 개발 프레임워크(Nest.js) 들은 대부분 기본으로 타입스크립트를 기본 언어로 채택하고 있으니
여러분들이 보다 최신의 발전된 기술을 기반으로 대규모 웹 기반 시스템을 구축하는 개발자를 희망한다면 타입스크립트는 필수 기술(빅테크 기업 필수기술요소) 이 되어 가고 있음을 꼭 기억하시기를 바랍니다.


그동안 수고 많으셨습니다.