Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 파이썬 for in
- 리액트 프로젝트
- 내일배움캠프 최종 프로젝트
- 파이썬 list
- useState
- tanstack query
- 내일배움캠프
- 내배캠 프로젝트
- 자바스크립트
- React Hooks
- 프로그래머스
- 리액트
- 파이썬 slice
- 타입스크립트
- 파이썬 enumerate
- Next 팀 프로젝트
- JavaScript
- 내일배움캠프 프로젝트
- 파이썬 replace
- 코딩테스트
- 타입스크립트 리액트
- js
- REACT
- 파이썬 for
- 파이썬 딕셔너리
- 한글 공부 사이트
- 타입스크립트 props
- 파이썬 반복문
- 리액트 훅
- typeScript
Archives
- Today
- Total
sohyeon kim
[TS] 타입스크립트 활용 : 간단한 책 대여 프로그램 class 본문
728x90
💡 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
728x90
반응형
'TypeScript' 카테고리의 다른 글
[TS/React] TodoList 에 활용, props & children props (1) | 2024.03.06 |
---|---|
[TS] 비동기 함수 & React에 타입스크립트 사용 : props (1) | 2024.03.06 |
[TS] 타입스크립트 활용 : 간단한 카페 주문 받기 프로그램 (2) | 2024.03.06 |
[TS] 타입스크립트 모듈 사용, 옵션 설정 & tsconfig/bases (0) | 2024.03.05 |
[TS] Pick, Omit : 객체 프로퍼티 고르기, 생략하기 & Union 제거 (1) | 2024.03.05 |