함수
입력, 연산, 반환 구조로 특정 작업을 수행하는 코드의 모음
특징
•
코드의 재사용성 향상
•
프로그램의 구조화 및 모듈화
•
유지보수의 용이성
•
코드의 가독성 향상
함수
•
함수 정의
◦
함수 호출
◦
매개변수
▪
위치 매개변수
▪
이름 매개변수
▪
필수 매개변수 vs 선택 매개변수
•
익명 함수
•
람다 함수
•
재귀 함수
함수 정의
Dart 에서 함수를 정의할 때는 반환타입 함수명 ( 매개변수 ) { } 구조로 정의합니다.
타입 함수명 ( 매개변수1, 매개변수2 ) {
}
Dart
복사
예시 코드
int add(int a, int b) {
return a + b;
}
void main() {
print(add(3, 5)); // 출력: 8
}
Dart
복사
함수의 반환 타입이 없을 때는 void 키워드를 사용합니다.
void printMessage() {
print('Hello World!');
}
void main() {
printMessage(); // 출력: Hello World!
}
Dart
복사
함수 호출
정의된 함수를 실행하기 위해 함수명과 필요한 매개변수를 지정하여 사용하는 것입니다. 함수를 호출하면 함수 내부의 코드가 실행되고, 반환값이 있다면 그 값을 받을 수 있습니다.
함수명( 인자1, 인자2 );
Dart
복사
매개변수
•
위치 매개변수
•
이름 매개변수
•
필수 매개변수 vs 선택 매개변수
위치 매개변수 (Positional Parameters)
유형 | 문법 | 호출 방식 | 특징 |
위치 필수 매개변수 | 타입 변수명 | 함수(값) | 반드시 순서대로 값을 전달해야 함 |
위치 선택 매개변수 | [타입 변수명 = 기본값] | 함수() 또는 함수(값) | 전달하지 않으면 기본값 사용 |
이름 매개변수 (Named Parameters)
유형 | 문법 | 호출 방식 | 특징 |
이름 필수 매개변수 | {required 타입 변수명} | 함수(변수명: 값) | 반드시 값을 전달해야 함 |
이름 선택 매개변수 | {타입 변수명 = 기본값} | 함수(변수명: 값) | 전달하지 않으면 기본값 사용 |
필수 매개변수 vs 선택 매개변수
구분 | 필수 매개변수 | 선택 매개변수 |
값 전달 여부 | 반드시 전달해야 함 | 전달하지 않아도 됨 |
기본값 설정 | 불가능 | 가능 (= 사용) |
호출 방식 | 위치: 함수(값)
이름: 함수(변수명: 값) | 위치: 함수() 또는 함수(값)
이름: 함수() 또는 함수(변수명: 값) |
문법 | 위치: 타입 변수명
이름: {required 타입 변수명} | 위치: [타입 변수명 = 기본값]
이름: {타입 변수명 = 기본값} |
오류 발생 여부 | 값을 전달하지 않으면 컴파일 오류 발생 | 값을 전달하지 않으면 기본값 사용
(기본값이 없으면 null) |
예시 코드 1 - 위치 매개변수, 이름 매개변수
// 1. 위치 필수 매개변수
void greet(String name) {
print("Hello, $name!");
}
greet("Alice"); // ✅ Hello, Alice!
// greet(); // ❌ 오류 발생 (name 값 필요)
// 2. 위치 선택 매개변수
void greetOptional([String name = "Guest"]) {
print("Hello, $name!");
}
greetOptional(); // ✅ Hello, Guest!
greetOptional("Bob"); // ✅ Hello, Bob!
// 3. 이름 필수 매개변수
void greetRequired({required String name}) {
print("Hello, $name!");
}
// greetRequired(); // ❌ 오류 발생 (name 값 필요)
greetRequired(name: "Charlie"); // ✅ Hello, Charlie!
// 4. 이름 선택 매개변수
void greetNamed({String name = "Guest"}) {
print("Hello, $name!");
}
greetNamed(); // ✅ Hello, Guest!
greetNamed(name: "David"); // ✅ Hello, David!
Dart
복사
예시 코드 2 - 필수 매개변수
// 위치 필수 매개변수
void greet(String name) {
print("Hello, $name!");
}
greet("Alice"); // ✅ Hello, Alice!
// greet(); // ❌ 오류 발생 (name 값 필요)
// 이름 필수 매개변수
void greetRequired({required String name}) {
print("Hello, $name!");
}
// greetRequired(); // ❌ 오류 발생 (name 값 필요)
greetRequired(name: "Bob"); // ✅ Hello, Bob!
Dart
복사
예시 코드 2 - 선택 매개변수
// 위치 선택 매개변수
void greetOptional([String name = "Guest"]) {
print("Hello, $name!");
}
greetOptional(); // ✅ Hello, Guest!
greetOptional("Charlie"); // ✅ Hello, Charlie!
// 이름 선택 매개변수
void greetNamed({String name = "Guest"}) {
print("Hello, $name!");
}
greetNamed(); // ✅ Hello, Guest!
greetNamed(name: "David"); // ✅ Hello, David!
Dart
복사
매개변수 정리
위치 매개변수는 순서대로 전달
이름 매개변수는 변수명: 값 이름 형식으로 전달
위치 필수 매개변수는 반드시 전달해야 하고, 위치 선택 매개변수는 []로 감싸고 기본값 설정 가능
이름 필수 매개변수는 {required}를 사용해 반드시 전달해야 하고,
이름 선택 매개변수는 {타입 변수명=기본값} 형태로 기본값 설정 익명 함수
이름이 없는 함수
함수를 변수에 할당하거나 다른 함수의 매개변수로 전달할 때 주로 사용됩니다.
익명 함수는 주로 콜백 함수로 사용됩니다.콜백 함수 (callback function)
다른 함수의 인자로 전달되어 특정 이벤트나 조건이 발생했을 때 호출되는 함수입니다.
주로 비동기 작업이나 이벤트 처리에서 사용됩니다.
익명 함수
( 타입 매개변수1, 타입 매개변수2 ) { }
Dart
복사
변수에 할당 된 익명함수
var multiply = (int a, int b) {
return a * b;
};
void main() {
print(multiply(3, 5)); // 출력: 15
}
Dart
복사
콜백 함수로써의 익명 함수
void processNumbers(List<int> numbers, Function callback) {
for (var number in numbers) {
callback(number);
}
}
void main() {
var numbers = [1, 2, 3, 4, 5];
// 익명 함수를 콜백으로 전달
processNumbers(numbers, (number) {
print('처리된 숫자: $number');
});
}
Dart
복사
람다 함수
단일 표현식으로 작성되는 간단한 함수입니다.
화살표(=>) 구문을 사용하여 함수를 더 간결하게 표현할 수 있습니다.
람다 함수는 익명 함수의 더 간단한 형태입니다.
주로 한 줄로 표현 가능한 간단한 연산이나 반환에 사용됩니다.
코드를 더 읽기 쉽고 간결하게 만들어 줍니다.람다 함수 정의
(타입 매개변수1, 타입 매개변수2) => 반환값;
Dart
복사
(타입 매개변수1, 타입 매개변수2) => { 실행문 }
Dart
복사
(타입 매개변수1, 타입 매개변수2) => { return 반환값; }
Dart
복사
예시 코드
var multiply = (int a, int b) => a * b;
void main() {
print(multiply(3, 5)); // 출력: 15
}
Dart
복사
재귀 함수
함수 자기 자신을 호출하는 함수
재귀 함수는 문제를 해결하기 위해 자기 자신을 반복적으로 호출하는 프로그래밍 기법입니다.
•
복잡한 문제를 더 작은 동일한 형태의 문제로 나누어 해결할 수 있습니다.
•
주로 수학적 계산(팩토리얼, 피보나치 수열 등)이나 트리/그래프 순회에 사용됩니다.
•
종료 조건(base case)이 반드시 필요하며, 이는 재귀 호출을 멈추는 조건입니다.
주의사항1.
재귀 함수는 스택 메모리를 사용하므로 너무 깊은 재귀는 스택 오버플로우를 일으킬 수 있습니다.
2.
종료 조건이 없거나 잘못 설정되면 무한 재귀에 빠질 수 있습니다.
3.
때로는 반복문을 사용하는 것이 더 효율적일 수 있습니다.
재귀함수 예시코드 (팩토리얼)
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
void main() {
print(factorial(5)); // 출력: 120
}
Dart
복사







불가능
