Day11 - jeremy0405/Codesquad_CS GitHub Wiki

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜

๋ฏธ์…˜ ์ค‘ type์„ ์ง์ ‘ ์ง€์ •ํ•ด์„œ type๊ณผ byte ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ Memory class ์—์„œ Map<String, Integer> typeMap = new HashMap<>() ์ฒ˜๋Ÿผ ๋‘์–ด ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋„ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Memory Class์—์„œ ๋ฐ”๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ์—๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ํ‰๋‚ด๋‚ด์„œ TypeStorage Class ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.


์‚ฌ์‹ค ์ž๋ฐ”์—์„œ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์€ Wrappingํ•œ Collection ์™ธ ๋‹ค๋ฅธ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ TypeStorage ๋Š” typeMap ์ด์™ธ์— typeSet ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์€ ์•„๋‹ˆ๋‹ค. -> ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์ธ ์ฒ™ ํ•˜๊ณ  ์‹ถ์–ด์„œ ํ‰๋‚ด๋‚ด์—ˆ๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ๋‹ค. ๐Ÿ˜…

Map์—์„œ containsKey() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฏธ key๊ฐ’์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ Set์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ ธ TypeStorage๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๊ณ  ์กฐ์–ธ ํ•ด์ฃผ์‹  ํ›„์—๊ฒŒ ์ •๋ง ๊ฐ์‚ฌ๋“œ๋ฆฐ๋‹ค ๐Ÿ™


TypeStorage Class Code

public class TypeStorage {

	private final Map<String, Integer> typeMap;

	public TypeStorage() {
		typeMap = new HashMap<>();
	}

	public void putType(String type, int length) {
		if (this.typeMap.containsKey(type)) {
			throw new IllegalArgumentException("์ด๋ฏธ ์ •์˜๋œ type์ž…๋‹ˆ๋‹ค.");
		}
		validateLength(length);

		this.typeMap.put(type, length);
	}

	private void validateLength(int length) {
		if (length == 1 || length == 2 || length == 4 ||
		length == 8 || length == 16 || length == 32) {
			return;
		}
		throw new IllegalArgumentException("์ž˜๋ชป๋œ length๊ฐ’์„ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.");
	}

	public int getTypeLength(String type) {
		for (String s : typeMap.keySet()) {
			if (s.equals(type)) {
				return typeMap.get(type);
			}
		}
		throw new IllegalArgumentException("์ •์˜๋˜์ง€ ์•Š์€ type์ž…๋‹ˆ๋‹ค.");
	}

}

Memory Class

private final TypeStorage typeStorage = new TypeStorage();

public void setSize(String type, int length) {

	this.typeStorage.putType(type, length);
}

-> type์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋กœ์ง์ด ๋ชจ๋‘ TypeStorage()๋กœ ๋“ค์–ด๊ฐ€๋ฉด์„œ Memory Class๊ฐ€ ๊ต‰์žฅํžˆ ๋‹จ์ˆœํ™”๋˜์—ˆ๋‹ค.

๋˜ํ•œ TypeStorage ๊ฐ์ฒด๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ๊ธฐ ์šฉ์ดํ•ด์„œ StackArea Class์—๋„ TypeStorage ๊ฐ์ฒด๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ๋ฉฐ ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„ํŽธํ–ˆ๋‹ค.


์ผ๊ธ‰ ์ปฌ๋ ‰์…˜

public class LottoService {
	private static final int LOTTO_NUMBERS_SIZE = 6;
	
	public createLottoNumber() {
		List<Integer> lottoNumbers = createNonDuplicateNumbers();
		validateSize(lottoNumbers);
		validateDuplicate(lottoNumbers);

		//LottoService ์— ๋Œ€ํ•œ ๋กœ์ง ๊ณ„์† ์‹คํ–‰
		// ex) ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๊ฐ™๋‹ค๋ฉด 1๋“ฑ ๋‹น์ฒจ ...
		//     -> 1๋“ฑ ๊ธˆ์•ก = ์ด ์ƒ๊ธˆ * 0.5 / 1๋“ฑ ์‚ฌ๋žŒ ์ˆ˜ ...

	}

	private validateSize(List<Integer> lottoNumbers) {
		if(lottoNumbers.size() != LOTTO_NUMBERS_SIZE) {
			throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
		}

	}

	private validateDuplicate(List<Integer> lottoNumbers) {
		Set<Integer> nonDuplicateNumbers = new HashSet<>(lottoNumbers);
		if(nonDuplicateNumbers.size() != LOTTO_NUMBERS_SIZE) {
			throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
		}

	}
}

๋กœ๋˜ ๋ฒˆํ˜ธ ์กฐ๊ฑด

  • 6๊ฐœ์˜ ์ˆซ์ž
  • ์ˆซ์ž๋Š” ์„œ๋กœ ์ค‘๋ณต X

-> ๋กœ๋˜ ๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ์žฅ์†Œ์—์„œ ๊ฒ€์ฆ๋กœ์ง์„ ๊ฑฐ์ณ์•ผ ํ•จ


๋กœ๋˜ ๋ฒˆํ˜ธ ์กฐ๊ฑด์„ ๋กœ๋˜์„œ๋น„์Šค ํด๋ž˜์Šค์—์„œ ๋‹ค ๋งŒ์กฑ์‹œํ‚ค๋ฉฐ ๊ตฌํ˜„ํ•˜๊ธฐ์—๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง

-> ํ•ญ์ƒ 6๊ฐœ์˜ ์ค‘๋ณต๋˜์ง€์•Š๋Š” ์ˆซ์ž๋ฅผ List<Integer>๋กœ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ๋จ.

public class LottoTicket {
	private static final int LOTTO_NUMBERS_SIZE = 6;

	private final List<Integer> lottoNumbers;
	
	public LottoTicket(List<Integer> lottoNumbers) {
		validateSize(lottoNumbers);
		validateDuplicate(lottoNumbers);
		this.lottoNumbers = lottoNumbers;
	}

	private validateSize(List<Integer> lottoNumbers) {
		if(lottoNumbers.size() != LOTTO_NUMBERS_SIZE) {
			throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.");
		}

	}

	private validateDuplicate(List<Integer> lottoNumbers) {
		Set<Integer> nonDuplicateNumbers = new HashSet<>(lottoNumbers);
		if(nonDuplicateNumbers.size() != LOTTO_NUMBERS_SIZE) {
			throw new IllegalArgumentException("๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
		}

	}
}
public class LottoService {
	LottoTicket lottoTicket = new LottoTicket(createNonDuplicateNumbers());
	
		//LottoService ์— ๋Œ€ํ•œ ๋กœ์ง ๊ณ„์† ์‹คํ–‰
		// ex) ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๊ฐ™๋‹ค๋ฉด 1๋“ฑ ๋‹น์ฒจ ...
		//     -> 1๋“ฑ ๊ธˆ์•ก = ์ด ์ƒ๊ธˆ * 0.5 / 1๋“ฑ ์‚ฌ๋žŒ ์ˆ˜ ...

}

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์˜ ์žฅ์ 

  1. ๋ถˆ๋ณ€์„ ๋ณด์žฅ
  • ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋งŒ public์œผ๋กœ ํ•ด๋†“๊ณ  getter()์™€ setter()๋ฅผ ์•„์˜ˆ ์•ˆ ๋‘์–ด์„œ ๋ถˆ๋ณ€์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Œ
public class Orders {
	private final List<Order> orders;

	public Orders(List<Order> orders) {
		this.orders = orders;
	}

	public long getAmountSum() {
		return orders.stream()
			.mapToLong(Order::getAmount)
			.sum();
	}

}

Orders ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์—์„œ๋Š” ๊ฐ’์„ ์ ˆ๋Œ€ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๊ณ  ๋‹จ์ง€ getAmountSum()๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ถˆ๋ณ€์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  1. ์ด๋ฆ„์ด ์žˆ๋Š” ์ปฌ๋ ‰์…˜ -> ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  2. ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ๊ฐ€๋ณ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ (ํด๋ž˜์Šค๊ฐ€ ๊ฐ€๋ฒผ์›Œ์ง)

์ฐธ๊ณ ์ž๋ฃŒ - jojoldu๋‹˜ ๋ธ”๋กœ๊ทธ ,์ฐธ๊ณ ์ž๋ฃŒ - tigger๋‹˜ ๋ธ”๋กœ๊ทธ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ