๐Ÿ“Œ๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜ Chapter 4. ์ŠคํŠธ๋ฆผ ์†Œ๊ฐœ

๋ชจ๊น…ยท2023๋…„ 12์›” 13์ผ
0
  • SELECT name FROM dishes WHERE calorie < 400์™€ ๊ฐ™์€ SQL์ฒ˜๋Ÿผ ์š”๋ฆฌ์˜ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ํ•„ํ„ฐ๋งํ•  ๊ฒƒ์ธ์ง€ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์ฒ˜๋Ÿผ ์ปฌ๋ ‰์…˜์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ??
  • ๋˜ํ•œ ๋งŽ์€ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ปค๋‹ค๋ž€ ์ปฌ๋ ‰์…˜์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?
    ์„ฑ๋Šฅ์„ ๋†’์ด๋ ค๋ฉด ๋ณ‘๋ ฌ๋กœ ์ปฌ๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ท€์ค‘ํ•œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ ๏ผŒํŽธ๋ฆฌํ•œ ์‚ถ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ” ์–ธ์–ด ์„ค๊ณ„์ž๋“ค์€ ์–ด๋–ค ๊ฒฐ์ •์„ ๋‚ด๋ ธ์„๊นŒ? ์ด ์งˆ๋ฌธ์˜ ๋‹ต์€ ์ŠคํŠธ๋ฆผ์ด๋‹ค.

๐Ÿ“– 4.1 ์ŠคํŠธ๋ฆผ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • ์ŠคํŠธ๋ฆผ์€ ์ž๋ฐ” 8APl์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด๋‹ค. ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ์„ ์–ธํ˜• (์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž„์‹œ ๊ตฌํ˜„ ์ฝ”๋“œ ๋Œ€์‹  ์งˆ์˜๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค)์œผ๋กœ ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋‹จ ์ŠคํŠธ๋ฆผ์ด ๋ฐ์ดํ„ฐ ์ปฌ๋ ‰์…˜ ๋ฐ˜๋ณต์„ ๋ฉ‹์ง€๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ž.
  • ๋˜ํ•œ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•˜๋ฉด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ €์นผ๋กœ๋ฆฌ์˜ ์š”๋ฆฌ๋ช…์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์นผ๋กœ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์š”๋ฆฌ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ž๋ฐ” 7 ์ฝ”๋“œ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” 8์˜ ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•ด์„œ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค.

  • ์ž๋ฐ” 7
List<Dish> lowCaloricDishes = new ArrayList<>(); 
for(Dish dish: menu) {  // ๋ˆ„์ ์ž๋กœ ์š”์†Œ ํ•„ํ„ฐ๋ง
	if(dish.getCalories() < 400) { 
		lowCaloricDishesโ€ขadd(dish);
	}
}

Collections.sort(lowCaloricDishes, new Comparator<Dish>() { // ์ต๋ช… ํด๋ž˜์Šค๋กœ ์š”๋ฆฌ ์ •๋ ฌ
	public int compare(Dish dish1, Dish dish2) {
	return Integer.compare(dish1.getCalories(), dish2.getCalories());
});

List<String> lowCaloricDishesName = new ArrayList<>(); 
for(Dish dish: lowCaloricDishes) {
	lowCaloricDishesName.add(dish.getName()); // ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์š”๋ฆฌ ์ด๋ฆ„ ์„ ํƒ
}

์œ„ ์ฝ”๋“œ์—์„œ๋Š” lowCaloricDishes๋ผ๋Š” โ€˜๊ฐ€๋น„์ง€ ๋ณ€์ˆ˜'๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฆ‰, lowCaloricDishes๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ๋งŒ ํ•˜๋Š” ์ค‘๊ฐ„ ๋ณ€์ˆ˜๋‹ค. ์ž๋ฐ” 8์—์„œ ์ด๋Ÿฌํ•œ ์„ธ๋ถ€ ๊ตฌํ˜„์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์ž๋ฐ” 8
import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.toList;

List<String> lowCaloricDishesName = 
	menu.stream()
		.filter(d -> d.getCalories() < 400) // 400์นผ๋กœ๋ฆฌ ์ดํ•˜์˜ ์š”๋ฆฌ ์„ ํƒ
		.sorted(comparing(Dish::getCalories)) // ์นผ๋กœ๋ฆฌ๋กœ ์š”๋ฆฌ ์ •๋ ฌ
		.map(Dish::getName) // ์š”๋ฆฌ๋ช…์ถ”์ถœ 
		.collect(toList()); // ๋ชจ๋“  ์š”๋ฆฌ๋ช…์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ

stream()์„ parallelStream()์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

List<String> lowCaloricDishesName = 
	menu.parallelStream()
		.filter(d -> d.getCalories() < 400)
		.sorted(comparing(Dishes::getCalories))
		.map(Dish:igetName)
		.collect(toList());

์„ฑ๋Šฅ์€ 7์žฅ์—์„œ!

  • ์ŠคํŠธ๋ฆผ์˜ ์žฅ์ !
  1. ์„ ์–ธํ˜•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ฆ‰๏ผŒ๋ฃจํ”„์™€ if ์กฐ๊ฑด๋ฌธ ๋“ฑ์˜ ์ œ์–ด ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘์„ ๊ตฌํ˜„ํ• ์ง€ ์ง€์ •ํ•  ํ•„์š” ์—†์ด โ€˜์ €์นผ๋กœ๋ฆฌ์˜ ์š”๋ฆฌ๋งŒ ์„ ํƒํ•˜๋ผโ€™ ๊ฐ™์€ ๋™์ž‘์˜ ์ˆ˜ํ–‰์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 3์žฅ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์„ ์–ธํ˜• ์ฝ”๋“œ์™€ ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ณ€ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ์‰ฝ๊ฒŒ ๋Œ€์‘ํ• ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ด์šฉํ•ด์„œ ์ €์นผ๋กœ๋ฆฌ ๋Œ€์‹  ๊ณ ์นผ๋กœ๋ฆฌ์˜ ์š”๋ฆฌ๋งŒ ํ•„ํ„ฐ๋งํ•˜๋Š” ์ฝ”๋“œ๋„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ• ์ˆ˜ ์žˆ๋‹ค.

  2. filter, sorted, map, collect ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋นŒ๋”ฉ ๋ธ”๋ก ์—ฐ์‚ฐ์„ ์—ฐ๊ฒฐํ•ด์„œ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•ด๋„ ์—ฌ์ „ํžˆ ๊ฐ€๋…์„ฑ๊ณผ ๋ช…ํ™•์„ฑ์ด ์œ ์ง€๋œ๋‹ค.

์ž๋ฐ”8์˜ ์ŠคํŠธ๋ฆผ API์˜ ํŠน์ง• ์š”์•ฝ
โ€ข ์„ ์–ธํ˜• : ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค.
โ€ข ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ์Œ : ์œ ์—ฐ์„ฑ์ด ์ข‹์•„์ง„๋‹ค.
โ€ข ๋ณ‘๋ ฌํ™” : ์„ฑ๋Šฅ์ด์ข‹์•„์ง„๋‹ค.

์•ž์œผ๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ œ!

List<Dish> menu = Arrays.asList(
	new Dish("pork", false, 800, Dish.Type.MEAT), 
	new Dish("beef", false, 700, Dish.Type.MEAT), 
	new Dish("chicken", false, 400, Dish.Type.MEAT), 
	new Dish("french fries", true, 530, Dish.Type.OTHER), 
	new Dish("rice", true, 350, Dish.Type.OTHER), 
	new Dish("season fruit", true, 120, Dish.Type.OTHER), 
	new Dish("pizza", true, 550, Dish.Type.OTHER), 
	new Dish("prawns", false, 300, Dish.Type.FISH), 
	new Dish("salmon", false, 450, Dish.Type.FISH)
);

Dish๋Š” ๋ถˆ๋ณ€ํ˜• ํด๋ž˜์Šค๋‹ค.

public class Dish
	private final String name; 
	private final boolean vegetarian; 
	private final int calories;
	private final Type type;
    
	public Dish(String name, boolean vegetarian, int calories, Type type) { 
		this.name = name; 
		this.vegetarian = vegetarian; 
		this.calories = calories; 
		this.type = type;
	}
    
	public String getName() { 
		return name;
	}
    
	public boolean isVegetarian() { 
		return vegetarian;
	}
    
	public int getCalories() {
		return calories;
	}
    
	public Type getType() { 
		return type;
	}
    
	@Override
	public String toString() { 
		return name;
	}
    
	public enum Type { MEAT, FISH, OTHER }
}

๐Ÿ“– 4.2 ์ŠคํŠธ๋ฆผ ์‹œ์ž‘ํ•˜๊ธฐ

์ŠคํŠธ๋ฆผ์ด๋ž€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•˜๋„๋ก ์†Œ์Šค์—์„œ ์ถ”์ถœ๋œ ์—ฐ์†๋œ ์š”์†Œ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค

  • ์—ฐ์†๋œ ์š”์†Œ : ์ปฌ๋ ‰์…˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ŠคํŠธ๋ฆผ์€ ํŠน์ • ์š”์†Œ ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์—ฐ์†๋œ ๊ฐ’ ์ง‘ํ•ฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    ์ปฌ๋ ‰์…˜์€ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋ฏ€๋กœ ์ปฌ๋ ‰์…˜์—์„œ๋Š” (์˜ˆ๋ฅผ ๋“ค์–ด ArrayList๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด LinkedList๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ) ์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์˜ ๋ณต์žก์„ฑ๊ณผ ๊ด€๋ จ๋œ ์š”์†Œ ์ €์žฅ ๋ฐ ์ ‘๊ทผ ์—ฐ์‚ฐ์ด ์ฃผ๋ฅผ ์ด๋ฃฌ๋‹ค. ๋ฐ˜๋ฉด ์ŠคํŠธ๋ฆผ์€ filter , sorted, map์ฒ˜๋Ÿผ ํ‘œํ˜„ ๊ณ„์‚ฐ์‹์ด ์ฃผ๋ฅผ ์ด๋ฃฌ๋‹ค. ์ฆ‰, ์ปฌ๋ ‰์…˜์˜ ์ฃผ์ œ๋Š” ๋ฐ์ดํ„ฐ๊ณ  ์ŠคํŠธ๋ฆผ์˜ ์ฃผ์ œ๋Š” ๊ณ„์‚ฐ์ด๋‹ค.

  • ์†Œ์Šค ๏ผš์ŠคํŠธ๋ฆผ์€ ์ปฌ๋ ‰์…˜, ๋ฐฐ์—ด, I/O ์ž์› ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ œ๊ณต ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค. ์ฆ‰, ๋ฆฌ์ŠคํŠธ๋กœ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค๋ฉด ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ์™€ ๊ฐ™์€์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ : ์ŠคํŠธ๋ฆผ์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์—ฐ์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•œ ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด filter, map, reduce, find , match, sort ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋˜๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ŠคํŠธ๋ฆผ์€ ๋‘๊ฐ€์ง€ ์ฃผ์š” ํŠน์ง•์ด ์žˆ๋‹ค.

  • ํŒŒ์ดํ”„๋ผ์ด๋‹ ๏ผš๋Œ€๋ถ€๋ถ„์˜ ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ์€์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•ด์„œ ์ปค๋‹ค๋ž€ํŒŒ์ดํ”„ ๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ŠคํŠธ๋ฆผ ์ž์‹ ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ๋‚ด๋ถ€ ๋ฐ˜๋ณต : ๋ฐ˜๋ณต์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๋‹ฌ๋ฆฌ ์ŠคํŠธ๋ฆผ์€ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์ง€์›ํ•œ๋‹ค.

์˜ˆ์ œ๋กœ ํ™•์ธํ•ด๋ณด์ž.

import static java.util.stream.Collectors.toList;

List<String> threeHighCaloricDishNames =
	menu.stream() // ๋ฉ”๋‰ด(์š”๋ฆฌ๋ฆฌ์ŠคํŠธ)์—์„œ ์ŠคํŠธ๋ฆผ์„ ์–ป๋Š”๋‹ค.
		.filter(dish -> dish.getCalories() > 300) // ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ์‚ฐ๋งŒ๋“ค๊ธฐ. ์ฒซ๋ฒˆ์งธ๋กœ ๊ณ ์นผ๋กœ๋ฆฌ์š”๋ฆฌ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค.
		.map(Dish::getName) // ์š”๋ฆฌ๋ช…์ฃผ์ถœ
		.limit(3) // ์„ ์ฐฉ์ˆœ ์„ธ๊ฐœ๋งŒ ์„ ํƒ
		.collect(toList(); // ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅ
        
System.out.println(threeHighCaloricDishNames); // ๊ฒฐ๊ณผ๋Š” [pork, beef, chicken]์ด๋‹ค.
  • ์šฐ์„  ์š”๋ฆฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” menu์— stream ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ŠคํŠธ๋ฆผ์„ ์–ป์—ˆ๋‹ค.
    ์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ์š”๋ฆฌ ๋ฆฌ์ŠคํŠธ(๋ฉ”๋‰ด)๋‹ค. ๋ฐ์ดํ„ฐ ์†Œ์Šค๋Š” ์—ฐ์†๋œ ์š”์†Œ๋ฅผ ์ŠคํŠธ๋ฆผ์— ์ œ๊ณตํ•œ๋‹ค.
  • ๋‹ค์Œ์œผ๋กœ ์ŠคํŠธ๋ฆผ์— filter, map, limit, collect๋กœ ์ด์–ด์ง€๋Š” ์ผ๋ จ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ ์šฉํ•œ๋‹ค. collect๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์—ฐ์‚ฐ์€ ์„œ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์€ ์†Œ์Šค์— ์ ์šฉํ•˜๋Š” ์งˆ์˜ ๊ฐ™์€ ์กด์žฌ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ collect ์—ฐ์‚ฐ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค(collect๋Š” ์ŠคํŠธ๋ฆผ์ด ์•„๋‹ˆ๋ผ List๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค). ๋งˆ์ง€๋ง‰์— collect๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” menu์—์„œ ๋ฌด์—‡๋„ ์„ ํƒ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋„ ์—†๋‹ค.
    ์ฆ‰, collect๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ์ „๊นŒ์ง€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์ €์žฅ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“– 4.3 ์ŠคํŠธ๋ฆผ๊ณผ ์ปฌ๋ ‰์…˜

  • ๋ฐ์ดํ„ฐ๋ฅผ ์–ธ์ œ ๊ณ„์‚ฐํ•˜๋Š๋ƒ๊ฐ€ ์ปฌ๋ ‰์…˜๊ณผ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋‹ค. ์ปฌ๋ ‰์…˜์€ ํ˜„์žฌ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. ์ฆ‰, ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ์š”์†Œ๋Š” ์ปฌ๋ ‰์…˜์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด ์ŠคํŠธ๋ฆผ์€ ์ด๋ก ์ ์œผ๋กœ ์š”์ฒญํ•  ๋•Œ๋งŒ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณ ์ •๋œ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.
    ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฐ’๋งŒ ์ŠคํŠธ๋ฆผ์—์„œ ์ถ”์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ŠคํŠธ๋ฆผ์€ ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•œ๋‹ค. ๋˜ํ•œ ์ŠคํŠธ๋ฆผ์€ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๊ฐ™๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งŒ ๊ฐ’์„ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด ์ปฌ๋ ‰์…˜์€ ์ ๊ทน์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
    ์†Œ์ˆ˜ ์˜ˆ์ œ์— ์ด๋ฅผ ์ ์šฉํ•ด๋ณด์ž. ์ปฌ๋ ‰์…˜์€ ๋์ด ์—†๋Š” ๋ชจ๋“  ์†Œ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋ ค ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ์ƒˆ๋กœ์šด ์†Œ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์ถ”๊ฐ€ํ•˜๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•  ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ตญ ์†Œ๋น„์ž๋Š” ์˜์›ํžˆ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

4.3.1 ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ณต์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ŠคํŠธ๋ฆผ๋„ ํ•œ ๋ฒˆ๋งŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰๏ผŒํƒ์ƒ‰๋œ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š” ์†Œ๋น„๋œ๋‹ค.
๋ฐ˜๋ณต์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•œ ๋ฒˆ ํƒ์ƒ‰ํ•œ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

Lis<String> title = Arrays.asList("]ava8", "In", "Action");
Stream<String> s = title.stream();
s.forEach(System.out::println); // title์˜ ๊ฐ ๋‹จ์–ด๋ฅผ ์ถœ๋ ฅ
s.forEach(System.out::println); 

์ŠคํŠธ๋ฆผ์€ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์ž!

์ปฌ๋ ‰์…˜๊ณผ ์ŠคํŠธ๋ฆผ์˜ ๋˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์€ ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ด๋‹ค.

4.3.2 ์™ธ๋ถ€ ๋ฐ˜๋ณต๊ณผ ๋‚ด๋ถ€ ๋ฐ˜๋ณต

์ปฌ๋ ‰์…˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค(์˜ˆ๋ฅผ ๋“ค๋ฉด for-each ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ). ์ด๋ฅผ ์™ธ๋ถ€ ๋ฐ˜๋ณต ์ด๋ผ๊ณ  ํ•œ๋‹ค.
๋ฐ˜๋ฉด ์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” (๋ฐ˜๋ณต์„ ์•Œ์•„์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ ์ŠคํŠธ๋ฆผ๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด์ฃผ๋Š”) ๋‚ด๋ถ€ ๋ฐ˜๋ณต ์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•จ์ˆ˜์— ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• ์ง€๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

// ์ปฌ๋ ‰์…˜: for-each ๋ฃจํ”„๋ฅผ ์ด์šฉํ•˜๋Š” ์™ธ๋ถ€ ๋ฐ˜๋ณต
List<String> names = new ArrayList<>();
for (Dish dish: menu) { 
	names.add(dish.getName()); 
}

for-each ๊ตฌ๋ฌธ์€ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.
๋˜ํ•œ, iterator ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์‰ฝ๊ฒŒ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ปฌ๋ ‰์…˜: ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆจ๊ฒจ์กŒ๋˜ ๋ฐ˜๋ณต์ž๋ฅผ ์‚ฌ์šฉํ•œ ์™ธ๋ถ€ ๋ฐ˜๋ณต
List<String> names = new ArrayList<>(); 
Iterator<String> iterator = menu.iterator();
while(iterator.hasNext()) // ๋ช…์‹œ์  ๋ฐ˜๋ณต
	Dish dish = iterator.next(); 
	names.add(dish.getName());	
}
// ์ŠคํŠธ๋ฆผ: ๋‚ด๋ถ€ ๋ฐ˜๋ณต
List<String> names = menu.stream()
						 .map(Dish::getName)
                         .collect(toList());

๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ ~ํ•ด! ๋ผ๊ณ  ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์‹ ๊ฒฝ ์“ธ๊ฒŒ ์—†๋‹ค. ๋ฐ˜๋ฉด์— ์™ธ๋ถ€ ๋ฐ˜๋ณต์€ ํ•˜๋‚˜ํ•˜๋‚˜ ๋ช…์‹œํ•ด ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํž˜๋“ค๋‹ค.(์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณ‘๋ ฌ์„ฑ์˜ synchronized๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ—˜๋‚œํ•ด์ง„๋‹ค..)

ํ€ด์ฆˆ 4-1 ์™ธ๋ถ€ ๋ฐ˜๋ณต vs ๋‚ด๋ถ€ ๋ฐ˜๋ณต

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด์ž!

List<String> highCaloricDishes = new ArrayList<>();
Iterator<String> iterator = menu.iterator(); 
while(iterator.hasNext()) {
	Dish dish = iterator.next(); 
	if(dish.getCalories() > 300) {
		highCaloricDishes.add(dish.getName()) ;
	}
}

์ •๋‹ต

List<String> highCaloricDishes = menu.stream()	
					.filter(Dish::getCalories())
                    .map(Dish::getName())
                    .collect(toList());

๐Ÿ“– 4.4 ์ŠคํŠธ๋ฆผ ์—ฐ์‚ฐ

์ŠคํŠธ๋ฆผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ฐ์‚ฐ์„ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
1. ์ค‘๊ฐ„์—ฐ์‚ฐ : ์—ฐ๊ฒฐ๋˜์–ด ํŒŒ์ดํ”„๋ผ์ธ์„ ํ˜•์„ฑํ•œ๋‹ค.
2. ์ตœ์ข…์—ฐ์‚ฐ : ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ์— ๋‹ซ๋Š”๋‹ค.

4.4.1 ์ค‘๊ฐ„ ์—ฐ์‚ฐ

  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ ๋‹ค๋ฅธ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์—ฐ๊ฒฐํ•ด์„œ ์งˆ์˜๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.
  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์˜ ์ค‘์š”ํ•œ ํŠน์ง•์€ ๋‹จ๋ง ์—ฐ์‚ฐ์„์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์— ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์•„๋ฌด ์—ฐ์‚ฐ๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ, ์ฆ‰ ๊ฒŒ์œผ๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ํ•ฉ์นœ ๋‹ค์Œ์— ํ•ฉ์ณ์ง„ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์ตœ์ข… ์—ฐ์‚ฐ์œผ๋กœ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4.4.2 ์ตœ์ข… ์—ฐ์‚ฐ

์ตœ์ข… ์—ฐ์‚ฐ์€ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•œ๋‹ค.

ํ€ด์ฆˆ 4-2. ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ

๋‹ค์Œ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์„ ๊ตฌ๋ณ„ํ•˜์‹œ์˜ค.
long count = menu.stram()
				 .filter(d - > d.getCalories() > 300)
				 .distinct()
				 .limit(3)
				 .count();

์ •๋‹ต
์ค‘๊ฐ„ ์—ฐ์‚ฐ : filter, distinct, limit
์ตœ์ข… ์—ฐ์‚ฐ : count

4.4.3 ์ŠคํŠธ๋ฆผ ์ด์šฉํ•˜๊ธฐ

์ŠคํŠธ๋ฆผ ์ด์šฉ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐ€์ง€๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข ์งˆ์˜๋ฅผ ์ˆ˜ํ–‰ํ•  (์ปฌ๋ ‰์…˜๊ฐ™์€) ๋ฐ์ดํ„ฐ ์†Œ์Šค
โ€ข ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ค‘๊ฐ„ ์—ฐ์‚ฐ ์—ฐ๊ฒฐ
โ€ข ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ์ตœ์ข… ์—ฐ์‚ฐ

-> ๋” ๋งŽ๋‹ค!

๐Ÿ“– 4.6 ๋งˆ์น˜๋ฉฐ

  • ์ŠคํŠธ๋ฆผ์€ ์†Œ์Šค์—์„œ ์ถ”์ถœ๋œ ์—ฐ์†์š”์†Œ๋กœ, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์—ฐ์‚ฐ์„ ์ง€์›ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์€ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์ง€์›ํ•œ๋‹ค. ๋‚ด๋ถ€ ๋ฐ˜๋ณต์€ filter, map, sorted ๋“ฑ์˜ ์—ฐ์‚ฐ์œผ๋กœ๋ฐ˜๋ณต์„ ์ถ”์ƒํ™”ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์—๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์ด ์žˆ๋‹ค.
  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ filter์™€ map์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค. ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์œผ๋กœ๋Š” ์–ด๋–ค ๊ฒฐ๊ณผ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
  • forEach๋‚˜ count์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ฒ˜๋ฆฌํ•ด์„œ ์ŠคํŠธ๋ฆผ์ด ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ตœ์ข… ์—ฐ์‚ฐ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋Š” ์š”์ฒญํ•  ๋•Œ ๊ฒŒ์œผ๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋œ๋‹ค.





์ฐธ๊ณ ์ž๋ฃŒ)
๋ณธ ํฌ์ŠคํŒ…์€ ๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

profile
๋ฉˆ์ถ”์ง€ ์•Š๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€