Dart의 함수를 알아보자

2022. 6. 22. 16:54DEV/Dart

반응형

함수 구조

void printHello() {
    print('Hello');
}
  • void : 결과값의 타입을 지정해준다.
    • void : return 값이 없음을 의미 -> void는 삭제 가능
    • 반환하는 값이 있는 경우 : 해당 타입으로 지정 eg. int, String, ...
  • printHello : 함수의 이름
  • () : parameter 입력
  • { } : 함수의 기능 구현

Parameter (매개변수)

Parameter 또는 Argumemt라고도 한다.

Positional Parameter

  • 입력한 순서에 따라 값이 정해지는 타입
double divideNumber(int x, int y) {
    return x / y;
}
void main() {
    print(divideNumber(4, 2)); // => 2
    print(divideNumber(2, 4)); // => 0.5
}

Optional Parameter

  • 입력을 하지 않아도 되는 파라미터
  • Null safety 관련 주의할 것 => 기본값을 설정해준다.
int addNumber(int x, [int y]) {  // int y에 Null Safety 오류 발생
    return x + y;
}
void main() {

}
=>
The parameter 'y' can't have a value of 'null' because of its type, but the implicit default value is 'null'.

int addNumber(int x, [int? y]) {  // ? 를 추가해서 Nullable로 설정을 했더니
    return x + y;  // y가 null 값이 가능하니 int에 더하기에서 오류 발생
}
void main() {

}
=>
The argument type 'int?' can't be assigned to the parameter type 'num'.

int addNumber(int x, [int y = 4]) {  // Nullable 삭제하고 기본값 설정해줌
  return x + y;
}

void main() {
  print(addNumber(2, 4)); // => 6
  print(addNumber(2));    // => 6
}

이렇게 사용하면 된다.

Named Parameter

순서와 상관없이 이름을 갖고 있는 파라미터

double divideNumber({required int x, required int y}) {
  return x / y;
}

void main() {
  print(divideNumber(x: 2, y: 4)); // 0.5
  print(divideNumber(y: 4, x: 2)); // 0.5
}

이렇게 순서와 상관없이 잘 작동한다.

그런데 파라미터에 required를 꼭 붙여야 하나? 그렇다!
지워서 확인해보면 다음과 같은 오류가 발생한다.

double divideNumber({int x, int y}) {
  return x / y;
}
The parameter 'x' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
The parameter 'y' can't have a value of 'null' because of its type, but the implicit default value is 'null'.

그럼 Named Parameter에서 Optional Parameter는 어떻게 해야할까?

required를 없애고 Positional Parameter에서와 마찬가지로 기본값을 설정해주면 된다.

double divideNumber({required int x, int y = 4}) {
  return x / y;
}
void main() {
  print(divideNumber(x: 2, y: 4)); // 0.5
  print(divideNumber(y: 4, x: 2)); // 0.5
  print(divideNumber(x: 2));       // 0.5
}

깔끔하게 정리 된다.

Arrow Function (화살표 함수)

함수 코드를 좀 편리하게 사용하도록 해주는 함수이다.

int addNumber(int x, int y) {
  return x + y;
}

int addNumber(int x, int y) => x + y;

typedef

함수를 편리하게 사용할 수 있는 기능으로 함수의 바디가 없다.

// 함수의 Signature 지정 : 함수의 return type과 parameter
typedef Operation = int Function(int x, int y);

// 더하기 함수
int add(int x, int y) => x + y;

// 빼기 함수
int subtract(int x, int y) => x - y;

void main() {
  Operation operation = add; // 실행할 함수 지정
  int result = operation(1, 2);  // 더하기 함수 실행
  print(result); // => 3

  operation = subtract;   // 실행할 함수 지정
  int result2 = operation(1, 2);  // 빼기 함수 실행
  print(result2); // => -1
}

개념적으로는 이런데, 실제로는 이렇게 사용하지 않는다.

// 함수의 Signature 지정 : 함수의 return type과 parameter
typedef Operation = int Function(int x, int y);

// 더하기 함수
int add(int x, int y) => x + y;

// 빼기 함수
int subtract(int x, int y) => x - y;

// 계산 함수
int calculate(int x, int y, Operation operation) => operation(x, y);

void main() {
  int result = calculate(1, 2, add); // 더하기 함수 실행
  print(result); // => 3

  int result2 = calculate(1, 2, subtract); // 빼기 함수 실행
  print(result2); // => -1
}

calcucate 함수에서 Operation을 파라미터로 받아서 지정할 수 있게 했다.

반응형

'DEV > Dart' 카테고리의 다른 글

Dart Async programming - Stream  (0) 2022.06.24
Dart Async programing - Future, await  (0) 2022.06.23
Dart의 형변환 - List, Map, Set  (0) 2022.06.22
Dart - Null safety & Dart Codelab Exercise  (0) 2022.06.21
Dart 시작하기 - 구조 및 변수  (0) 2022.06.21