Search
Duplicate
moon
sun

함수

함수

입력, 연산, 반환 구조로 특정 작업을 수행하는 코드의 모음

특징

코드의 재사용성 향상
프로그램의 구조화 및 모듈화
유지보수의 용이성
코드의 가독성 향상

함수

함수 정의
함수 호출
매개변수
위치 매개변수
이름 매개변수
필수 매개변수 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
복사