둘째주 #11 Typescript 기초 -5

김선은·2023년 5월 26일

정리해야하지만 일단 기록~

typescript 추상클래스

다른 클래스가 상속받을 수 있는 클래스. 인스턴스 생성은 불가하다.
공통된 틀을 가질 수 있는 장점이 있다.

constructor 내부에 접근제한자, 프로퍼티: 타입을 입력한다

abstract class User {
    constructor(
        private firstName: string, // 프로퍼티가 private라면 자식도 this로 접근불가
        protected lastName: string, // 해당 클래스 내에서만 접근 가능(자식 클래스도 안됨)
        public nickName: string // 자식 클래스에서도 접근 가능
    ) {}
    abstract getNickName(): void // 추상 메소드. 콜 시그니처만을 가짐. 함수 구현 X

    getFullName() { // 추상 클래스 내의 메소드 구현. -> 구현 대신 콜시그니처만 갖도록 해야함.
        return `${this.firstName} ${this.lastName}`
    }
    
}

class Player extends User {
    getNickName() { // User에서 추상 메소드가 존재, 상속받았다면 해당 함수 만들어야함.
    }
}
const sun = new Player("kim", "sun", "썬") // 추상 클래스 User는 인스턴스 생성 못함
sun.getFullName() //User를 상속 받은 Player는 인스턴스 생성 가능

/* private 또는 public property 사용 가능
class를 만들어서 constructor 안에 보호속성, 프로퍼티, 타입을 입력한다.
만든 class를 이용해서 새로운 변수를 만들때 new 키워드로 class 이름(인수) 형식으로 사용

객체지향이 가지고 있는 점
- 추상 클래스(Abstract Class) : 다른 클래스가 상속 받을 수 있는 클래스(상속만 가능)

- 추상 메소드(abstract method) : 메소드의 콜 시그니처만 가지고 있음
    -추상 클래스를 상속받는 모든 것들이 구현해야 하는 메소드! 구현 방법은 상관없이 만들라고 지시함.

 */

추상클래스 활용
1. 다른 클래스가 가져야 할 프로퍼티와 메소드 명시해줌
1. (추상 메소드는 콜 시그니처만 가진다)
2. 자식 클래스들이 표준화된 프로퍼티와 메소드를 갖도록 설계해주는 것임.

protected는 추상 클래스로부터 상속받은 클래스들이 property에 접근하도록 해줌. #4.3 에서 3:45초

타입의 활용.
1. 프로퍼티 타입을 지정하거나,
특정 값을 가지도록 선택지(A | B) 제공
2. 오브젝트 모양을 묘사
3. 타입 alias 만들 때 사용

타입제한
[key:string] : string
key가 제한되지 않은 오브젝트를 정의함
스트링 형식의 키를 가진 오브젝트와 값도 스트링
프로퍼티가 정해지지 않았지만 타입만 지정!

type nickName: string
프로퍼티를 이미 정하고 타입 지정

선택지 제공. 타입 alias 만듬
type Health = 1 | 5 | 10

type Friends = Array // 문자 배열.

type Player = { // 객체 모양을 특정할 때 쓰기 OK
health: Health
}

4.3 인터페이스.. 클래스

추상 클래스와 extends => 인터페이스와 implements 로 변경! js로 컴파일시 클래스는 둘다 남지만 후자에서 추상클래스는 사라지기에 가볍다.

4.4 recap
타입 : 별칭, 객체 모양 만들기, 타입 선택지 만들기
인터페이스: 객체 모양 만들기. 추상 클래스 처럼 원형이 될 객체를 만드려는 용도에 사용 가능
똑같은 이름을 가진 인터페이스 재정의해서 추가로 프로퍼티 쌓기 가능

4.5 정리

다형성은 다른 모양의 코드를 가지게 해줌.
제네릭을 사용하는것임
제네릭은 concrete 타입이 아니고 placeholder 타입이라고 보면 된다. 나중에 들어온 값에 따라 타입을 추론해서 정함.

  • abstract로 상속받은 클래스를 js로 변환하게되면, abstract코드도 js파일에 남게된다. 그래서 코드 최적화를 위해, interface와 implements를 사용한다. 이 두 기능은 js에는 없으므로 ts를 js로 변환한 코드에서 보이지 않는다. 즉 코드최적화 완료! abstract와 interface/implements는 둘다 같은 기능을 구현한다.(상속받는 클래스가 구현할 기능들을 명시함)

노마드 코더 ts 블록체인 (class 어렵다..)

  //5.5 블록체인! 데이터가 들어간 블록. 여러 개의 블록이 연결되어 있음.
// 연결은 해쉬값으로 되어있다.
import crypto from "crypto";

interface BlockShape {
  hash: string; // 해쉬는 아래 3개 값을 이용해서 계산된다.
  prevHash: string;
  height: number; // 블록 위치
  data: string;
}

class Block implements BlockShape {
  public hash: string;
  constructor(prevHash: string, height: number, data: string) {
    //hash 변수 초기화해주기
    this.hash = Block.calculateHash(prevHash, height, data);
  }
  static calculateHash(prevhash: string, height: number, data: string) {
    const toHash = `${prevhash}${height}${data}`;
    return crypto.createHash("sha256").update(toHash).digest("hex");
  } // hash는 nodeJs 패키지인 crypto로 만든다.
}

class Blockchain {
  // blocks 라는 배열을 가지고 타입을 class Block으로.
  private blocks: Block[];
  constructor() {
    this.blocks = [];
  }
  private getPrevHash() {
    if (this.blocks.length === 0) return "";
    return this.blocks[this.blocks.length - 1].hash; //마지막 블럭의 해쉬값
  }
  public addBlock(data: string) {
    const newBlock = new Block(this.getPrevHash(), this.blocks.length + 1, data);

    this.blocks.push(newBlock); //새로 생성한 블록을 blocks 배열에 넣기.
  }
  public getBlocks() {
    return [...this.blocks];
  }
}

const blockchain = new Blockchain();

blockchain.addBlock("First Block");
blockchain.addBlock("Second Block");
blockchain.addBlock("Third Block");
blockchain.addBlock("Fourth Block");
blockchain.addBlock("Fifth Block");

blockchain.getBlocks(); // 모든 블록 반환

  

ts ground
https://huchu.link/sZiEfpZ

profile
기록은 기억이 된다

0개의 댓글