함수는 Dart에서 코드를 재사용하고 프로그램 구조를 명확하게 하기 위한 필수적인 요소입니다.
이 블로그 게시물에서는 Dart 함수의 기초부터 심화적인 개념까지, 다양한 종류와 활용법을 자세히 살펴보겠습니다.
1. 함수 정의
함수는 function 키워드를 사용하여 정의됩니다.
function functionName(parameter1, parameter2) {
// 함수 본문
}
- functionName: 함수 이름입니다. 함수를 호출할 때 사용됩니다.
- parameter1, parameter2: 함수의 매개변수입니다. 함수에 값을 전달하는 데 사용됩니다.
- // 함수 본문: 함수가 수행할 작업을 정의하는 코드 블록입니다.
예제
function greet(name) {
print("Hello, $name!");
}
greet("Bob"); // Hello, Bob! 출력
2. 함수 호출
함수를 호출하려면 함수 이름을 괄호 안에 작성하고, 매개변수 값을 쉼표로 구분하여 전달합니다.
function functionName(argument1, argument2);
예제
function calculateSum(num1, num2) {
return num1 + num2;
}
int result = calculateSum(10, 20);
print(result); // 30 출력
3. 함수 종류
Dart에서는 다양한 종류의 함수를 사용할 수 있습니다.
3.1 매개변수 없는 함수
매개변수 없이 값을 반환하는 함수입니다.
function getNumber() {
return 10;
}
int num = getNumber();
print(num); // 10 출력
3.2 선택적 매개변수
기본값을 가진 선택적 매개변수를 가질 수 있습니다.
function greet(name, [String? message]) {
print("Hello, $name!");
if (message != null) {
print(message);
}
}
greet("Bob"); // Hello, Bob! 출력
greet("Alice", "Nice to meet you!"); // Hello, Alice! Nice to meet you! 출력
3.3 명명된 매개변수
매개변수에 이름을 지정하여 함수를 호출할 때 순서를 상관없이 값을 전달할 수 있습니다.
function createUser({required String name, int age = 20}) {
print("User created: name: $name, age: $age");
}
createUser(name: "John", age: 30); // User created: name: John, age: 30 출력
3.4 다양한 반환값
함수는 여러 값을 반환하거나, void를 사용하여 아무것도 반환하지 않을 수 있습니다.
function calculate(int num1, int num2) {
int sum = num1 + num2;
int difference = num1 - num2;
return [sum, difference];
}
List<int> result = calculate(5, 3);
print(result[0]); // 8 출력
print(result[1]); // 2 출력
4. 익명 함수 (Lambda Expression)
간단한 작업을 수행하는 익명 함수를 사용할 수 있습니다.
int numbers = [1, 2, 3, 4, 5];
int evenSum = numbers.where((number) => number % 2 == 0).reduce((sum, number) => sum + number);
print(evenSum); // 6 출력
위 코드는 다음과 동일합니다.
int evenSum = numbers.where((number) {
return number % 2 == 0;
}).reduce((sum, number) {
return sum + number;
});
print(evenSum); // 6 출력
5. 고차 함수 (Higher-Order Function)
함수를 매개변수로 전달하거나 함수를 반환하는 함수를 고차 함수라고 합니다. 고차 함수는 코드를 더욱 유연하고 재사용 가능하게 만들 수 있도록 합니다.
예제
// 숫자 리스트를 제곱하여 새로운 리스트를 만드는 함수
List<int> squareList(List<int> numbers) {
return numbers.map((number) => number * number).toList();
}
// 위 함수를 사용하여 숫자 리스트를 제곱하고 출력
List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = squareList(numbers);
print(squaredNumbers); // [1, 4, 9, 16, 25] 출력
// 짝수만 제곱하여 새로운 리스트를 만드는 함수
List<int> squareEvenNumbers(List<int> numbers) {
return numbers.where((number) => number % 2 == 0).map((number) => number * number).toList();
}
// 위 함수를 사용하여 짝수만 제곱하고 출력
List<int> evenNumbers = [2, 4, 6, 8, 10];
List<int> squaredEvenNumbers = squareEvenNumbers(evenNumbers);
print(squaredEvenNumbers); // [4, 16, 36, 64, 100] 출력
고차 함수 활용 사례
- 콜백 함수 사용: 비동기 작업 처리, UI 이벤트 처리 등
- 데이터 처리 파이프라인 구축: 데이터 필터링, 변환, 집계 등
- 알고리즘 구현: 정렬, 검색, 최적화 등
6. 재귀 함수 (Recursive Function)
함수가 자기 자신을 호출하는 함수를 재귀 함수라고 합니다.
재귀 함수는 반복적인 작업을 처리하는 데 유용하게 사용됩니다.
예제
// 팩토리얼 계산 함수 (재귀 함수)
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int result = factorial(5);
print(result); // 120 출력
주의사항
- 재귀 함수는 무한 재귀에 빠지지 않도록 주의해야 합니다.
- 반복문을 사용할 수 있는 경우, 재귀 함수보다 반복문을 사용하는 것이 더 효율적일 수 있습니다.
7. 실제 코딩 예시
1. 로그인 시스템 구현
// 사용자 정보를 담는 클래스
class User {
String username;
String password;
User(this.username, this.password);
bool validateCredentials() {
// 실제 DB 또는 API 연동을 통해 사용자 인증 처리
return username == "admin" && password == "1234";
}
}
// 로그인 함수
bool login(String username, String password) {
User user = User(username, password);
return user.validateCredentials();
}
void main() {
String username = "alice";
String password = "12345";
if (login(username, password)) {
print("로그인 성공!");
} else {
print("로그인 실패. 아이디 또는 비밀번호를 확인하세요.");
}
}
2. 제품 목록 조회 및 필터링
// 제품 정보를 담는 클래스
class Product {
int id;
String name;
double price;
Product(this.id, this.name, this.price);
}
// 제품 목록 데이터 (임시 데이터)
List<Product> products = [
Product(1, "Smart Phone", 799.0),
Product(2, "Laptop", 1299.0),
Product(3, "Camera", 599.0),
Product(4, "Headphone", 99.0),
Product(5, "Watch", 299.0),
];
// 제품 목록 조회 함수
List<Product> getProducts() {
return products;
}
// 가격 기준으로 제품 목록 정렬 함수
List<Product> sortProductsByPrice(List<Product> products) {
products.sort((a, b) => a.price.compareTo(b.price));
return products;
}
// 특정 가격 이상의 제품만 조회하는 함수
List<Product> filterProductsByPrice(List<Product> products, double minPrice) {
return products.where((product) => product.price >= minPrice).toList();
}
void main() {
// 제품 목록 조회
List<Product> allProducts = getProducts();
print("전체 제품 목록:");
for (Product product in allProducts) {
print(product);
}
// 가격 기준으로 정렬된 제품 목록
List<Product> sortedProducts = sortProductsByPrice(allProducts);
print("\n가격 기준 정렬된 제품 목록:");
for (Product product in sortedProducts) {
print(product);
}
// 500원 이상의 제품 목록
List<Product> filteredProducts = filterProductsByPrice(allProducts, 500.0);
print("\n500원 이상 제품 목록:");
for (Product product in filteredProducts) {
print(product);
}
}
3. 간단한 웹 서버 구축 (using 'shelf' package)
import 'package:shelf/shelf.dart';
import 'package:shelf_static_handler/shelf_static_handler.dart';
// 웹 서버 실행 함수
void main() async {
// 정적 파일 제공 핸들러
final handler = const Pipeline()
.addMiddleware(logRequests())
.addHandler(getStaticHandler('public'));
// 웹 서버 시작
final server = await serve(handler, 'localhost', 8080);
print('Server listening on port ${server.port}');
}
// 요청 로그 기록 미들웨어
Middleware logRequests() {
return (request) async {
final response = await request.next();
print('${request.method} ${request.url}: ${response.statusCode}');
return response;
};
}
8. 함수 팁
- 함수를 사용하여 코드를 명확하고 이해하기 쉽게 작성하십시오.
- 함수를 적절한 크기로 분할하여 코드 관리를 용이하게 하십시오.
- 매개변수와 반환값을 명확하게 정의하십시오.
- 중복되는 코드는 함수로 추출하여 재사용하십시오.
- 함수 주석을 작성하여 함수의 작동 방식을 명확하게 설명하십시오.
9. 마무리
Dart 함수는 다양한 기능을 제공하며, 코드를 효율적으로 작성하고 프로그램 구조를 명확하게 하기 위한 중요한 도구입니다.
이 블로그 게시물을 통해 Dart 함수에 대한 이해를 높이고, 실제 개발에 활용하는 데 도움이 되었기를 바랍니다.
'Dart > Study' 카테고리의 다른 글
Dart에서 재귀 함수의 성능 향상: 메모이제이션 기법 (0) | 2024.07.12 |
---|---|
Dart에서 재귀 함수 활용하기: 심층 가이드 (2) | 2024.07.12 |
Dart에서 제어문 활용하기: 기초부터 심화까지 (0) | 2024.07.12 |
Dart에서 삼항 연산자 활용 완벽 가이드 (0) | 2024.07.12 |
Dart에서 연산자 완벽 가이드 (0) | 2024.07.12 |