<aside> 🔥 이번에는 리터럴, 유니온, 교차 타입 그리고 클래스에서 타입 선언에 대해 알아보았다.

</aside>

<aside> 🔥 (1) Literal Type

// const 는 상수이기 때문에 Chul 말고는 다른 값을 받을 수 없다.
const userName1 = "Chul";

// let은 언제든 값이 바뀔 수 있기 때문에 타입을 지정해줘야한다.
let userName2: string | number = "Tom";

(2) Union Types

// Union Types
// name "car", "mobile" 과같은 동일한 속성의 타입을 다르게해서 구분할 수 있는 것을 식별 가능한 union type이라고 한다.

interface Car {
  name: "car"; // 타입 -> string이 아닌
  color: string;
  start(): void;
}

interface Mobile {
  name: "mobile"; // 타입->string이 아닌 mobile
  color: string;
  call(): void;
}

function getGift(gift: Car | Mobile) {
  console.log(gift.color);
  if (gift.name === "car") {
    gift.start(); // Mobile에 start()가 없다.
  } else {
    gift.call();
  }
}

(3) 교차타입

여러 개의 타입을 하나로 합쳐주는 것

// Intersection Types
interface Car {
  name: string;
  start(): void;
}

interface Toy {
  name: string;
  color: string;
  price: number;
}

const toyCar: Toy & Car = {
  name: "타요",
  start() {},
  color: "blue",
  price: 1000,
};

(4) 클래스에서 멤버변수

// (1) 아래처럼 미리 선언
class Car {
  color: string; //미리 선언해줘야함.
  constructor(color: string) {
    this.color = color;
  }
  start() {
    console.log("start");
  }
}

const bmw = new Car("red");

// (2) public으로 선언
class Car {
  constructor(public color: string) {
    this.color = color;
  }
  start() {
    console.log("start");
  }
}

const bmw = new Car("red");

// (3) readonly로 선언
class Car {
  constructor(readonly color: string) {
    this.color = color;
  }
  start() {
    console.log("start");
  }
}

const bmw = new Car("red");

(5) 접근 제한자 (Access modifier) - public, private, protected

  1. public : 자식클래스, 클래스 인스턴스 모두 접근 가능

    // 이상 없음
    class Car {
      name: string = "car";
      color: string;
      constructor(color: string) {
        this.color = color;
      }
      start() {
        console.log("start");
        console.log(this.name);
      }
    }
    
    class Bmw extends Car {
      constructor(color: string) {
        super(color);
      }
      showName() {
        console.log(super.name);
      }
    }
    
    const z4 = new Bmw("black");
    console.log(z4.name);
    
  2. protected: 자식 클래스에서 접근 가능 (# 변수명으로 대체 가능)

    class Car {
      protected name: string = "car"; // protected
      color: string;
      constructor(color: string) {
        this.color = color;
      }
      start() {
        console.log("start");
        console.log(this.name);
      }
    }
    
    class Bmw extends Car {
      constructor(color: string) {
        super(color);
      }
      showName() {
        console.log(super.name);
      }
    }
    
    const z4 = new Bmw("black");
    console.log(z4.name); // 클래스 인스턴스에서는 접근 불가
    
  3. private : 해당 클래스 내부에서만 접근 가능

    class Car {
      private name: string = "car"; // private
      color: string;
      constructor(color: string) {
        this.color = color;
      }
      start() {
        console.log("start");
        console.log(this.name);
      }
    }
    
    class Bmw extends Car {
      constructor(color: string) {
        super(color);
      }
      showName() {
        console.log(super.name); // 자식 클래스에서 접근 불가
      }
    }
    
    const z4 = new Bmw("black");
    console.log(z4.name); // 클래스 인스턴스에서는 접근 불가
    

(6) static

class Car {
  name: string = "car"; 
  color: string;
  static wheels = 4; // static
  constructor(color: string) {
    this.color = color;
  }
  start() {
    console.log("start");
    console.log(this.name);
    console.log(this.wheels); // 에러
    console.log(Car.wheels); // 클래스명으로 써야함
  }
}

class Bmw extends Car {
  constructor(color: string) {
    super(color);
  }
  showName() {
    console.log(super.name); /
  }
}

const z4 = new Bmw("black");
console.log(z4.name);

(7) 추상 class

// 추상 class
abstract class Car {
  color: string;
  constructor(color: string) {
    this.color = color;
  }
  start() {
    console.log("start");
  }
  // 추상
  abstract doSomething(): void;
}

const car = new Car("red"); // 추상은 new 키워드로 생성 불가.

// 아래처럼 상속해서 써야함.
class Bmw extends Car {
  constructor(color: string) {
    super(color);
  }
  // 상속받은 곳에서 구체적으로 써야함.
  doSomething() {
    alert(3);
  }
}

const z4 = new Bmw("black");

</aside>