포스트

2024.06.18 프로그래머스 - 타입스크립트 입문 2

TypeScript 알아보기 2

리터럴 타입 지정

  • 특정 값 만을 허용하는 타입을 지정하는 방식

    1
    2
    3
    
      type Gender = "male" | "female"
        
      let gender : Gender = "male";
    
  • 리터럴로 지정한 타입은, 해당 과 정확하게 일치해야 한다.

    1
    2
    3
    4
    5
    6
    
      // 올바르지 않은 리터럴 사용
      type Status = "success" | "error";
        
      let status : Status = "success" // 올바른 사용
      status = "error" // 올바른 사용
      status = "pending" // 올바르지 않은 사용
    
  • 리터럴 타입은 문자열, 숫자형, 불리언 등 다양한 리터럴타입을 사용할 수 있다.

객체 리터럴

  • 객체를 리터럴 타입으로 지정하여 사용하는 방식
  • 기본 리터럴 과 같이 값이 다르면 안된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      type PesronsType = {
        name : "john",
        age : 30
      };
        
      let person : PesronsType = {
        name : "john",
        age : 30
      }; // 정상 사용
        
      person = {
        name : "kd",
        age : 23
      } // 올바르지않은 값 할당
    

리터럴 타입 사용의 장점

  • 코드의 가독성이 높아진다.
  • 잘못된 값이 들어오는 경우를 방지 할 수 있다.

유니온

  • 유니온의 본질 또한 사용자 정의 타입 이다.
  • 유니온은 타입으로 여러가지 의 타입에 대한 허용을 위해 사용되는 방법
  • 제한된 타입을 동시에 지정하고 싶을 때 사용
  • 논리 연산자 | (or 1개, 또는 파이프기호) 를 사용하여 , 다중 타입에 대한 사용을 허용한다.

    1
    2
    3
    4
    5
    
      type Status = string | number;
      let status1: Status = "string test"; // 정상
      let status2: Status = 123; // 정상
      status1 = 2; // 정상
      status2 = "string 허용"; // 정상
    

타입 별칭

  • type 키워드를 사용하여 재사용 가능한 type 지정자를 선언한다.

    1
    
      type Status = string | number;
    

타입 가드

  • JS의 typeof 연산자를 이요하여 타입 검증을 수행

Array 와 Tuple

Array

  • 특정 타입을 배열에 형태로 선언하기 위해 [] 또는 Array<> 문법을 사용한다.
  • 길이가 가변적이고, 동일한 타입의 요소로 구성 되어있다.

    1
    2
    
      type numbers = number[]; // Array<number>
      type strings = string[]; // Array<string>
    

Array의 유니온 타입

  • 배열에 자료형이 다른 두 타입이 들어오는 것을 허용 하는 문법

    1
    2
    3
    4
    5
    6
    
      type numAndStr = (number | string)[]; // Array<string|number>
        
      let numAndSTR : numAndStr = [
        "string",
        1,
      ]
    

Tuple

  • TS에서 튜플은 타입의 순서가 정해져 있는 배열의 형태이다.
  • 길이가 고정적, 각 요소의 타입이 정해져 있는 상태

    1
    
      let greet : [number, string, boolean] = [1, "test", true]
    

타입스크립트와 OOP

  • 클래스는 객체의 뼈대
    • 클래스는 설계도, 생산틀
    • 객체는 실체이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//일반적인 사원 정보

class Employee {
  empName: string;
  age: number;
  empJob: string;

  printEmp(): void {
    console.log(
      `${this.empName} 의 나이는 ${this.age} 이고, 직업은 ${this.empJob}이다.`
    );
  }
}

const emp1 = new Employee();
emp1.empName = "yoon";
emp1.empJob = "dev";
emp1.age = 27;
emp1.printEmp();

생성자 : Constructor

  • 다른 언어에서는 class에서 생성자를 사용하기위 자기 자신의 이름으로 function을 지정한다. (파이썬은 ‘init’)
  • JS, TS에서는 class 내의 constructor 를 사용하여 생성자를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//일반적인 사원 정보

class Employee {
// this 지정전 멤버 변수로의 선언이 필요하다.
  empName: string;
  age: number;
  empJob: string;

  constructor(empName: string, age: number, empJob: string) {
    this.empName = empName;
    this.age = age;
    this.empJob = empJob;
  }

  printEmp(): void {
    console.log(
      `${this.empName} 의 나이는 ${this.age} 이고, 직업은 ${this.empJob}이다.`
    );
  }
}

const emp1 = new Employee("yoon", 27, "dev");

emp1.printEmp();

  • JS와 다르게, constructor내에서 this로 지칭하는 키워드로 사용하기 위해 우선 멤버 변수로 타입정도는 선언해야 사용가능하다.

접근 지정자

  • public, private, protected 등의 키워드를 사용하여, 데이터 접근에 데한 제약을 걸기 위해 사용한다.
  • public
    • 어디에서나 접근할 수 있도록 허용하는 키워드
    • 생략 가능한 default 값
  • protected
    • 선언한 해당 클래스 또는 서브 클래스의 인스턴스에서만 접근 가능하도록 제한한다.
  • private
    • 해당 클래스의 인스턴스 에서만 접근 가능하게 제한한다.
    • 멤버 변수 앞에 underscore (_ ) 를 추가 작명하여, private 멤버 임을 명시적으로 지정한다.

getter와 setter

  • 접근을 제한한 class의 멤버에 대하여, get을 이용해 호출, 또는 set 키워드를 통한 값 할당 수행이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Employee {
  private _empName: string;
  private _age: number;
  private _empJob: string;

  constructor(empName: string, age?: number, empJob?: string) {
    this._empName = empName;
    this._age = age;
    this._empJob = empJob;
  }

  printEmp(): void {
    console.log(
      `${this._empName} 의 나이는 ${this._age} 이고, 직업은 ${this._empJob}이다.`
    );
  }

  get empName() {
    return this._empName;
  }
  set empName(name: string) {
    this._empName = name;
  }
}

const emp1 = new Employee("yoon", 27, "dev");

// getter empName 호출
const empName = emp1.empName;
console.log(empName); // "yoon"

// setter empName을 통한 할당
emp1.empName = "setter Man~";
console.log(emp1.empName); // "setter Man~"

암…묵 적인 클래스 멤버 프로퍼티 선언

  • 이전과 다르게, constructor의 인수에 접근지정자를 사용하여 인수를 선언하면, 해당 인수가 클래스의 멤버 프로퍼티 값으로 선언된다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
      class Employee {
        constructor(
          private _empName: string,
          private _age: number,
          private _empJob: string
        ) {}
        
        printEmp(): void {
          console.log(
            `${this._empName} 의 나이는 ${this._age} 이고, 직업은 ${this._empJob}이다.`
          );
        }
        
        get empName() {
          return this._empName;
        }
        set empName(name: string) {
          this._empName = name;
        }
      }
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.