aotoyae

[TS] 타입스크립트 활용 : 간단한 책 대여 프로그램 class 본문

TypeScript

[TS] 타입스크립트 활용 : 간단한 책 대여 프로그램 class

aotoyae 2024. 3. 6. 03:25

 

 

💡 class 를 활용해 간단한 책 대여 프로그램을 만들어보자.

 

src/index.ts

User, 책 정의

enum Role {
  LIBRARIAN, // 사서
  MEMBER, // 멤버
}

abstract class User {
  // 추상 클래스
  constructor(
    public name: string,
    public age: number
  ) {}
  abstract getRole(): Role;
}

class Member extends User {
  constructor(name: string, age: number) {
    super(name, age);
  }

  getRole(): Role {
    return Role.MEMBER;
  }
}

class Librarian extends User {
  constructor(name: string, age: number) {
    super(name, age);
  }

  getRole(): Role {
    return Role.LIBRARIAN;
  }
}

class Book {
  constructor(
    public title: string,
    public author: string,
    public publishedDate: Date
  ) {}
}

 

동작할 함수

interface RentManager {
  getBooks(): Book[]; // 도서관의 현재 도서 목록을 확인
  addBook(user: User, book: Book): void; // 사서가 새 책을 입고할 때 호출
  removeBook(user: User, book: Book): void; // 사서가 책 폐기할 떄 호출
  rentBook(user: Member, book: Book): void; // 사용자가 책 빌릴 때 호출
  returnBook(user: Member, book: Book): void; // 사용자가 책 반납할 때 호출
}

class Library implements RentManager {
  private books: Book[] = [];
  // rentedBooks 는 유저의 대여 이력을 관리한다.
  private rentedBooks: Map<string, Book> = new Map<string, Book>();

  getBooks(): Book[] {
    // 깊은 복사를 해 외부에서 books 를 수정하는 것을 방지
    return JSON.parse(JSON.stringify(this.books));
  }

  addBook(user: User, book: Book): void {
    if (user.getRole() !== Role.LIBRARIAN) {
      // 권한 체크
      console.log('사서만 도서를 추가할 수 있습니다.');
      return;
    }

    this.books.push(book);
  }

  removeBook(user: User, book: Book): void {
    if (user.getRole() !== Role.LIBRARIAN) {
      // 권한 체크
      console.log('사서만 도서를 삭제할 수 있습니다.');
      return;
    }

    const idx = this.books.indexOf(book); // 인덱스 찾아서 제거
    if (idx !== -1) this.books.splice(idx, 1);
  }

  rentBook(user: Member, book: Book): void {
    if (user.getRole() !== Role.MEMBER) {
      // 권한 체크
      console.log('유저만 도서를 대여할 수 있습니다.');
      return;
    }

    if (this.rentedBooks.has(user.name)) {
      // 대여 이력 검사
      console.log(`${user.name}님은 이미 다른 책을 대여 중이십니다.`);
    } else {
      this.rentedBooks.set(user.name, book); // 대여 이력 기록
      console.log(`${user.name}님이 ${book.title} 책을 빌렸습니다.`);
    }
  }

  returnBook(user: Member, book: Book): void {
    if (user.getRole() !== Role.MEMBER) {
      // 권한 체크
      console.log('유저만 도서를 반납할 수 있습니다.');
      return;
    }

    if (this.rentedBooks.get(user.name) === book) {
      this.rentedBooks.delete(user.name); // 대여 책에서 삭제
      console.log(`${user.name}님이 ${book.title} 책을 반납했습니다.`);
    } else {
      console.log(`${user.name}님은 ${book.title} 책을 빌리지 않았습니다.`);
    }
  }
}

 

실행해 보자 ~

function main() {
  const myLibrary = new Library();
  const librarian = new Librarian('aoto', 20);
  const member1 = new Member('yae', 22);
  const member2 = new Member('haru', 23);

  const book1 = new Book('사과는 뭘까?', '사과가 궁금한 이', new Date());
  const book2 = new Book('딸기는 뭘까?', '딸기가 궁금한 이', new Date());
  const book3 = new Book('레몬은 뭘까?', '레몬은 궁금한 이', new Date());

  myLibrary.addBook(librarian, book1);
  myLibrary.addBook(librarian, book2);
  myLibrary.addBook(librarian, book3);

  const books = myLibrary.getBooks();
  console.log('대여할 수 있는 도서 목록:', books); // 벡틱으로 쓰니 [Object Object]... 출력

  myLibrary.rentBook(member1, book1);
  myLibrary.rentBook(member2, book2);

  myLibrary.returnBook(member1, book1);
  myLibrary.returnBook(member2, book2);
}

main();

 

🌀 결과 🌀

대여할 수 있는 도서 목록: [
  {
    title: '사과는 뭘까?',
    author: '사과가 궁금한 이',
    publishedDate: '2024-03-05T18:24:11.004Z'
  },
  {
    title: '딸기는 뭘까?',
    author: '딸기가 궁금한 이',
    publishedDate: '2024-03-05T18:24:11.004Z'
  },
  {
    title: '레몬은 뭘까?',
    author: '레몬은 궁금한 이',
    publishedDate: '2024-03-05T18:24:11.004Z'
  }
]
yae님이 사과는 뭘까? 책을 빌렸습니다.
haru님이 딸기는 뭘까? 책을 빌렸습니다.
yae님이 사과는 뭘까? 책을 반납했습니다.
haru님이 딸기는 뭘까? 책을 반납했습니다.

 

 

 

🔗 https://www.howdy-mj.me/typescript/extends-and-implements

 

extends와 implements

자바스크립트에서 어떤 클래스를 상속받고 싶을 때는 하위 클래스에서 `extends` 키워드를 통해 상속 받을 수 있다. 그리고 타입스크립트에서는 `implements` 키워드를 통해서, interface와 class를 동시

www.howdy-mj.me