예제 연습하기-6 도서관대여 키오스크 콘솔앱

주혜림·2026년 2월 23일

🧩 콘솔 과제: 📚 도서관 대여 키오스크 (OOP + enum + Generic)

[ 목표 ]

연습예제-5 카페 키오스크 콘솔앱과 거의 유사한 내용으로 스켈레톤 코딩으로 한 번 더 연습한 뒤 온전히 혼자 코드를 구현하도록 한다.
최종프로젝트를 곧 들어가는 일정인데 걱정은 많이 되지만 연습한 만큼 실력이 올라왔으면 하는 바람이다.

폴더 및 파일 생성

lib/
 ├─ main.dart
 ├─ enums/
 │    └─ enums.dart
 ├─ models/
 │    ├─ book.dart
 │    └─ borrow_item.dart
 ├─ repository/
 │    └─ book_repository.dart
 ├─ services/
 │    ├─ borrow_service.dart
 │    └─ policy_service.dart
 └─ utils/
      ├─ console_io.dart
      └─ generic_utils.dart

레포지토리 생성

깃 허브 링크

스켈레톤 코딩

직전 했던 키오스크와 구조가 거의 같아서 참고하되, 어떤 함수를 불러오고 값을 담아주고 적용시키면 되는지, 각 클래스의 역할을 파악하고 흐름에 대한 감각을 익힌다.


트러블슈팅

[ 문제발생 ]

1. 게스트 등급에서는 3권 이상은 빌릴 수 없는데 책 대여가 가능한 부분

2. 선택한 대여 권수에 대한 등급별 적용이 되지 않았다.
게스트 등급이어서 2권을 빌리고 회원등급을 선택해서 4권 이상만 가능한 standard를 선택했는데 적용이 되었다.


[ 이유 ]

1. 최대 대여가능한 권수에 대한 조건에서 totalBorrowedCount에 count값이 더해지지 않았다.

    if (totalBorrowedCount + count > book.stock) {
      print('재고가 부족합니다. 남은 재고: ${book.stock}개 | 장바구니: $totalBorrowedCount개');
    } else if (totalBorrowedCount > maxBorrowLimit) {
      print('최대 대여 가능한 권수 이상입니다.');
      return;
    }

2. 등급을 관리하는 로직이 없다.


[ 문제해결 ]

1. count값을 더해주었더니 해결되었다.

 if (totalBorrowedCount + count > book.stock) {
      print('재고가 부족합니다. 남은 재고: ${book.stock}개 | 장바구니: $totalBorrowedCount개');
    } else if (totalBorrowedCount + count > maxBorrowLimit) {
      print('최대 대여 가능한 권수 이상입니다.');
      return;
    }

2.

_selectMemberTierFlow() 함수에서도 변경될 등급적용을 해준다.

// 변경 등급 적용!!
    print('회원 등급이 ${_memberTierText(selectedMemberTier)}로 설정되었습니다.');

_confirmBorrowFlow() 함수에서 결제하기 전 등급에 대한 한도를 한번 더 체크한다.

final int masLine = policyService.borrowLimitForTier(selectedMemberTier);
    if (borrowService.totalBorrowedCount() > masLine) {
      print('대여불가: 선택하신 등급의 대여한도 ${masLine}권을 초과했습니다.');
      print('장바구니에서 수량을 줄여주세요.');
      return;
    }

디버깅모드로 어느 부분이 문제인지 확인을 해보았다.
처음시작 시 등급은 (게스트) 2권 이상은 못 빌린다.
사용자의 등급을 보고 몇권 빌릴 수 있는지만 가져온 상태

비교는 add함수에서 이루어지고 있다.

혼동이 생겼던 이유!!

해당 프로그램은 사용자가 본인의 등급을 입력한 뒤, 그 등급에 따라 빌릴 수 있는 권수가 제한되는 것이었는데
나는 반대로 이미 게스트 등급이 부여되어 있는데 왜 다른 등급이 선택이 가능한지 이 자체가 오류라고 여겨서
이미 완성이 다 된 코드를 수정하고 추가하려고 했었다.
함수작성을 잘못한거라고 방향을 잘 못 간 바람에 이미 완성된 코드에서 수정을 하려고 하니 엉뚱한 방향으로 코드의 오류라 생각을 하게 되었다.


> [Dart 심화] 심화 과제 - 성적 분석 프로그램

과제 시나리오 링크

reduce() 메서드

리스트.reduce((누적값, 현재요소) => { 계산식 })
reduce는 요소를 하나씩 꺼내서 연산을 하고 결과를 누적해서 반환해줌.

도전문제의 힌트에서 학생들의 점수를 비교하여 가장 점수가 높은 우수생을 출력하는 부분에서
배열메서드 reduce 혹은 sort를 사용하라는 조건이 있었다.

reduce(): 누적계산값
sort(): 배열 원소 정렬

reduce의 기능을 이용해서 최대값을 구하는 방법을 이용해 점수를 비교하고 출력을 해보기로 했다.

void main() {
  List<int> numbers = [1, 3, 5, 7, 9];

  // 1. 리스트 합계 구하기
  final sum = numbers.reduce((prev, next) => prev + next);
  print(sum); // 25 (1+3+5+7+9)

  // 2. 최대값 구하기
  final maxVal = numbers.reduce((e, v) => e > v ? e : v);
  print(maxVal); // 9

  // 3. 문자열 리스트 연결
  List<String> words = ['Flutter', 'is', 'awesome'];
  final sentence = words.reduce((prev, next) => '$prev $next');
  print(sentence); // Flutter is awesome
}

fold() 메서드

fold(초기값, (누적값, 현재요소) => ...)

void main() {
  List<int> numbers = [1, 3, 5, 7];

  // 0부터 시작하여 numbers의 모든 요소를 더함
  int sum = numbers.fold(0, (prev, next) => prev + next);

  print(sum); // 16
}

반복문 활용하기

for문 안쪽에서는 리스트가 계속 반복이 되고 있기 때문에 sum의 값이 리스트의 목록만큼 전체가 출력이 되게 된다.

하나의 전체 합계를 1번만 출력이 되게 하려면 for문 바깥쪽으로 sum의 결과값을 출력해준다.

반복문의 특성을 적절히 활용해서 원하는 출력값을 불러올 수 있다.

for (var studentScore in studentList) {
        // 학생들의 리스트에서 점수만 뽑아와서 하나씩 더해준다.
        // 전체점수 합계가 1번만 나오게 하려면??
        sum += studentScore.score;
        print('이름: ${studentScore.name} 점수:${studentScore.score} 합계: $sum');
      }
      print('전체 점수 합계: $sum');
      
 // for문 안쪽 출력
 // 이름: 홍길동 점수:90 합계: 90
 // 이름: 김철수 점수:80 합계: 170
 // 이름: 주혜림 점수:100 합계: 270
 // 이름: ㅇㅇㅇ 점수:50 합계: 320
 
 // 바깥 출력
 // 전체 점수 합계: 320

profile
앱 개발을 공부중입니다.

0개의 댓글