Dart 오답노트 : 14. typedef

샤워실의 바보·2023년 10월 24일
0
post-thumbnail
void main() {
  Operation operation = add;
  int result = calculate(10, 20, 30, operation);
  print(result); // 60
  
  operation = subtract;
  int result2 = calculate(10, 20, 30, operation);
  print(result2); // -40
}

typedef Operation = int Function(int x, int y, int z);

int add(int x, int y, int z) => x + y + z;

int subtract(int x, int y, int z) => x - y - z;

int calculate(int x, int y, int z, Operation operation) {
  return operation(x, y, z);
}

typedef는 Dart에서 사용자 정의 타입을 선언하는 데 사용됩니다. 특히 함수 시그니처를 명확히 정의하여 코드의 가독성을 향상시키고, 코드의 유지 보수를 용이하게 만들며, 오류를 줄일 수 있도록 도와줍니다.

코드 설명

  1. typedef Operation = int Function(int x, int y, int z);

    • Operation이라는 새로운 타입을 선언합니다. 이 타입은 세 개의 정수 매개변수를 받고 정수를 반환하는 함수를 나타냅니다.
  2. int add(int x, int y, int z) => x + y + z;

    • 세 개의 정수를 받아서 더한 결과를 반환하는 함수입니다. 이 함수는 Operation 타입과 호환됩니다.
  3. int subtract(int x, int y, int z) => x - y - z;

    • 세 개의 정수를 받아서 첫 번째 정수에서 나머지 두 정수를 뺀 결과를 반환하는 함수입니다. 이 함수도 Operation 타입과 호환됩니다.
  4. int calculate(int x, int y, int z, Operation operation)

    • 세 개의 정수와 Operation 타입의 함수를 매개변수로 받아, 주어진 함수를 사용하여 연산을 수행하고 결과를 반환합니다.

main 함수에서의 사용

  1. Operation operation = add;

    • Operation 타입의 변수 operation을 선언하고, add 함수를 할당합니다.
  2. int result = calculate(10, 20, 30, operation);

    • calculate 함수를 호출하여 operation에 할당된 add 함수를 사용합니다. 결과는 60이고, 이 값은 출력됩니다.
  3. operation = subtract;

    • operationsubtract 함수를 할당합니다.
  4. int result2 = calculate(10, 20, 30, operation);

    • 다시 calculate 함수를 호출하여 이번에는 operation에 할당된 subtract 함수를 사용합니다. 결과는 -40이고, 이 값은 출력됩니다.

typedef의 장점

  1. 가독성: 함수 시그니처를 한 곳에서 선언하고, 이를 사용하여 코드 전체에서 일관된 방식으로 함수를 사용할 수 있습니다.

  2. 유지 보수: 함수 시그니처가 변경되어야 하는 경우, typedef 선언만 수정하면 되므로 변경 사항을 쉽게 추적하고 수정할 수 있습니다.

  3. 유연성: 다양한 함수를 같은 타입으로 처리할 수 있으며, 필요에 따라 다른 함수를 전달할 수 있습니다.

  4. 오류 방지: 컴파일 타임에 타입 검사가 수행되어 잘못된 타입의 함수를 전달하는 실수를 방지할 수 있습니다.

이러한 이점들로 인해 typedef는 Dart 프로그래밍에서 유용하게 사용될 수 있습니다.

typedef ListOfInts = List<int>;
typedef UserInfo = Map<String, String>;

ListOfInts reverseListOfNumbers(ListOfInts list) {
  var reversed = list.reversed;
  return reversed.toList();
}

String sayHi(UserInfo userInfo) {
  return "Hi ${userInfo['name']}";
}

void main() {
  print(reverseListOfNumbers([1, 2, 3])); // [3, 2, 1]
  print(sayHi({'name': 'joe'})); // Hi joe
}

typedef를 사용하면 Dart에서 사용자 정의 타입을 만들 수 있습니다. 이는 코드의 가독성을 높이고, 타입을 더 명확하게 만들어서 오류를 줄일 수 있습니다.

코드 설명

  1. typedef ListOfInts = List<int>;

    • ListOfInts라는 새로운 타입을 선언하고, 이를 List<int>에 매핑합니다. 즉, ListOfInts는 정수의 리스트를 나타내는 타입입니다.
  2. typedef UserInfo = Map<String, String>;

    • UserInfo라는 새로운 타입을 선언하고, 이를 Map<String, String>에 매핑합니다. UserInfo는 문자열의 키와 값으로 이루어진 맵을 나타냅니다.
  3. ListOfInts reverseListOfNumbers(ListOfInts list)

    • ListOfInts 타입의 리스트를 받아서 역순으로 된 새 리스트를 반환하는 함수입니다. reversed 프로퍼티를 사용하여 리스트를 뒤집고, toList()를 호출하여 결과를 리스트로 변환합니다.
  4. String sayHi(UserInfo userInfo)

    • UserInfo 타입의 맵을 받아서 사용자의 이름을 인사말과 함께 반환하는 함수입니다. 맵에서 'name' 키에 해당하는 값을 가져와서 문자열 내에 삽입합니다.

main 함수에서의 사용

  1. print(reverseListOfNumbers([1, 2, 3]));

    • [1, 2, 3] 리스트를 reverseListOfNumbers 함수에 전달하고, 결과를 출력합니다. 출력된 값은 [3, 2, 1]입니다.
  2. print(sayHi({'name': 'joe'}));

    • {'name': 'joe'} 맵을 sayHi 함수에 전달하고, 결과를 출력합니다. 출력된 값은 Hi joe입니다.
profile
공부하는 개발자

0개의 댓글