hades

[๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜] ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™” ์ฝ”๋“œ ์ „๋‹ฌํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿƒ๐Ÿป‍โ™‚๏ธ ๊ธฐ๋ณธํ›ˆ๋ จ/Java

[๋ชจ๋˜ ์ž๋ฐ” ์ธ ์•ก์…˜] ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™” ์ฝ”๋“œ ์ „๋‹ฌํ•˜๊ธฐ

hades1 2024. 9. 3. 13:45

ํ•„์š”์„ฑ

๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋ฅผ ์ด์šฉํ•˜๋ฉด ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ํšจ๊ณผ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋ž€ ์•„์ง์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ๋ธ”๋ก์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋ณ€ํ™”ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€์‘ํ•˜๊ธฐ

์ฒซ ๋ฒˆ์งธ ์‹œ๋„ : ๋…น์ƒ‰ ์‚ฌ๊ณผ ํ•„ํ„ฐ๋ง

์‚ฌ๊ณผ ์žฌ๊ณ  ๋ชฉ๋ก์—์„œ ์ดˆ๋ก์ƒ‰ ์‚ฌ๊ณผ๋งŒ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public static List<Apple> filterGreenApples(List<Apple> inventory){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory){
        if (Color.GREEN.equals(apple.getColor())){
            result.add(apple);
        }
    }
    return result;
}

 

์œ„์˜ ๊ฒฝ์šฐ์—์„œ, ๋นจ๊ฐ„์ƒ‰ ์‚ฌ๊ณผ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์กฐ๊ฑด๋ฌธ์˜ ์ƒ‰๊น”์„ ๋ฐ”๊พผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ, ์ƒ‰๊น”์ด ํ›จ์”ฌ ๋” ๋‹ค์–‘ํ•  ๊ฒฝ์šฐ, ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋งค์šฐ ๋งŽ์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ข‹์€ ๊ทœ์น™์ด ์žˆ๋‹ค.

 

'๊ฑฐ์˜ ๋น„์Šทํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜๋ณต ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ์ฝ”๋“œ๋ฅผ ์ถ”์ƒํ™”ํ•œ๋‹ค.'

 

๋‘ ๋ฒˆ์งธ ์‹œ๋„ : ์ƒ‰์„ ํŒŒ๋ผ๋ฏธํ„ฐํ™”

์ƒ‰๊น”์„ ์ถ”์ƒํ™”ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public static List<Apple> filterApplesByColor(List<Apple> inventory, Color color){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory){
        if (color.equals(apple.getColor())){
            result.add(apple);
        }
    }
    return result;
}

 

์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด  ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

List<Apple> greenApples = filterApplesByColor(inventory, Color.GREEN);
List<Apple> redApples = filterApplesByColor(inventory, Color.RED);

 

๋น„์Šทํ•˜๊ฒŒ, ๋ฌด๊ฒŒ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•„ํ„ฐ๋งํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•œ๋‹ค.

public static List<Apple> filterApplesByWeight(List<Apple> inventory, int weight){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory){
        if (apple.getWeight() > weight){
            result.add(apple);
        }
    }
    return result;
}

 

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

 

์„ธ ๋ฒˆ์งธ ์‹œ๋„ : ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์†์„ฑ์œผ๋กœ ํ•„ํ„ฐ๋ง

public static List<Apple> filterApples(List<Apple> inventory, Color color, int weight, boolean flag){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory){
        if ((flag && color.equals(apple.getColor()) || !flag && apple.getWeight() > weight)){
            result.add(apple);
        }
    }
    return result;
}
List<Apple> redApples = filterApples(inventory, Color.RED, 0, true);
List<Apple> heavyApples = filterApples(inventory, null, 100, false);

 

flag๊ฐ€ true์ด๋ฉด, ์ƒ‰๊น”๋กœ ํ•„ํ„ฐ๋งํ•˜๊ณ , flag๊ฐ€ false์ด๋ฉด, ๋ฌด๊ฒŒ๋กœ ํ•„ํ„ฐ๋งํ•œ๋‹ค.

 

๋ฌธ์ œ๋Š” ์‚ฌ์šฉ ์‹œ, true์™€ false๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค. ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ํ•„ํ„ฐ๋งํ•  ๊ฒƒ์ธ์ง€ ์ •ํ™•ํžˆ, ๊ทธ๋ฆฌ๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

 

๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”

๋„ค ๋ฒˆ์งธ ์‹œ๋„ : ์ถ”์ƒ์  ์กฐ๊ฑด์œผ๋กœ ํ•„ํ„ฐ๋ง

์‚ฌ๊ณผ์˜ ์–ด๋–ค ์†์„ฑ์— ๊ธฐ์ดˆํ•ด์„œ ๋ถˆ๋ฆฌ์•ˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ ๋˜๋Š” ๊ฑฐ์ง“์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ Predicate๋ผ๊ณ  ํ•œ๋‹ค. ์„ ํƒ ์กฐ๊ฑด์„ ๊ฒฐ์ •ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public interface ApplePredicate {
    boolean test(Apple apple);
}
public class AppleHeavyWeightPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 100;
    }
}
public class AppleGreenColorPredicate implements ApplePredicate{
    @Override
    public boolean test(Apple apple) {
        return apple.getColor().equals(Color.GREEN);
    }
}

์ด๋ฅผ ์ „๋žต ๋””์ž์ธ ํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ „๋žต ๋””์ž์ธ ํŒจํ„ด์€ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์บก์Šํ™”ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํŒจ๋ฐ€๋ฆฌ(์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ์ •์˜ํ•ด ๋‘” ๋‹ค์Œ์— ๋Ÿฐํƒ€์ž„์— ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ตฌํ˜„ ๋ฉ”์†Œ๋“œ)์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate applePredicate){
    List<Apple> result = new ArrayList<>();
    for (Apple apple : inventory){
        if (applePredicate.test(apple)){
            result.add(apple);
        }
    }
    return result;
}

์ด๋ ‡๊ฒŒ ๋ฉ”์†Œ๋“œ(filterApples)๊ฐ€ ๋‹ค์–‘ํ•œ ๋™์ž‘ ๋˜๋Š” ์ „๋žต(applePredicate)๋ฅผ ๋ฐ›์•„์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋™์ž‘(test)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ธฐ์กด์˜ ์ฝ”๋“œ์— ๋น„ํ•ด, ํ›จ์”ฌ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์–ป์—ˆ์œผ๋ฉฐ ๊ฐ€๋…์„ฑ๊ณผ ์‚ฌ์šฉ ์šฉ์ด์„ฑ์ด ๋†’์•„์กŒ๋‹ค. ํ•œ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ”๊ฟ” ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

 

์‚ฌ๊ณผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

public interface AppleFormatter {
    public String accept(Apple apple);
}
public class AppleSimpleFormatter implements AppleFormatter{
    @Override
    public String accept(Apple apple) {
        return apple.getColor() + " ์ƒ‰ " + apple.getWeight() + "g ์‚ฌ๊ณผ";
    }
}
public class AppleDetailFormatter implements AppleFormatter{
    @Override
    public String accept(Apple apple) {
        return "์ด ์‚ฌ๊ณผ์˜ ์ƒ‰๊น”์€ " + apple.getColor() + ", ๋ฌด๊ฒŒ๋Š” " + apple.getWeight() + "g ์ž…๋‹ˆ๋‹ค.";
    }
}
prettyPrintApple(inventory, new AppleDetailFormatter());
prettyPrintApple(inventory, new AppleSimpleFormatter());

 

๋ณต์žกํ•œ ๊ณผ์ • ๊ฐ„์†Œํ™”

์ต๋ช… ํด๋ž˜์Šค

์ต๋ช… ํด๋ž˜์Šค๋Š” ์ž๋ฐ”์˜ ์ง€์—ญ ํด๋ž˜์Šค(๋ธ”๋ก ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ํด๋ž˜์Šค)์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์ด๋‹ค. ์ต๋ช… ํด๋ž˜์Šค๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ด๋ฆ„์ด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋กœ, ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด, ์ฆ‰์„์—์„œ ํ•„์š”ํ•œ ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋‹ค์„ฏ ๋ฒˆ์งธ ์‹œ๋„ : ์ต๋ช… ํด๋ž˜์Šค ์‚ฌ์šฉ

ApplePredicate์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ผ์ผ์ด ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

List<Apple> redApples = filterApples(inventory, new ApplePredicate() {
            @Override
            public boolean test(Apple apple) {
                return Color.RED.equals(apple.getColor());
            }
        });

 

 

์—ฌ์„ฏ ๋ฒˆ์งธ ์‹œ๋„ : ๋žŒ๋‹ค ํ‘œํ˜„์‹ ์‚ฌ์šฉ

๋žŒ๋‹ค์‹์„ ์ต๋ช… ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

List<Apple> redApples = filterApples(inventory, (Apple apple) -> Color.RED.equals(apple.getColor()));

 

 

์ผ๊ณฑ ๋ฒˆ์งธ ์‹œ๋„ : ๋ฆฌ์ŠคํŠธ ํ˜•์‹์œผ๋กœ ์ถ”์ƒํ™”

public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
    List<T> result = new ArrayList<>();
    for (T t : list) {
        if (predicate.test(t)){
            result.add(t);
        }
    }
    return result;
}
List<Apple> redApples = filter(inventory, (Apple apple) -> Color.RED.equals(apple.getColor()));
List<Grape> heavyGrape = filter(inventory, (Grape grape) -> grape.getWeight() > 100);

 

์‹ค์ „ ์˜ˆ์ œ

Comparator๋กœ ์ •๋ ฌํ•˜๊ธฐ

List์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Comparator<T>์ธ๋ฐ, ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ต๋ช… ํด๋ž˜์Šค๋‚˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

inventory.sort(
        (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
);