๐ŸŽฝ ์ธํ”„๋Ÿฐ ์›Œ๋ฐ์—… ํด๋Ÿฝ 0๊ธฐ ๋ฐฑ์—”๋“œ ๋‹ค์„ฏ ๋ฒˆ์งธ ๊ณผ์ œ

nyangยท2024๋…„ 2์›” 23์ผ
0

์ธํ”„๋Ÿฐ

๋ชฉ๋ก ๋ณด๊ธฐ
5/7
post-thumbnail

์ถœ์ฒ˜
https://inf.run/XKQg

ํด๋ฆฐ์ฝ”๋“œ์˜ ๊ฐœ๋…๊ณผ ์ฒซ ๋ฆฌํŒฉํ† ๋ง ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๊ณ  ๊ณผ์ œ์—์„œ ์ œ์‹œ๋œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ–ˆ๋‹ค.

โ›ณ๏ธ ๊ณผ์ œ ์ฝ”๋“œ

โ›ณ๏ธ ๋ฆฌํŒฉํ† ๋ง

๐Ÿ’ก ํด๋ฆฐ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

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

  • ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ
    ํด๋ž˜์Šค๋‚˜ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์ž‘์€ ๋‹จ์œ„์˜ ์ฝ”๋“œ๋Š” ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๋ฉฐ, ์žฌ์‚ฌ์šฉ์„ฑ๋„ ์ฆ๊ฐ€ํ•œ๋‹ค.

  • ์ค‘๋ณต ํ”ผํ•˜๊ธฐ
    ์ฝ”๋“œ ์ค‘๋ณต์€ ๋ฒ„๊ทธ ๋ฐœ์ƒ์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ํ”ผํ•˜๊ณ  ์ค‘๋ณต๋œ ๋กœ์ง์„ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋กœ ์ถ”์ƒํ™”ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ธ๋‹ค.

ํด๋ฆฐ ์ฝ”๋“œ์˜ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ - ์‹คํ–‰ - ์ถœ๋ ฅ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋“ค์„ ๋งŒ๋“ค์—ˆ๋‹ค.

1๏ธโƒฃ Main ํด๋ž˜์Šค

public class Main {
    public static void main(String[] args) {
    	// ์ž…๋ ฅ
        View view = new View();
        int count = view.inputNumber();
        
        // ์‹คํ–‰
        ResultDto resultDto = playGame(count);
        
        // ์ถœ๋ ฅ
        view.printResult(resultDto);
    }

    private static ResultDto playGame(int count) {
        Dice dice = new Dice(6);
        dice.increaseBy(count);
        return dice.toResultDto();
    }
}

2๏ธโƒฃ View ํด๋ž˜์Šค

import com.group.libraryapp.study.day5.dto.DiceDto;
import com.group.libraryapp.study.day5.dto.ResultDto;
import java.util.List;
import java.util.Scanner;

public class View {

    private static final String GAME_INPUT_MESSAGE = "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” : ";
    private static final String GAME_RESULT_MESSAGE = "%d์€(๋Š”) %d๋ฒˆ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.\n";

	// ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ
    public int inputNumber() {
        System.out.print(GAME_INPUT_MESSAGE);
        Scanner sc = new java.util.Scanner(System.in);
        return sc.nextInt();
    }
    
	// ์ฃผ์‚ฌ์œ„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    public void printResult(ResultDto resultDto) {
        List<DiceDto> result = resultDto.result();
        for (int i = 0; i < result.size(); i++) {
            System.out.printf(GAME_RESULT_MESSAGE, i + 1, result.get(i).result());
        }
    }
}

- inputNumber()

์ด ๋ฉ”์†Œ๋“œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ , ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์„œ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” : ๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ์˜คํƒ€๋ฅผ ๋ฐฉ์ง€ํ–ˆ๋‹ค.

- printResult(ResultDto resultDto)

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


3๏ธโƒฃ Dice ํด๋ž˜์Šค

import com.group.libraryapp.study.day5.dto.DiceDto;
import com.group.libraryapp.study.day5.dto.ResultDto;
import java.util.ArrayList;
import java.util.List;

public class Dice {
    private final int limit;
    private List<Integer> numbers;

	// ์ƒ์„ฑ์ž: ์ฃผ์‚ฌ์œ„์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ›์•„ ์ดˆ๊ธฐํ™”
    public Dice(int limit) {
        this.limit = limit;
        this.numbers = initialize(limit);
    }

	// ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ง€๋ฉด, ๊ฐ ์ˆซ์ž๊ฐ€ ๋‚˜์˜จ ํšŸ์ˆ˜๋ฅผ 1์”ฉ ์ฆ๊ฐ€
    public void increaseBy(int count) {
        for (int i = 0; i < count; i++) {
            int num = (int) (Math.random() * 6);
            int currentValue = numbers.get(num);
            numbers.set(num, currentValue + 1);
        }
    }

	// ๊ฒฐ๊ณผ๋ฅผ ResultDto๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ
    public ResultDto toResultDto() {
        return ResultDto.of(numbers);
    }
    
    private List<Integer> initialize(int limit) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < limit; i++) {
            numbers.add(0);
        }
        return numbers;
    }
}

- Dice(int limit)

Dice ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด, ์ฃผ์‚ฌ์œ„์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.
ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์ฃผ์‚ฌ์œ„๊ฐ€ 1 ~ 6๊นŒ์ง€๋งŒ ์žˆ์ง€๋งŒ, ๋‚˜์ค‘์— ์ฃผ์‚ฌ์œ„๊ฐ€ 1 ~ 12 ๋˜๋Š” 1 ~ 20 ์ด๋ผ๋„ limit ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ ์ง€์ ์„ ํ•˜๋‚˜๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

- increaseBy(int count)

์ด ๋ฉ”์†Œ๋“œ๋Š” ์ž…๋ ฅ๋œ ํšŸ์ˆ˜(count)๋งŒํผ ์ฃผ์‚ฌ์œ„๋ฅผ ๋˜์ ธ์„œ ๋‚˜์˜จ ๊ฐ’์„ ๊ธฐ๋กํ•œ๋‹ค.
์ฃผ์‚ฌ์œ„ ๋˜์ง€๊ธฐ๋Š” ๋‚œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ•ด๋‹น ๋‚œ์ˆ˜๊ฐ€ ์ธ๋ฑ์Šค์ธ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋„๋ก ํ–ˆ๋‹ค.

- toResultDto()

์ด ๋ฉ”์†Œ๋“œ๋Š” numbers๋ฅผ Dto๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ, View์—์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ Dice ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ Dto ์ธ์Šคํ„ด์Šค๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ๋‹ค.
ResultDto๋Š” ์ฃผ์‚ฌ์œ„์˜ ๊ฐ ์ˆซ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ๋‚˜ํƒ€๋‚ฌ๋Š”์ง€์— ๋Œ€ํ•œ ํšŸ์ˆ˜๋ฅผ ๋‹ด์€ Dto์ด๋ฉฐ, Dto๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋กœ์ง์€ ResultDto ํด๋ž˜์Šค์— ์ž‘์„ฑํ–ˆ๋‹ค.

โญ๏ธ ์ค‘์š”
View๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ฝ”๋“œ์— ์ง์ ‘ ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.
์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” View์—์„œ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ Dto(Data Transfer Object)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋ก ํŠธ๋‹จ์—์„œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ,
์ด๋•Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ์„ ์ œ๊ณตํ•˜๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด Dto๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
(์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€๋ฅผ ์ˆจ๊ธฐ๋ฉฐ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐ์— ๋„์›€์ด ๋œ๋‹ค.)

- initialize(int limit)

์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฃผ์–ด์ง„ ํฌ๊ธฐ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๊ฐ ์š”์†Œ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
์ฃผ์‚ฌ์œ„ ๋ฒ”์œ„๋งŒํผ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.


4๏ธโƒฃ Dto ํด๋ž˜์Šค


// ๊ฐ ์ฃผ์‚ฌ์œ„ ์ˆซ์ž์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ Dto
public record DiceDto(int result) {}

// ์—ฌ๋Ÿฌ DiceDto๋ฅผ ํฌํ•จํ•˜๋Š” Dto
import java.util.List;

public record ResultDto(List<DiceDto> result) {

	// ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ: List<Integer>๋ฅผ ๋ฐ›์•„ ResultDto ์ƒ์„ฑ
    public static ResultDto of(List<Integer> numbers) {
        List<DiceDto> result = numbers.stream()
                .map(DiceDto::new)
                .toList();
        return new ResultDto(result);
    }
}

- ResultDto of(List<Integer> numbers)

์ด ๋ฉ”์†Œ๋“œ๋Š” ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ(numbers)๋ฅผ ๋ฐ›์•„์™€ ๊ฐ ์ˆซ์ž๋ฅผ DiceDto๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, ์ด๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ์–ด ResultDto๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์—ฌ๋Ÿฌ DiceDto๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌถ๋Š” ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ํ•œ ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ฃผ์‚ฌ์œ„ ๋ฒ”์œ„๊ฐ€ ํ™•์žฅ๋˜์–ด๋„ ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.


โ›ณ๏ธ ๊ฐœ์ธ ํšŒ๊ณ 

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


๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ
https://medium.com/@lifthus531/%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EB%A7%90%ED%95%98%EB%8A%94-%EA%B2%83%EB%93%A4-4717f8ea2229
https://www.nextree.io/basic-of-clean-code/

profile
๐Ÿพ

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