본문 바로가기
Dart/Study

Dart에서 함수 활용하기: 기초부터 심화까지

by Maccrey Coding 2024. 7. 12.
728x90
반응형

함수는 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 함수에 대한 이해를 높이고, 실제 개발에 활용하는 데 도움이 되었기를 바랍니다.

728x90
반응형