[Dart] 함수형 프로그래밍

devvace ㅣ 2022. 12. 8. 21:32

다음의 예제를 살펴보자.

void main() {
	List<String> blackPink = ['로제', '지수', '리사', '제니'];

	final newBlackPink = blackPink.map((x) {
		return '블랙핑크 $x';
	});
}

'=>' 키워드를 사용해서 더 간단하게 작성해보면 다음과 같이 작성할 수 있다.

final newBlackPink2 = blackPink.map((x => '블랙핑크 $x');

 

Map에서도 다음과 같이 사용할 수 있다.

String number = 13579;
final parsed = number.split('').map((x) => '$x.jpg').toList();
print(parsed); // [1.jpg, 3.jpg, 5.jpg, 7.jpg, 9.jpg]
void main() {
	Map<String, String> harryPotter = {
		'Harry Potter': '해리포터',
		'Ron Weasley': '론 위즐리',
		'Hermione Granger': '헤르미온느 그레인저'
	};

	// map to map
	harryPotter.map(
		(key, value) => MapEntry(
			'Harry Potter Character $key', 
			'해리포터 케릭터 $value',
		),
	);

	print(harryPotter);
	print(result);
}

 

# where

where 키워드를 사용하면 원래 리스트를 변경하지 않고, 조건에 맞는 새로운 리스트를 가져올 수 있다.

void main() {
	List<Map<String, String>> people = [
		{
			'name': '로제',
			'group': '블랙핑크',
		},
		{
			'name': '지수',
			'group': '블랙핑크',
		},
		{
			'name': 'RM',
			'group': 'BTS',
		},
		{
			'name': '뷔',
			'group': 'BTS',
		},
	];

	print(people);
	final blackPink = people.where((x) => x['group'] == '블랙핑크');
	print(blackPink)
}

 

# reduce

void main() {
	List<int> numbers = [
		1,
		3,
		5,
		7,
		9,
	];

	numbers.reduce((prev, next){
		return prev + next;
	});

	// 더 간단하게
	// numbers.reduce((prev, next) => prev + next);
}

※ reduce를 사용하기 위해서는 리스트 내 타입과 리턴 타입이 일정해야 한다.

 

# fold

- reduce와 달리 리스트 내 타입이 일정하지 않아도 된다.

- 위 기능을 수행하기 위해선 'fold<T>'에 리턴 타입을 지정해주면 된다.

List<int> numbers = [1, 3, 5, 7, 9];
final sum = numbers.fold<int>(0, (prev, next) => prev + next);

 

# cascading operator

- '...' 키워드를 사용한다.

- 리스트 안에 리스트 안 값들을 펼쳐서 넣을 수 있다.

void main() {
	List<int> even = [
		2,
		4,
		6,
		8,
	];
	
	List<int> odd = [
		3,
		5,
		7,
		9,
	];

	print([...even, ...odd]);
}

 

# Json → Class

void main() {
	List<Map<String, String>> people = [
		{
			'name': '로제',
			'group': '블랙핑크',
		},
		{
			'name': '지수',
			'group': '블랙핑크',
		},
		{
			'name': 'RM',
			'group': 'BTS',
		},
		{
			'name': '뷔',
			'group': 'BTS',
		},
	];

	final parsedPeople = people.map(
		(x) => Person(
			name: x['name'], 
			group: x['group'],
		),
	).toList();
}

class Person {
	final String name;
	final String group;

	Person({
		required this.name,
		required this.group,
	});

	@override
	String toString() {
		return 'Person(name:$name, group:$group)';
	}
}

 

함수형 프로그래밍을 잘 사용하면, 코드 라인 수를 줄일 수 있고 효율적인 코드를 작성할 수 있는데, 반대로 가독성이 낮아져서 유지보수하기 힘든 코드가 작성될 수 있으니 주의해야 한다.

회사 별, 팀 별로 코드 컨벤션을 잘 작성하면 이러한 부분들을 많이 커버할 수 있다.