디버깅, 람다식과 함수

허준호·2025년 6월 27일
0

dart 언어 공부

목록 보기
10/16
post-thumbnail

디버깅

컴퓨터 프로그램 개발 단계 중에 발생하는 시스템의 논리적인 오류나 비정상적 연산(버그)을 찾아내고 수정하는 작업 과정

필요한 이유

  • 디버깅은 소프트웨어가 올바르게 작동하는지 확인하는 데 필수적이다
  • 디버깅 하지 않을 시 소프트웨어가 오류를 발생하거나 제대로 작동하지 않을 수 있다

디버깅 기술

  1. 로깅: 코드가 실행되는 동안 발생하는 이벤트를 기록한다
    • print() 함수를 활용한다. 플러터에서는 debugPrint() 등을 활용한다
  2. 브레이크 포인트: 코드의 특정 지점에서 실행을 중지하는 데 사용된다
  3. 디버거: 디버깅을 도와주는 도구이다
  4. 스택 추적: 호출 스택을 추적하여 코드가 실행 중인 위치를 확인하는 데 사용할 수 있다

디버깅 팁

  • 작게 시작: 디버깅할 때 작은 문제부터 시작하는 것이 중요하다. 이렇게 하면 더 큰 문제로 넘어가기 전에 한 번에 한 가지 문제에 집중할 수 있다
  • 단순하게 유지: 디버깅할 때 코드를 단순하게 유지하는 것이 중요하다. 오류의 원인을 파악하기가 더 쉽다
  • 인내심 필요: 디버깅은 시간이 많이 걸릴 수 있으므로 인내심을 갖는 것이 중요하다

람다식

프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다

1급 객체

변수에 대입 가능한 객체를 1급 객체(first class object)라고 한다

ex) 값, 인스턴스, 함수

일반 함수 표현

반환형 함수명(매개변수) {
	return 반환문 // 반환타입이 void인 경우는 return문 없음
}

람다식 표현

함수명(매개변수) => 반환문 
// 블록 내부에 반환문만 존재하는 경우 블록은 생략 가능하다
// 함수명은 없어도 된다

함수를 값으로 전달

  • 함수의 매개변수로 함수를 전달할 수 있다
void printElement(int element) {
	print(element);
}

var list = [1, 2, 3];

1) list.forEach((e){})

2) list.forEach(printElement)

// 입력과 출력이 같은 경우 함수명만 작성할 수 있다. 1, 2 둘다 가능
// forEach는 void형이므로 return문이 올 수 없다!!

메서드와 함수의 차이

  • 메서드는 클래스에 속하고 클래스를 조작하기 위한 일종의 함수이다
  • 메서드는 이름이 있지만, 함수에게 이름은 중요하지 않다!!

함수형 프로그래밍

  • Dart는 객체지향 프로그래밍과 함수형 프로그래밍 특징을 모두 제공하는 멀티 패러다임 언어이다
  • 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하는 프로그래밍 패러다임이고 가변 데이터를 멀리하는 특징을 가진다

고계(higher-order, 고차) 함수

함수를 다루는 함수이며, 함수를 파라미터로 받는다는 뜻이다.

Dart의 고계 함수

  • where: 조건 필터링
  • map: 변환
  • forEach: 전체 순회
  • reduce: 하나씩 줄이기
  • fold: 하나씩 접기
  • any: 존재여부 확인

where

final items = [1, 2, 3, 4, 5];

for(var i = 0; i < items.length; i++) {
	if(items[i] % 2 == 0) {
		print(items[i]); // 짝수인 요소 출력: 2, 4
	}
}

items.where((e) => e % 2 == 0).forEach(print);
// where()는 주어진 조건에 맞는 요소만 남긴다.

map

final items = [1, 2, 3, 4, 5];

for(var i = 0; i < items.length; i++) {
	if(items[i] % 2 == 0) {
		print('숫자 ${items[i]}'); // 숫자 2, 숫자 4
	}
}

items.where((e) => e % 2 == 0).map((e) => '숫자 $e').forEach(print);
// map()은 원하는 형식으로 리스트의 요소를 변경할 수 있다

toList

  • Dart에서 함수형 프로그래밍을 지원하는 함수 대부분은 Iterable라는 타입을 반환한다
  • 따라서, List로 변환해서 사용해야 한다.
  • List 클래스는 Iterable 인터페이스를 구현하고 있다

toSet

  • 자료구조 Set으로 변환하는 함수이다
  • 중복을 허용하지 않으므로 중복 데이터를 제거할 수 있다

any

final items = [1, 2, 3, 4, 5];

var result = false;
for(var i = 0; i < items.length; i++) {
	if(items[i] % 2 == 0) {
		result = true;
		break;
	}
}
print(result) // true

items.any((e) => e % 2 == 0); // true
// 정해진 조건에 맞는 요소가 1개라도 존재하는 경우 true를 반환한다

reduce

final items = [1, 2, 3, 4, 5];

var maxResult = items[0];
for(var i = 1; i < items.length; i++) {
	maxResult = max(items[i], maxResult);
}
print(maxResult) // 5

items.reduce((v, e) => max(v, e)); // 5

// 입출력이 같기 때문에 items.reduce(max)로 축약 가능

직렬화 - List<객체>

json 구조

"collectionChartDataList": [
    {
      "collectionName": "collection1",
      "collectionSalePrice": [
        {
          "price": 58.25,
          "cvtDatetime": "2023-03-26T08:00:00"
        },
        {
          "price": 58.50,
          "cvtDatetime": "2023-03-26T08:00:10"
        }
      ]
    },
    {
      "collectionName": "collection2",
      "collectionSalePrice": [
        {
          "price": 58.75,
          "cvtDatetime": "2023-03-26T08:00:20"
        },
        {
          "price": 59.00,
          "cvtDatetime": "2023-03-26T08:00:30"
        }
      ]
    },
  ]

객체 리스트 toJson

class CollectionChartData {
  String collectionName;
  List<SalePrice>? collectionSalePrice;

  CollectionChartData({
    required this.collectionName,
    required this.collectionSalePrice,
  });

  Map<String, dynamic> toJson() {
    if (collectionSalePrice == null) {
      return {'collectionName': collectionName};
    }
    return {
      'collectionName': collectionName,
      'collectionSalePrice':
          collectionSalePrice?.map((e) => e.toJson()).toList(),
    };
  }

  
  
  String toString() {
    // TODO: implement toString
    return '{collectionName: $collectionName, collectionSalePrice: ${collectionSalePrice?.map((e) => e.toString())}}';
  }
}
  • 리스트 객체를 json 형식으로 변환할 때에는, map() 함수를 이용해서 각 객체를 toJson()으로 처리해준 다음에 리스트로 바쒀서 변환해야 한다
  • 만일 json 파일에서 키가 존재하지 않는 경우, json 변환 시에 해당 키가 포함되지 않도록 처리해야 한다

객체 리스트 fromJson

CollectionChartData.fromJson(Map<String, dynamic> json)
    : collectionName = json['collectionName'],
      collectionSalePrice =
          (json['collectionSalePrice'] as List<dynamic>?)
              ?.map((e) => SalePrice.fromJson(e))
              .toList();
  • json 파일에서의 객체 리스트를 Dart에서 사용하기 위해서는 먼저 as List? 형으로 강제해야 한다. null 값이 존재할 수 있으므로 nullable 처리해야 한다
  • 각 요소를 fromJson()을 통해 해당 객체로 변환한 후에 리스트로 변경한다
profile
후추랑 소금 좋아하는 개발자

0개의 댓글