Vintage appMaker의 Tech Blog

[dart] List를 이용한 Function table 활용 - case & 순차적 함수처리 본문

Source code or Tip/Flutter & Dart

[dart] List를 이용한 Function table 활용 - case & 순차적 함수처리

VintageappMaker 2022. 6. 16. 23:34

 

dart에서 List에 값을 넣을 때, Closure 형태의 함수들을 사용할 수 있다. 그러므로 case 문이 길어질 경우, case별 함수를 정의한 후, List로 만들어 인자를 넘기면 가져와 실행시킬 수 있는 Function table로 활용할 수 있다. kotlin, python, swift 같은 언어에서도 이러한 방식을 사용하는 경우가 종종 있다. 

// 실행테이블
var fnTable = [
  "초기값 100",  100,
      (int n){return n * 3;}, (int n){return n - 3; },
  "초기값 3", 3, (int n){return n - 3; }, "계산완료"];

 

List의 아이템이 다양한 타입일 경우, 가져온 아이템의 타입을 is로 비교한다. 그리고 비교한 결과가 true일 경우, 타입에 맞게 사용할 수 있다. 이때는 as를 이용하여 타입케스팅을 할 필요 없이 바로 사용가능하다.

 

 

void processCommand(List<Object> fnTable) {
  int nValue = 0;

  print ( "\n\n>>>>>>>>>>>> do action start:" );

  for(var item in fnTable){
    if (item is int Function(int)){
      print ("do => ${nValue}을 입력하여 계산하기.");
      // (item as int function(int))(3);
      print ("> ${item(nValue)}");
    }

    if (item is int){
      nValue = item;
      print ("do => 값설정");
      print("> set nValue = ${item}");
    }

    if (item is  String){
      print ("do => 메시지 출력");
      print ("> $item");
    }

  }

  print ( ">>>>>>>>>>>> do action end:\n\n" );

}

 

 

[전체소스]

import 'dart:io';
void main() {

  // 실행테이블  
  var fnTable = [
    "초기값 100",  100,
        (int n){return n * 3;}, (int n){return n - 3; },
    "초기값 3", 3, (int n){return n - 3; }, "계산완료"];

  print (fnTable);

  checkTable(fnTable);
  processCommand(fnTable);

  var fnTable2 = [ "처음시작", for(var f in fnTable) f, 1000, (int n){return n * 11;} ];
  print (fnTable2);

  checkTable(fnTable2);
  processCommand(fnTable2);

}

void checkTable(List<Object> fnTable) {
  print ( "\n\n>>>>>>>>>>>> 테이블 Item 종류:" );
  for( var fn in fnTable){
    print (fn.runtimeType);
  }
  print ( ">>>>>>>>>>>> 테이블 Item 종류:" );

}

void processCommand(List<Object> fnTable) {
  int nValue = 0;

  print ( "\n\n>>>>>>>>>>>> do action start:" );

  for(var item in fnTable){
    if (item is int Function(int)){
      print ("do => ${nValue}을 입력하여 계산하기.");
      // (item as int function(int))(3);
      print ("> ${item(nValue)}");
    }

    if (item is int){
      nValue = item;
      print ("do => 값설정");
      print("> set nValue = ${item}");
    }

    if (item is  String){
      print ("do => 메시지 출력");
      print ("> $item");
    }

  }

  print ( ">>>>>>>>>>>> do action end:\n\n" );

}

 

 

Comments