Typescript

UtilityType

  • Partial< T >
    T타입 객체의 속성을 선택적으로 활용
    => 기존 타입의 일부 속성만 제공하는 객체 생성 가능

  • Required< T >
    T타입 객체의 모든 속성이 정의돼야함.
    ex) name?:string 과 같은 선택적 속성 불가

type RequiredPerson = Required<Person>;
  • Readonly< T >
    T타입의 모든 속성이 읽기 전용
interface DatabaseConfig {
  host: string;
  readonly port: number; //인터페이스도 사용 가능
}

const immutableConfig: Readonly<DatabaseConfig> = {
  host: "localhost",
  port: 3306,
};
  • Pick<T,K>
    T타입에서 K 속성들만 선택하여 새로운 타입 생성
interface Person {
  name: string;
  age: number;
  address: string;
}

type SubsetPerson = Pick<Person, "name" | "age">;
  • Omit<T,K>
    T타입에서 K 속성들만 제외한 새로운 타입 생성
interface Person {
  name: string;
  age: number;
  address: string;
}

type SubsetPerson = Omit<Person, "address">;

객체 지향 프로그래밍

객체란?

클레스 기반으로 생성되는 클래스의 인스턴스

클래스 및 객체 정의 방법

class 키워드를 사용하여 정의
클래스에 속성과 메서드를 정의하고 new 키워드로 객체를 생성

예시

class Person {
  name: string;
  age: number;

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

  sayHello() {
    console.log(`안녕하세요! 제 이름은 ${this.name}이고, 나이는 ${this.age}살입니다.`);
  }
}

const person = new Person('Spartan', 30);
person.sayHello();
  • 생성자(constructor)
    • 클래스의 인스턴스를 생성,초기화 하는 메서드
    • 클래스 내 오직 하나만 존재

클래스 접근 제한자

클래스의 속성과 메서드에 접근 제한자를 통해 접근을 제한 가능

  • public : 클래스 외부에서도 접근이 가능한 접근 제한자
    • 접근 제한자 선언이 없을시 public이 기본 => 외부에서 직접 객체 속성 변경 가능
    • 민감하지 않은 객체 정보를 열람할때, 누구나 해당 클래스의 특정기능을 사용할때
  • private : 클래스 내부에서만 접근이 가능한 접근 제한자
    • 보통 private로 접근 제한자 설정 => 외부에서 직접 객체 속성 변경을 제한
    • 클래스의 속성을 보거나 편집하고 싶으면 getter/setter 메서드 준비
  • protected : 클래스 내부와 해당 클래스를 상속받은 자식만 클레스에 접근 가능한 접근 제한자

상속

상속이란?

기존 클래스의 속성과 메서드를 물려받아 새로운 클래스를 정의
extends 키워드 사용

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  makeSound() {
    console.log('동물 소리~');
  }
}

class Dog extends Animal {
  age: number;

  constructor(name: string) {
    super(name);
    this.age = 5;
  }

  makeSound() {
    console.log('멍멍!'); 
  }

  eat() { // Dog 클래스만의 새로운 함수 정의
    console.log('강아지가 사료를 먹습니다.');
  }
}

class Cat extends Animal { // Animal과 동일
}

const dog = new Dog('누렁이');
dog.makeSound(); //멍멍!

const cat = new Cat('야옹이');
cat.makeSound(); //동물 소리~
  • Animal : 부모 클래스 , Dog : 자식 클래스
  • super : 자식 클래스가 부모 클래스를 참조하는 키워드

서브타입과 슈퍼타입

  • 슈퍼타입

    • 상위 클래스 / 부모 클래스
    • 일반적이고 범용적인 특성, 여러 서브타입을 포함
    • 슈퍼타입은 그것으로부터 파생된 모든 서브타입을 대신하여 사용될 수 있어야 함
  • 서브타입

    • 하위 클래스 / 자식 클래스
    • 슈퍼타입으로부터 상속을 받아 공통된 특성 + 추가적 특성이나 동작을 가짐
    • 서브타입은 그것이 상속한 슈퍼타입의 기능을 완전히 대체할 수 있어야 함
  • any는 모든 것의 슈퍼타입

  • Animal은 Dog, Cat의 슈퍼타입
    Dog, Cat은 Animal의 서브타입

upcasting

서브타입을 슈퍼타입으로 변환

let animal: Animal = dog; // upcasting 
animal.eat(); // 에러. 슈퍼타입(Animal)으로 변환이 되어 eat 메서드를 호출할 수 없음 

downcasting

캐스팅된 객체를 다시 원래의 서브타입으로 변환
as 키워드로 명시적으로 타입변환 필요
원래의 타입이 아니라면 런타임 에러가 발생

let animal: Animal;
animal = new Dog('또순이');

let realDog: Dog = animal as Dog;
realDog.eat(); // 서브타입(Dog)로 변환되어 eat 메서드를 호출rksmd

추상클래스

추상클래스란?

클래스와 달리 인스턴스화 할 수 없는 클래스

  • 상속을 통해 자식 클래스에서 메서드를 각각 구현 => 핵심 기능의 구현은 자식 클래스에 위임
  • 추상 클래스 및 추상 함수는 abstract 키워드로 정의
abstract class Shape {
  abstract getArea(): number; // 추상 함수

  printArea() {
    console.log(`도형 넓이: ${this.getArea()}`);
  }
}

class Circle extends Shape {
  radius: number;

  constructor(radius: number) {
    super();
    this.radius = radius;
  }

  getArea(): number { // 원의 넓이를 구하는 공식은 파이 X 반지름 X 반지름
    return Math.PI * this.radius * this.radius;
  }
}

class Rectangle extends Shape {
  width: number;
  height: number;

  constructor(width: number, height: number) {
    super();
    this.width = width;
    this.height = height;
  }

  getArea(): number { // 사각형의 넓이를 구하는 공식은 가로 X 세로
    return this.width * this.height;
  }
}

const circle = new Circle(5);
circle.printArea();

const rectangle = new Rectangle(4, 6);
rectangle.printArea();

추상 클래스를 상속 받은 자식 클래스는 반드시 추상 함수를 구현해야 함

인터페이스

인터페이스란?

객체가 가져아 하는 속성과 메서드 정의

추상 클래스와 차이점

  • 구현부 제공 여부
    추상 클래스 => 클래스의 기본 구현 제공
    인터페이스 => 객체의 구조만 정의, 기본구현 제공x
  • 상속 메터니즘
    추상 클래스 => 단일 상속(하나의 클래스는 하나만 상속)
    인터페이스 => 다중 상속(하나의 클래스에 여러 인터페이스 상속가능)
  • 구현 메커니즘
    추상 클래스 => 추상 클래스 상속시 반드시 추상 함수 구현
    인터페이스 => 인터페이스에 정의된 모든 메서드를 전부 구현
  • 사용방법
    추상 클래스 => 기본 구현을 제공 후 상속을 통한 확장이 필요할 때
    인터페이스 => 객체가 특정 구조를 준수하도록 강제하고 싶을 때

0개의 댓글