Flutter

[Dart] 함수(Function) 알아보기

참깨빵위에참깨빵_ 2023. 5. 7. 23:10
728x90
반응형

Dart에도 당연히 함수는 존재한다. 그러나 사용법이 자바 / 코틀린과 매우 달라서 주의깊게 확인할 필요가 있다.

공식문서부터 쭉 읽어본다.

 

https://dart.dev/language/functions

 

Functions

Everything about functions in Dart.

dart.dev

Dart는 객체지향 언어기 때문에 함수도 객체고 유형이 Function이다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미한다. 함수처럼 Dart 클래스의 인스턴스를 호출할 수도 있다. 아래는 함수 구현 예시다
bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
이펙티브 Dart에선 공개 API에 대한 어노테이션을 권장하지만 타입을 생략해도 함수는 계속 작동한다
isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
하나의 표현식만 포함하는 함수면 단축 구문(shorthand syntax)을 쓸 수 있다. "=>" 표기법은 화살표 구문(arrow syntax)라고도 한다. 화살표와 세미콜론 사이에는 표현식만 들어갈 수 있다. if문은 넣을 수 없지만 조건식은 쓸 수 있다
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
함수는 필수 위치 매개변수(required positional parameters)를 얼마든 가질 수 있다. 그 뒤에 명명된 매개변수(named parameters) 또는 선택적 위치 매개변수(optional positional parameters)가 올 수 있다(둘 다는 아님). 함수에 인수를 전달하거나 함수 매개변수를 정의할 때 후행 쉼표(,)를 사용할 수 있다

- Named Parameters

명명된 매개변수는 명시적으로 required로 표시되지 않는 한 선택 사항이다. 함수를 정의할 때 {param1, param2, ...}를 써서 명명된 매개변수를 지정한다. 기본값을 제공하지 않거나 명명된 매개변수를 필수로 표시하지 않으면 해당 유형은 기본값이 null이 되므로 null을 허용해야 한다
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool? bold, bool? hidden}) {...}
함수를 호출할 때 "paramName: value"를 써서 명명된 매개변수를 지정할 수 있다
enableFlags(bold: true, hidden: false);
null 외의 명명된 매개변수에 대한 기본값을 지정하려면 "="를 써서 기본값을 지정한다. 지정된 값은 컴파일 타임 상수여야 한다
/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold will be true; hidden will be false.
enableFlags(bold: true);
명명된 매개변수를 필수로 지정해서 사용자가 매개변수 값을 제공하게 요구하는 경우 required를 추가하라
const Scrollbar({super.key, required Widget child});
- 선택적 위치 파라미터

함수 매개변수 세트를 대괄호로 감싸면 선택적 위치 매개변수로 표시된다. 기본값을 제공하지 않으면 해당 유형은 기본값이 null이 되므로 null을 허용해야 한다
String say(String from, String msg, [String? device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

 

함수를 정의할 때 매개변수를 선언할 경우 required 또는 대괄호를 써서 호출 시 다양한 옵션을 줄 수 있다. 이런 문법 자체가 자바 / 코틀린에선 없기 때문에 내겐 매우 생소하게 느껴졌다.

공식문서에서도 예제 코드가 많이 있지만 다른 예제를 확인해 본다. 가로와 세로 길이를 넘기면 둘을 곱한 값을 int 타입으로 리턴하는 함수가 있다고 가정한다.

 

int area({required int width, required int height}) => width * height;

 

이렇게 작성한 함수는 메인 함수에서 호출 시 "매개변수: 값" 형태로 각 매개변수마다 어떤 값을 할당해야 한다.

 

void main() {
  int result = area(height: 1, width: 2);
  print(result); // 2
}

int area({required int width, required int height}) => width * height;

 

다른 코드를 본다. 3가지 매개변수를 받아서 셋을 더한 값을 int 타입으로 리턴하는 함수가 있다고 가정한다.

 

int addNumbers(int a, {required int b, int c = 4}) => a + b + c;

 

중괄호 안에 들어 있는 int c 변수의 기본값을 4로 설정한 것처럼 int a에도 기본값을 설정하려고 하면 a 부분에 컴파일 에러가 발생한다.

 

// Named parameters must be enclosed in curly braces ('{' and '}').
int addNumbers(int a = 1, {required int b, int c = 4}) => a + b + c;

 

따라서 초기값을 정의해 주려면 중괄호 또는 대괄호를 사용해야 한다. 대괄호는 기본값을 갖는 positional parameter를 선언하기 위해 사용한다.

 

int addNumbers(int a, [int b = 2, int c = 3]) => a + b + c;

 

addNumbers()를 실제 호출 시 b, c 위치에 어떤 값도 설정하지 않으면 2, 3이 자동으로 들어가 계산된다.

 

void main() {
  int result = addNumbers(1); // 6
  print(result);
}

int addNumbers(int a, [int b = 2, int c = 3]) => a + b + c;

 

당연히 b, c 위치에 2, 3이 아닌 다른 숫자를 넣으면 그 숫자를 바탕으로 값이 계산된다.

 

void main() {
  int result = addNumbers(1, 4, 5);
  print(result);
}

int addNumbers(int a, [int b = 2, int c = 3]) => a + b + c;

 

대괄호 또는 중괄호와 required를 쓰지 않고 매개변수를 선언한 경우 이것을 positional parameter라고 한다.

 

int addNumbers(int a, int b, int c) => a + b + c;

 

positional parameter와 named parameter를 섞어 쓰는 것도 가능하다. 이 때 positional parameter가 named parameter보다 앞에 위치해야 한다. 그렇지 않으면 컴파일 에러가 발생한다.

 

void main() {
  int result = addNumbers(1, b: 2, c: 3);
  print(result);
}

int addNumbers(int a, {required int b, required int c}) => a + b + c;

 

반응형