함수
함수는 입력을 받아 작업을 수행하고 결과를 반환하는 코드 단위입니다.
개념 먼저 보기
함수는 행동에 이름을 붙인 코드 단위입니다
함수는 입력을 받고, 작업을 수행하고, 필요하면 결과를 돌려줍니다. 함수 이름을 잘 지으면 코드가 '무엇을 하는지' 문장처럼 읽힙니다.
Flutter에서는 버튼의 onPressed, 리스트의 itemBuilder, 폼의 validator처럼 함수를 값으로 전달하는 일이 많습니다.
종류별로 하나씩
함수에서 먼저 구분할 요소
반환 타입
함수가 돌려주는 값의 타입입니다. 아무 값도 돌려주지 않으면 void를 사용합니다.
언제 쓰나: 계산 결과를 다음 코드에서 사용해야 하면 반환 타입을 명확히 적습니다.
Flutter에서: validator는 String?을 반환하고, build는 Widget을 반환합니다.
// 문자열을 반환하는 함수입니다.
String makeTitle(String name) {
return '안녕하세요, $name';
}
// 값을 반환하지 않고 출력만 하는 함수입니다.
void logTitle(String title) {
print(title);
}
named parameter
인자 이름을 붙여 전달하는 매개변수입니다. Flutter 생성자에서 거의 표준처럼 쓰입니다.
언제 쓰나: 인자가 여러 개라 순서만으로 의미를 알기 어려울 때 사용합니다.
Flutter에서: TextStyle(fontSize: 16, fontWeight: FontWeight.bold) 같은 호출이 모두 named parameter입니다.
Widget lessonButton({
required String title,
required VoidCallback onPressed,
}) {
return ElevatedButton(
onPressed: onPressed,
child: Text(title),
);
}
콜백 함수
나중에 실행되도록 다른 함수나 위젯에 전달하는 함수입니다.
언제 쓰나: 버튼 클릭, 입력 변경, 저장 완료 같은 이벤트에 반응해야 할 때 사용합니다.
Flutter에서: onPressed, onChanged, itemBuilder, builder가 대표적인 콜백 자리입니다.
TextField(
// 사용자가 글자를 입력할 때마다 실행되는 콜백입니다.
onChanged: (value) {
print('현재 입력값: $value');
},
)
부연 설명
함수 선언
- 반환 타입, 함수 이름, 매개변수, 본문으로 구성됩니다.
- 반환 값이 없으면 void를 사용합니다.
- 짧은 함수는 화살표 문법으로 간결하게 쓸 수 있습니다.
부연 설명
매개변수
- 위치 매개변수는 순서가 중요합니다.
- named parameter는 이름으로 값을 전달해 Flutter 생성자에서 매우 자주 쓰입니다.
- required는 named parameter가 반드시 전달되어야 함을 의미합니다.
깊게 이해하기
함수는 코드 재사용의 최소 단위이면서 앱의 행동을 이름 붙이는 방법입니다. 좋은 함수 이름은 주석보다 강하게 의도를 전달합니다.
Flutter에서는 콜백, validator, builder, event handler 등 함수가 값처럼 전달되는 상황이 많습니다. 따라서 매개변수 형태와 반환 타입을 명확히 읽는 능력이 중요합니다.
상세 예제
폼 입력값을 검증하고 표시 문구를 만드는 함수를 분리한 예제입니다.
// TextFormField의 validator에 넣을 수 있는 함수입니다.
// 오류가 있으면 String 메시지를 반환하고, 문제가 없으면 null을 반환합니다.
String? validateLessonTitle(String? value) {
// 사용자가 공백만 입력했을 수도 있으므로 trim으로 앞뒤 공백을 제거합니다.
final text = value?.trim() ?? '';
// 입력이 비어 있으면 폼 아래에 표시할 오류 문구를 반환합니다.
if (text.isEmpty) return '제목을 입력하세요.';
// 너무 짧은 제목도 별도 메시지로 안내합니다.
if (text.length < 2) return '제목은 두 글자 이상이어야 합니다.';
// null은 "검증 통과"라는 뜻입니다.
return null;
}
// named parameter를 사용하면 minutes와 compact의 의미가 호출부에서 잘 보입니다.
String formatDuration({required int minutes, bool compact = false}) {
// compact가 true면 짧은 표기를 반환합니다.
if (compact) return '${minutes}m';
// 기본값은 한국어 설명형 문구입니다.
return '$minutes분 학습';
}
// 함수를 인자로 받는 예제입니다. onSuccess는 나중에 실행할 콜백입니다.
void submit({
required String title,
required void Function(String message) onSuccess,
}) {
// 저장이 끝났다고 가정하고 성공 콜백을 실행합니다.
onSuccess('저장 완료: $title');
}
실무에서 주의할 점
- 함수가 너무 많은 일을 한다면 검증, 변환, 저장처럼 역할별로 나누세요.
- Flutter 콜백은 void Function(...) 형태를 자주 사용합니다.
- named parameter는 인자가 많아질수록 호출부를 읽기 쉽게 만듭니다.