์ด์ง€๋ฏผ์˜ ๊ฐœ๋ฐœ ๋…ธํŠธ

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ Java์™€ Spring์„ ์ค‘์‹ฌ์œผ๋กœ ํ•™์Šต ๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๐Ÿ”ฅ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„/๐Ÿ“Œ ๊ณผ์ œ

[๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Spring_3๊ธฐ] CH2 ๊ณ„์‚ฐ๊ธฐ๊ณผ์ œ Step3

jiiimni 2026. 1. 27. 14:38

 

์˜ค๋Š˜์€ Step3(๋„์ „๊ณผ์ œ)๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.


OperatorType.java ๊ตฌํ˜„ ๊ณผ์ •

Step2๊นŒ์ง€์˜ ๊ณ„์‚ฐ๊ธฐ์—์„œ๋Š”
์—ฐ์‚ฐ์ž๋ฅผ char ํƒ€์ž…(+, -, *, /)์œผ๋กœ ์ž…๋ ฅ๋ฐ›์•„
switch ๋ฌธ์œผ๋กœ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

switch (operator) {
    case '+': ...
    case '-': ...
}

์ด ๋ฐฉ์‹์€ ๋™์ž‘์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ
์—ฐ์‚ฐ์ž ์ข…๋ฅ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ ,
์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถ„์‚ฐ๋˜๋ฉฐ
ํ•˜๋‚˜์˜ ๊ฐœ๋…์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๋А๋‚Œ์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ Step3์—์„œ๋Š”
Enum์„ ํ™œ์šฉํ•ด ์—ฐ์‚ฐ์ž ํƒ€์ž…์„ ๊ด€๋ฆฌํ•˜๋„๋ก ์š”๊ตฌํ•˜๊ณ  ์žˆ๋‹ค.


OperatorType enum ์„ค๊ณ„

์‚ฌ์น™์—ฐ์‚ฐ์€ ๊ณ ์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ
Enum์„ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

package com.example.calculator.step3;

public enum OperatorType {
    ADD('+'),
    SUB('-'),
    MUL('*'),
    DIV('/');

    private final char symbol;

    OperatorType(char symbol) {
        this.symbol = symbol;
    }

    public char getSymbol() {
        return symbol;
    }

    public static OperatorType fromSymbol(char symbol) {
        for (OperatorType type : values()) {
            if (type.symbol == symbol) return type;
        }
        throw new IllegalArgumentException("์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.");
    }
}

enum ์ƒ์ˆ˜ ์ •์˜

ADD('+'),
SUB('-'),
MUL('*'),
DIV('/');
  • ์‚ฌ์น™์—ฐ์‚ฐ์„ ์˜์–ด ์ด๋ฆ„์œผ๋กœ ์ •์˜ํ–ˆ๋‹ค.
  • ์—ฐ์‚ฐ์ž๋Š” ์‹ค์ œ ์ž…๋ ฅ๋˜๋Š” ๊ธฐํ˜ธ๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค.

ํ•„๋“œ์™€ ์ƒ์„ฑ์ž

private final char symbol;

OperatorType(char symbol) {
    this.symbol = symbol;
}
  • enum๋„ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„๋“œ์™€ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ ์—ฐ์‚ฐ ํƒ€์ž…์€ ์ž์‹ ์ด ์–ด๋–ค ๊ธฐํ˜ธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

fromSymbol ๋ฉ”์„œ๋“œ

public static OperatorType fromSymbol(char symbol) {
    for (OperatorType type : values()) {
        if (type.symbol == symbol) return type;
    }
    throw new IllegalArgumentException("์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.");
}
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ๋Œ€์‘๋˜๋Š” OperatorType์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ž…๋ ฅ์€ char์ง€๋งŒ
๋‚ด๋ถ€ ๊ณ„์‚ฐ ๋กœ์ง์€ enum ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ด ๊ตฌ์กฐ ๋•๋ถ„์—
์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ ,
๊ณ„์‚ฐ ๋กœ์ง์—์„œ๋Š” enum๋งŒ ์‹ ๊ฒฝ ์“ฐ๋ฉด ๋œ๋‹ค.


๊ธฐ์กด Step2์˜ calculate ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜€๋‹ค.

calculate(int num1, int num2, char operator)

Step3์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

  1. ์—ฐ์‚ฐ์ž๋ฅผ char๋กœ ์ž…๋ ฅ๋ฐ›๊ณ 
  2. OperatorType.fromSymbol()๋กœ enum์œผ๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค
  3. ๊ณ„์‚ฐ๊ธฐ ํด๋ž˜์Šค์— enum์„ ์ „๋‹ฌํ•œ๋‹ค.

Enum ์ ์šฉ์˜ ์žฅ์ 

  • ์—ฐ์‚ฐ์ž ํƒ€์ž…์„ ํ•˜๋‚˜์˜ ๊ฐœ๋…์œผ๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • switch ๋ถ„๊ธฐ์˜ ๊ธฐ์ค€์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค.
  • ์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๊น”๋”ํ•ด์ง„๋‹ค.
  • ์ดํ›„ ์—ฐ์‚ฐ์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ํ™•์žฅ์„ฑ์ด ์ข‹์•„์ง„๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

OperatorType.java๋ฅผ ์ปค๋ฐ‹ํ•œ ๋’ค
git push origin main์„ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๊ฒฐ์„ ์‹œ๋„ํ•˜๊ธฐ ์œ„ํ•ด
git pull origin main์„ ์‹คํ–‰ํ–ˆ์ง€๋งŒ
์ด ์—ญ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: rebase ์‚ฌ์šฉ

rebase ๊ณผ์ •์—์„œ ์ถฉ๋Œ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ ,
์ •์ƒ์ ์œผ๋กœ push๊นŒ์ง€ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


Calculator.java ๊ตฌํ˜„

calculator.java๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ
Enum ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ, ์ œ๋„ค๋ฆญ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ˆซ์ž ํƒ€์ž… ์ฒ˜๋ฆฌ,
Stream / Lambda๋ฅผ ํ™œ์šฉํ•œ ์กฐํšŒ ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ตฌํ˜„ํ–ˆ๋‹ค.


Step2์™€ Step3 ๋น„๊ต

Step2

  • calculate(int, int, char)
  • ๊ฒฐ๊ณผ ์ €์žฅ: List<Integer>

Step3

  • ์—ฐ์‚ฐ์ž: OperatorType(Enum)
  • ์ˆซ์ž ํƒ€์ž… ํ™•์žฅ: <T extends Number>
  • ๊ฒฐ๊ณผ ์กฐ๊ฑด ์กฐํšŒ: Stream, Lambda ์‚ฌ์šฉ

๊ฒฐ๊ณผ ์ €์žฅ ์ปฌ๋ ‰์…˜

private final List<Double> results = new ArrayList<>();
  • Step2์—์„œ๋Š” List<Integer>์˜€์ง€๋งŒ Step3์—์„œ๋Š” Double๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.
  • final์„ ์‚ฌ์šฉํ•ด ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ–ˆ๋‹ค.

calculate ๋ฉ”์„œ๋“œ (์ œ๋„ค๋ฆญ)

public <T extends Number> double calculate(T num1, T num2, OperatorType operator)
  • T extends Number๋กœ ์„ค์ •ํ•ด ๋‹ค์–‘ํ•œ ์ˆซ์ž ํƒ€์ž…์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

doubleValue()

double a = num1.doubleValue();
double b = num2.doubleValue();
  • Number๊ฐ€ ์ œ๊ณตํ•˜๋Š” doubleValue()๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ณ€ํ™˜ํ–ˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ ํƒ€์ž… T๋Š” ์ง์ ‘ ์—ฐ์‚ฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

Enum ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ

switch (operator) {
    case ADD: ...
}
  • Step2์—์„œ๋Š” char ๊ธฐ์ค€์ด์—ˆ์ง€๋งŒ
  • Step3์—์„œ๋Š” OperatorType(enum)์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๊ธฐํ•œ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ

if (b == 0) {
    throw new IllegalArgumentException("0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
  • 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • ์˜ˆ์™ธ๋Š” App์—์„œ ์žก์•„ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

๊ฒฐ๊ณผ ์ €์žฅ

results.add(result);
  • Step2์™€ ๋™์ผํ•˜๊ฒŒ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค.

Stream / Lambda ์กฐํšŒ

return results.stream()
        .filter(r -> r > value)
        .collect(Collectors.toList());
  • stream()์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ๋ฆ„์œผ๋กœ ๋ณ€ํ™˜
  • filter๋กœ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’๋งŒ ์ถ”์ถœ
  • collect๋กœ ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜

Calculator.java ์ „์ฒด ์ฝ”๋“œ

package com.example.calculator.step3;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Calculator {

    private final List<Double> results = new ArrayList<>();

    public <T extends Number> double calculate(T num1, T num2, OperatorType operator) {

        double result = 0;

        double a = num1.doubleValue();
        double b = num2.doubleValue();

        switch (operator) {
            case ADD:
                result = a + b;
                break;
            case SUB:
                result = a - b;
                break;
            case MUL:
                result = a * b;
                break;
            case DIV:
                if (b == 0) {
                    throw new IllegalArgumentException("0์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
                }
                result = a / b;
                break;
            default:
                throw new IllegalArgumentException("์ง€์›ํ•˜์ง€ ์•Š๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.");
        }

        results.add(result);
        return result;
    }

    public List<Double> getResults() {
        return new ArrayList<>(results);
    }

    public void setResults(List<Double> newResults) {
        results.clear();
        results.addAll(newResults);
    }

    public void removeResult() {
        if (!results.isEmpty()) {
            results.remove(0);
        }
    }

    public List<Double> getResultsGreaterThan(double value) {
        return results.stream()
                .filter(r -> r > value)
                .collect(Collectors.toList());
    }
}

App.java ๊ตฌํ˜„ ๊ณผ์ •

calculator ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

Calculator calculator = new Calculator();
  • App์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค.

๋ฐ˜๋ณต ์‹คํ–‰ ๊ตฌ์กฐ

while (true) { ... }

exit ์ž…๋ ฅ ์ „๊นŒ์ง€ ๊ณ„์‚ฐ์ด ๋ฐ˜๋ณต๋œ๋‹ค.


OperatorType ๋ณ€ํ™˜

OperatorType opType = OperatorType.fromSymbol(operator);
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ(char)์„ enum์œผ๋กœ ๋ณ€ํ™˜ํ•ด ๋‚ด๋ถ€ ๋กœ์ง์„ ํ†ต์ผํ–ˆ๋‹ค.

calculate ํ˜ธ์ถœ (์ œ๋„ค๋ฆญ)

double result = calculator.calculate(num1, num2, opType);
  • int๋ฟ ์•„๋‹ˆ๋ผ double ํƒ€์ž…๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์˜ค๋ฅ˜(0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ, ์ž˜๋ชป๋œ ์—ฐ์‚ฐ์ž)๊ฐ€ ๋ฐœ์ƒํ•ด๋„
ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ 
๊ธฐ์ค€๊ฐ’์„ ๊ณ„์† ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

catch (IllegalArgumentException e) {
    System.out.println("์˜ค๋ฅ˜: " + e.getMessage());
    continue;
}
  • catch์—์„œ continue๋ฅผ ์‚ฌ์šฉํ•ด
    ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ๊ธฐ์ค€๊ฐ’ ์ž…๋ ฅ ๋กœ์ง์ด ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.


๊ธฐ์ค€๊ฐ’ ์กฐํšŒ (๋žŒ๋‹ค, ์ŠคํŠธ๋ฆผ)

System.out.println(calculator.getResultsGreaterThan(value));

App.java ์ „์ฒด ์ฝ”๋“œ

package com.example.calculator.step3;

import java.util.Scanner;

public class App {
    public static void main(String[] args) {

        Calculator calculator = new Calculator();
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.print("์ฒซ ๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:");
            int num1 = sc.nextInt();

            System.out.print("๋‘ ๋ฒˆ์งธ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”:");
            int num2 = sc.nextInt();

            System.out.print("์‚ฌ์น™์—ฐ์‚ฐ ๊ธฐํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”: ");
            char operator = sc.next().charAt(0);

            try {
                OperatorType opType = OperatorType.fromSymbol(operator);
                double result = calculator.calculate(num1, num2, opType);
                System.out.println("๊ฒฐ๊ณผ: " + result);
            } catch (IllegalArgumentException e) {
                System.out.println("์˜ค๋ฅ˜: " + e.getMessage());
                continue;
            }

            System.out.println("์ €์žฅ๋œ ๊ฒฐ๊ณผ ๋ชฉ๋ก: " + calculator.getResults());

            System.out.print("๊ธฐ์ค€๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”: ");
            double value = sc.nextDouble();

            System.out.println("๊ธฐ์ค€๊ฐ’๋ณด๋‹ค ํฐ ๊ฒฐ๊ณผ: " + calculator.getResultsGreaterThan(value));

            System.out.println("๊ฐ€์žฅ ๋จผ์ € ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (remove ์ž…๋ ฅ ์‹œ ์‚ญ์ œ)");
            String cmd = sc.next();
            if (cmd.equalsIgnoreCase("remove")) {
                calculator.removeResult();
                System.out.println("์‚ญ์ œ ํ›„ ๊ฒฐ๊ณผ ๋ชฉ๋ก: " + calculator.getResults());
            }

            System.out.println("๋” ๊ณ„์‚ฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? (exit ์ž…๋ ฅ ์‹œ ์ข…๋ฃŒ)");
            String answer = sc.next();

            if (answer.equals("exit")) break;
        }

        sc.close();
    }
}


ํ”Œ๋กœ์šฐ์ฐจํŠธ

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


๊ณผ์ œ ์ดํ‰ (ํšŒ๊ณ )

Step1, Step2๊นŒ์ง€๋Š” ๋น„๊ต์  ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ
Step3๋ถ€ํ„ฐ ๋‚œ์ด๋„๊ฐ€ ํ™• ์˜ฌ๋ผ๊ฐ”๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.

Enum, ์ œ๋„ค๋ฆญ, ์ŠคํŠธ๋ฆผ, ๋žŒ๋‹ค ๋ชจ๋‘
๊ฐ•์˜์—์„œ ๋ถ„๋ช…ํžˆ ๋“ค์€ ๋‚ด์šฉ์ด์—ˆ์ง€๋งŒ
๋ง‰์ƒ ์ ์šฉํ•˜๋ ค๋‹ˆ ์–ด๋””์—, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์จ์•ผ ํ• ์ง€ ๊ณ„์† ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํŠนํžˆ ์ œ๋„ค๋ฆญ ์ ์šฉ ๊ณผ์ •์—์„œ
int → double๋กœ ๋‹จ์ˆœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
<T extends Number>๋กœ ํ™•์žฅํ•˜๋Š” ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ์–ด๋ ค์› ๋‹ค.

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

๋Œ€์‹  Step3 ์™„์„ฑ์— ์ง‘์ค‘ํ–ˆ๊ณ ,
๋‹ค์Œ์—๋Š” ์œ„ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๊ณ 
GUI ๊ธฐ๋ฐ˜ ๊ณ„์‚ฐ๊ธฐ๋กœ๋„ ํ™•์žฅํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ๋ชฉํ‘œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋Š” AI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ
๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•„ ๊ฒฐ๊ตญ ๋„์›€์„ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹ค๋งŒ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์š”์ฒญํ•˜๊ธฐ๋ณด๋‹ค๋Š”
๊ฐœ๋…์ด๋‚˜ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ํžŒํŠธ๋ฅผ ์–ป๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ–ˆ๊ณ ,
๊ทธ ์ดํ›„์—๋Š” ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ฉฐ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค.

์ด๋ฒˆ ๊ณ„์‚ฐ๊ธฐ ๊ณผ์ œ๋ฅผ ํ†ตํ•ด
์ž๋ฐ” ๋ฌธ๋ฒ•์„ ๋‹จ์ˆœํžˆ ์•„๋Š” ๊ฒƒ๊ณผ
์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋ฅผ ํ™•์‹คํžˆ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์•„์ง ์™„์ „ํžˆ ์ต์ˆ™ํ•˜๋‹ค๊ณ ๋Š” ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ,
์™œ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋Š”์ง€๋Š” ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ์ ์—์„œ
์˜๋ฏธ ์žˆ๋Š” ๊ณผ์ œ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.