제네릭과 enum사용

하상현·2023년 12월 8일
0
// 금고 클래스에 담는 인스턴스의 타입은 미정
// 금고에는 1개의 인스턴스를 담을 수 있음
// put() 메서드로 인스턴스를 저장하고 get() 메서드로 인스턴스를 얻을 있음
// get() 으로 얻을 때는 별도의 타입 캐스팅을 사용하지 않아도 됨
// 열쇠를 사용하여 금고를 열 수 있다 이때 열쇠마다 최소사용횟수가 있다
// 최소 사용 횟수를 넘겨야만 금고가 열린다.

enum KeyType {
  padlock(1024),
  button(10000),
  dial(30000),
  finger(1000000);

  const KeyType(this.count);
  final int count;
}

class StrongBox<T> {  //금고에 담는 인스턴스타입이 미정이라 <T> 사용
  T? _item;  // 금고에 1개의 인스턴스를 담음 만약 같은타입으로 여러개를 넣을거면 List사용
  int opentry = 1;

  void put(T item) {  //금고에 아이템 넣기
    _item = item;
  }

  T? get(KeyType key) {  
    switch (key) {
      case KeyType.padlock:
        if (opentry < KeyType.padlock.count) {
          print('padlock(으)로 $opentry번째 시도 금고열기 실패');
          opentry++;
          return null;
        } else {
          if (_item != null) {
            print('$_item 획득');
            _item = null;
          } else {
            print('금고가 비었습니다');
          }
        }
        return _item;
      case KeyType.button:
        if (opentry < KeyType.button.count) {
          print('button(으)로 $opentry번째 시도 금고열기 실패');
          opentry++;
          return null;
        } else {
          if (_item != null) {
            print('$_item 획득');
            _item = null;
          } else {
            print('금고가 비었습니다');
          }
        }
        return _item;
      case KeyType.dial:
        if (opentry < KeyType.dial.count) {
          print('dial(으)로 $opentry번째 시도 금고열기 실패');
          opentry++;
          return null;
        } else {
          if (_item != null) {
            print('$_item 획득');
            _item = null;
          } else {
            print('금고가 비었습니다');
          }
        }
        return _item;
      case KeyType.finger:
        if (opentry < KeyType.finger.count) {
          print('finger(으)로 $opentry번째 시도 금고열기 실패');
          opentry++;
          return null;
        } else {
          if (_item != null) {
            print('$_item 획득');
            _item = null;
          } else {
            print('금고가 비었습니다');
          }
        }
        return _item;
    }
  }

  
  String toString() => '금고안에 들어있는 아이템 : $_item';
}

void main() {
  String i = '보석';
  StrongBox<String> myBox = StrongBox<String>();
  myBox.put(i);
  print(myBox);

  myBox.get(KeyType.padlock);
  myBox.get(KeyType.padlock);
  myBox.get(KeyType.padlock);
  print('...');
  myBox.opentry = 1023;
  myBox.get(KeyType.padlock);
  myBox.get(KeyType.padlock);
  myBox.get(KeyType.padlock);
}

0개의 댓글