[TIL] 2025-01-16_ํ‚ค์˜ค์Šคํฌ

Yuriยท2025๋…„ 1์›” 16์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
30/59
post-thumbnail

๐Ÿ”ซ ํ‚ค์˜ค์Šคํฌ ๊ณผ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•, ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์ ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

1. BigDecimal.stripTrailingZeros()

์‚ฌ์šฉ์ž ์œ ํ˜•์˜ Enum ์ •์˜ ๋ฐ ๊ฐ ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋”ฐ๋ฅธ ํ• ์ธ์œจ ์ ์šฉ
์ฃผ๋ฌธ ์‹œ, ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋งž๋Š” ํ• ์ธ์œจ ์ ์šฉํ•ด ์ด ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•˜๋Š” discount ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

โ–ถ๏ธŽ ๊ธฐ์กด ์ฝ”๋“œ

public BigDecimal discount(BigDecimal price) {
    return price.multiply(BigDecimal.valueOf(100 - discountPercent)
                .divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
}

์ด ๊ธˆ์•ก์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ฐ ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๋”ฐ๋ฅธ ํ• ์ธ์œจ(discountPercent)์„ ์ ์šฉํ•œ ๊ธˆ์•ก์„ ์†Œ์ˆ˜์  2์ž๋ฆฌ ๋ฏธ๋งŒRoundingMode.DOWN(๋‚ด๋ฆผ)์œผ๋กœ ์Šค์ผ€์ผ๋งํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

โ–ถ๏ธŽ ์‹คํ–‰ ๊ฒฐ๊ณผ

ํ• ์ธ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” '์ผ๋ฐ˜' ์œ ํ˜• ์„ ํƒ ์‹œ, ๊ธˆ์•ก์ด 8.900 ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ 0์ด ๋ถ™์–ด์„œ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฆฌํ„ด ํƒ€์ž…์ธ BigDecimal์ด ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•œ๋‹ค.

stripTrailingZeros() ๋Š” BigDecimal์˜ ๋ฉ”์„œ๋“œ๋กœ, ์ˆซ์ž์ƒ์œผ๋กœ ๊ฐ’์ด ๋™์ผํ•˜์ง€๋งŒ ํ‘œํ˜„์—์„œ ํ›„ํ–‰์˜ 0์ด ์ œ๊ฑฐ๋œ BigDecimal์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

โ–ถ๏ธŽ ์ˆ˜์ • ์ฝ”๋“œ

public BigDecimal discount(BigDecimal price) {
    return price.multiply(BigDecimal.valueOf(100 - discountPercent)
                .divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN))
                .stripTrailingZeros();
}

โ–ถ๏ธŽ ์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ‘‰ stripTrailingZeros()์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์†Œ์ˆ˜์  ์•„๋ž˜์˜ ๋ถˆํ•„์š”ํ•œ 0์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2. stream VS Collection

์ปฌ๋ ‰์…˜์€ ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ, ์ŠคํŠธ๋ฆผ์€ ์ž๋ฐ” 8๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ปฌ๋ ‰์…˜์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

forEach()

์—ฐ์†๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ณต๋ฌธ forEach()๊ฐ€ ์žˆ๋‹ค.
์ž๋ฐ”์—์„œ ์—ฐ์†๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ปฌ๋ ‰์…˜๊ณผ ์ŠคํŠธ๋ฆผ ๋‘˜ ๋‹ค forEach๋ฅผ ์ง€์›ํ•œ๋‹ค.

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ชจ๋“  ๋ฉ”๋‰ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” printCart()๋ฅผ Collection.forEach() ์™€ stream.forEach() ๋กœ ์ž‘์„ฑํ•˜๊ณ  ๋น„๊ตํ•ด๋ณด์ž.

โ–ถ๏ธŽ stream.forEach()

cartItems.entrySet().stream().forEach(entry -> System.out.printf("%-21s | W %4.1f | %s%n",
                entry.getKey().getName(),
                BigDecimal.valueOf(entry.getValue() * entry.getKey().getPrice()),
                entry.getKey().getDescription()));

โ–ถ๏ธŽ Collection.forEach()

cartItems.forEach((key, value) -> System.out.printf("%-21s | W %4.1f | %s%n",
                key.getName(),
                BigDecimal.valueOf(value * key.getPrice()),
                key.getDescription()));

๐Ÿ’ก Map์€ Collection์„ ์ƒ์†๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์ƒ์†์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Collection์˜ default ๋ฉ”์„œ๋“œ์ธ stream()์„ ์“ธ ์ˆ˜ ์—†๋‹ค.โ‡’ Map.stream() ์€ ๋ถˆ๊ฐ€๋Šฅ
๋‹ค๋งŒ, Map์€ ๊ตฌ์กฐ์ƒ์˜ ์ฐจ์ด(Key-Value)๋งŒ ์žˆ์„ ๋ฟ ์—ญํ• ๊ณผ ๊ธฐ๋Šฅ์ด Collection๊ณผ ์œ ์‚ฌํ•˜๋ฏ€๋กœ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ฐ™์ด ๋ฌถ์—ฌ์žˆ๋‹ค.

๐Ÿ˜… ์œ„์˜ ๋‘ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ stream().forEach()๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—๋Š” IDE๊ฐ€ forEach()๋กœ ๋Œ€์ฒดํ•˜๋ผ๊ณ  ๊ถŒํ•œ๋‹ค.

Collection.forEach()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  1. ์ˆœ์„œ ๋ณด์žฅ: stream์˜ ๊ฒฝ์šฐ, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ(parallelStream)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑ๋œ stream์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. Exception: Collection์˜ forEach์˜ ๊ฒฝ์šฐ ์ˆœํšŒ ์ค‘ ๋Œ€์ƒ collection์˜ ๊ฐ’์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด ๋ฐ”๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
    Stream์€ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ „๋ถ€ ์ˆœํšŒํ•œ ํ›„์— Exception์„ ๋˜์ง€๋ฉฐ, ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœํšŒํ•œ ํ›„ Exception์„ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์—ฐ์‚ฐ์„ ์ˆœํšŒ๊ฐ€ ๋๋‚  ๋•Œ ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.

์ •๋ฆฌ

๊ฐ€๋Šฅํ•˜๋ฉด stream.forEach()๋ณด๋‹ค collection.forEach()๋ฅผ ์‚ฌ์šฉํ•˜์ž.

stream.filter() vs Collection.removeIf()

์ด๋ฒˆ์—๋Š” ๊ธฐ์กด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ํŠน์ • ๋ฉ”๋‰ด ๋นผ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

โ–ถ๏ธŽ stream.filter()

โ–ถ๏ธŽ Collection.removeIf()

๐Ÿ‘‰ ํ•˜์ด๋ผ์ดํŠธ๋œ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, removeIf()๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ํ•œ ์ค„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โž•) removeIf() ๋œฏ์–ด ๋ณด๊ธฐ

Collection์ด ์ œ๊ณตํ•˜๋Š” default ๋ฉ”์„œ๋“œ์ด๊ณ , ํ•„ํ„ฐ๋ง ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค Predicate๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.
โ†’ Predicate: ๋งค๊ฐœ๊ฐ’์ด ์กฐ๊ฑด์— ๋งž๋Š”์ง€ ๋‹จ์ •ํ•˜์—ฌ boolean ๋ฐ˜ํ™˜
(= ๊ฒฐ๊ณผ๊ฐ€ boolean ์ธ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.)

forEach()์™€ removeIf() ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘ stream๋ณด๋‹ค Collection์ด ์ œ๊ณตํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹๋‹ค. (๋ฌผ๋ก , ๊ฐ€๋…์„ฑ์€ ๊ฐœ์ธ๋งˆ๋‹ค ์ฒด๊ฐ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.)

profile
์•ˆ๋…•ํ•˜์„ธ์š” :)

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