웹 개발/typescript

타입스크립트(2) - ES6, 클래스 함수(1)

SolartheNomad 2023. 5. 31. 14:46

타입스크립트와 ES6 

- 타입스크립트는 쉽게 생각해서 자바스크립트의 확장판이기 때문에 자바스크립트에서 사용하던 문법을 그대로 사용 + 새로운 타입스크립트만의 문법 이렇게 생각하면 됨 

- 타입스크립트 ES6 = 자바스크립트 ES6

 

블록 스코프 

context.ts

let context = document.querySelector('html');

{
  let context = document.querySelector('body');
  console.log('블록문 내부 context = ', context);
}

console.log('글로벌 context = ', context);

 

템플릿 리터럴

- 템플릿(문자열)을 접합하는 것을 의미함 

- 데이터를 가져와서 넣어서 출력하는 것을 의미함 

- ${변수이름} 

let nickname = 'yamoo9';

let greeting_message = `
  <p>
    안녕하세요 <strong>${nickname}</strong>님.
    가입을 환영합니다. :-)
  </p>
`;

 

화살표 함수 

- 매개변수, 리턴 타입을 명시적으로 선언해 컴파일 과정에서 타입 검사를 수행하여 사전 문제를 방지할 수 있음 

let corsURL = (url:string): string => `https://crossorigin.me/${url}`;

corsURL('http://yamoo9.herokuapp.com/rest/ediya-menu');

 

자바스크립트 형태로 작성하면,

let corsURL = function (url) {
  return "https://crossorigin.me/" + url;
};

corsURL('http://yamoo9.herokuapp.com/rest/ediya-menu');

- 매개변수 url은 string 타입이라고 명시해줌 : = (매개변수 : 매개변수 타입) => 

 

- return 형태 만들기 

     

: 리턴 타입 => '템플릿/${붙여줄 매개변수}'

 

따라서, 종합해보면 이런 형태로 화살표 함수를 만들 수 있다. 

const 변수 이름 = (매개변수이름 : 매개변수 타입) : 리턴타입 => '반환할 항목';

 

 

연산자와 매개변수 

Default Parameter(기본 매개변수)

- 매개변수 타입 설정 후 '=' 이후 기본 값을 할당한다. 

 

coutDown.ts

function countDown(start:number = 10): ()=>number {
  return () => start > 0 ? start-- : 0;
}

 

countDown.js

function countDown(start) {
  if (start === void 0) { start = 10; }
  return function () { return start > 0 ? start-- : 0; };
}

 

- countDown 함수는 start라는 매개변수를 가지며, 이 매개변수의 기본값은 10이고, number type을 가진다. 

- 다음 return에는 함수가 반환되는데, 

number {
  return () => start > 0 ? start-- : 0;
}

- 이때, 익명함수(function () => {. . .})가 반환된다.

- start 값이 0보다 큰 경우( ? ) start 값을 감소시키고 반환된다. 그렇지 않은 경우, 즉 start 값이 0인 경우 0을 반환된다.

 

Spread Operator

// 배열 선언
let numbers:number[] = [101, 21, -12, 934, 87];

// 배열 내부 아이템으로 결합
numbers = [10, 31, 11, ...numbers, -2, 0];
// [10, 31, 11, 101, 21, -12, 934, 87, -2, 0]이 된다.


// 배열 ⟹ 개별 아이템으로 순차적 제공
let min_number:number = Math.min(...numbers);
let max_number:number = Math.max(...numbers);

 

- 배열을 배열 내부 아이템으로 결합하기 

,...배열변수 이름,

 

나머지 매개변수(Rest Parameters)

- 전개 연산자를 매개변수 앞에 붙여 사용함

- 함수에서 활용된다. 

- 가변인자 즉 매개인자를 배열타입으로 할당하여 사용할 때 작성한다. 

- args... : args의 타입 

function makeArray(...args:(number|string)[]): (number|string)[] {
  return args;
}

makeArray(11, 'eleven', 100, 'one hundred');

- makeArray 함수는 ...args라는 가변 인자를 받는다. 이 때 ' : '을 통하여 배열의 원소 타입이 선언되는데, 이 가변 인자는 (number|string)[] 형태로 선언되어 있으며, 숫자 또는 문자열로 이루어진 배열 타입이다.

- return args이기 때문에 args 가변인자 자체를 그냥 리턴값으로 반환된다. 

 

 

비구조화 할당 

- 배열, 객체의 아이템 또는 속성을 변수에 할당할 때 사용한다. 

// 배열 비구조화 할당
let [html, , body] = [document.documentElement, document.head, document.body];

// 객체 비구조화 할당
let numbers_module = {
    multiplyNumbers: (...n:number[]):number => n.reduce((a, b) => a * b),
    sumNumbers: (...n:number[]):number => n.reduce((a, b) => a + b)
};

let { sumNumbers } = numbers_module;

 

 

클래스(1) 

 

접근 제어자 

- 접근 제어자(access modifiers)를 통해 접근 가능한 범위를 설정할 수 있고, 각 속성에 데이터 타입을 지정할 수 있게 하는 typescript의 고유한 문법

 

1. 접근 제어 속성

class Book {

  // 제목
  // public: 클래스 외부에서 접근 가능
  public title:string;

  // 저자
  // public은 기본 값으로 생략 가능합니다.
  public author:string;

  // 제조 공장 : _manufacturing_plant
  // private: Book 클래스 내부에서만 접근 가능
  private _manufacturing_plant:string;

  // 종이 유형 papter_type
  // protected: Book 클래스를 포함한 서브 클래스에서만 접근 가능
  protected paper_type:string;

  // constructor() 매개변수 앞에 
  // public, private, protected를 사용하면
  // Book 클래스의 타입(type)을 별도 선언하지 않아도 됩니다. constructor은 초기화임. 즉 사용변수를 선언해주는 것을 의미함
  constructor(title:string, author:string, public pages:number) {
    this.title = title;
    this.author = author;
    this.pages = pages;
  }

}

/* 인스턴스 생성 ------------------------------------------------ */

let indRevo = new Book('한 권으로 정리하는 4차 산업혁명', '최진기', 367);
console.log(indRevo); // Book {}

 

1. 변수의 속성을 설정해준다. 

 

public title : string;
public author : string;
private _manufactoring_plant : string;
protected paper_types : string;

 

2. 클래스 변수 안에서 인스턴스 변수를 선언한다.(constructor) 즉, 외부에서 받아올 사용 변수를 선언함

  constructor(title:string, author:string, public pages:number) {
    this.title = title;
    this.author = author;
    this.pages = pages;

 

 

 

 

2. 접근 제어 메서드 

- 메서드는 변수가 아니기 때문에, (변수로서 사용할 수 있지만) constructor을 사용하지 않는다. 

class Book {

  public    title:string;
  public    author:string;
  public    pages:number = 150;
  private   _manufacturing_plant:string = '충무로 공장';
  protected paper_type:string = '밍크지';

  constructor(title:string, author:string, pages:number) {
    this.title  = title;
    this.author = author;
    this.pages  = pages;
  }

  /* 메서드 ------------------------------------------------ */

  // public 메서드
  // 클래스 외부에서 접근 가능
  public printPages(): string {
    return `${this.pages}페이지`;
  }

  // protected 메서드
  // Book 클래스를 포함한 서브 클래스에서만 접근 가능
  protected changePaperType(type:string): void {
    this.paper_type = type;
  }

  // private 메서드
  // Book 클래스 내부에서만 접근 가능
  private setManufacturingPlant(plant:string): void {
    this._manufacturing_plant = plant;
  }


  /* 클래스 내부 메서드에서 private, protected 메서드 접근 가능 */

  public setPaperType(type:string):void {
    // protected 메서드 접근 가능
    this.changePaperType(type);
    console.log(this.paper_type);
  }

  public setPlant(plant:string):void {
    // private 메서드 접근 가능
    this.setManufacturingPlant(plant);
    console.log(this._manufacturing_plant);
  }

}


/* 인스턴스 생성 ------------------------------------------------ */

let indRevo = new Book('한 권으로 정리하는 4차 산업혁명', '최진기', 367);

console.log(indRevo.printPages()); // '367페이지'

// [오류]
// [ts] 'changePaperType' 속성은 보호된 속성이며
// 'Book' 클래스 및 해당 하위 클래스 내에서만 액세스할 수 있습니다.
// (method) Book.changePaperType(type: string): void
console.log(indRevo.changePaperType('인디언지'));

// [오류]
// [ts] 'setManufacturingPlant' 속성은 private이며
// 'Book' 클래스 내에서만 액세스할 수 있습니다.
// (method) Book.setManufacturingPlant(plant: string): void
console.log(indRevo.setManufacturingPlant('파주 공장'));