[TS] 이넘과 클래스

작성:    

업데이트:

카테고리:

태그: , ,

본 포스트는 인프런의 타입스크립트 입문-기초부터 실전까지 강의(링크)를 듣고 정리한 내용입니다.


이넘(Enum)

특정 값들의 집합을 의미하는 자료형

  • TS에서는 문자형과 숫자형 이넘 지원


숫자형 이넘

enum Shoes {
  Nike,
  Adidas,
  NewBalance
}

const myShoes = Shoes.Nike;
console.log(myShoes); // 0
  • 초기화를 하지 않으면 기본값은 숫자형(인덱스)
  • 첫 값에 대하여 1씩 증가하며, 초기화를 하지 않으면 0부터 시작


문자형 이넘

enum Shoes {
  Nike = '나이키',
  Adidas = '아디다스',
  NewBalance = '뉴발란스'
}

const myShoes = Shoes.Nike;
console.log(myShoes); // '나이키'

이는 곧 아래와 같다.

const Shoes = {};
Shoes['Nike'] = '나이키';
Shoes['Adidas'] = '아디다스';
Shoes['NewBalance'] = '뉴발란스';


이넘의 활용

enum Answer {
  Yes = 'Y',
  No = 'N',
}
function askQuestion(answer: Answer) {
  if (answer === Answer.Yes) {
    console.log('정답입니다.');
  }
  if (answer === Answer.No) {
    console.log('오답입니다.');
  }
}

askQuestion(Answer.Yes); // 정답입니다.
askQuestion('Yes'); // type이 Answer가 아니어서 오류
  • 함수에서 오타 등의 human error를 방지하기 위함


클래스

JS의 ES2015 (ES6)의 클래스

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
    console.log("생성되었습니다.");
  }
}

const seho = new Person("세호", 30); // 생성되었습니다.
console.log(seho); // Person {name: "세호", age: 30}


JS의 프로토타입

자바스크립트는 프로토타입 기반 언어

// 프로토타입 미사용
const user = { name: "capt", age: 100 };
const admin = { name: "capt", age: 100, role: "admin" };

// 프로토타입 사용
const user = { name: "capt", age: 100 };
const admin = {};
admin.__proto__ = user; // prototype의 상위에 user를 두겠다.

// 활용
console.log(admin.name); // capt
console.log(admin.age); // 100
  • admin 객체는 빈 객체로 만들었으므로, prototype에 대한 정보가 없다.
  • admin.__proto__를 통해 admin의 prototype을 재지정
  • 데이터가 상속


프로토타입 사용 admin에 role을 추가해보자.

admin.role = "admin";
console.log(admin) // { role: "admin", __proto__: Object }
  • admin에 role 속성을 추가하면 그냥 admin을 출력하면 role에 대한 것만 직관적으로 출력
  • 상속 속성은 __proto__ 객체 내부에 상속 정보 확인 가능


프로토타입과 클래스의 차이

// 기존 함수형
function Person(name, age) {
  this.name = name;
  this.age = age;
}
const capt = new Person("캡틴", 100);

// 클래스(객체 지향형)
class Person {
  constructor(name, age) {
    console.log("생성되었습니다.");
    this.name = name;
    this.age = age;
  }
}
const seho = new Person("세호", 30);


TS에서의 클래스

class Person {
  // 멤버 변수 type, scope 지정
  private name: string; // 클래스 안에서만 사용
  public age: number; // 전역에서 사용하는 경우
  readonly log: string; // 값에 접근만 가능, 변경은 불가

  constructor(name: string, age: number) {
    console.log("생성되었습니다.");
    this.name = name;
    this.age = age;
  }
}
  • 멤버 변수의 type과 scope를 클래스 내부 최상단에 작성
  • 범위에 따라 앞에 붙는 문자가 달라짐(private, public, protected, …)

댓글남기기