Readable Code - dnwls16071/Backend_Summary GitHub Wiki
- ๊ฐ๋ ์ฑ(Readability) = ๊ธ์ด ์ ์ฝํ๋ค = ์ดํด๊ฐ ์ ๋๋ค = ์ ์ง๋ณด์ ํ๊ธฐ ์์ํ๋ค = ์๊ฐ๊ณผ ์์์ด ์ ์ฝ๋๋ค.
- ์ถ์ = ํน์ ์ธก๋ฉด์ ๊ฐ๋ ค๋ด๊ณ ๋ถํ์ํ ๋ถ๋ถ์ ๋ฒ๋ฆฐ๋ค.
-
โ
๏ธ์ด๋ฆ์ ์ง๋๋ค๋ ํ์๋ ์ถ์์ ์ฌ๊ณ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- ํํํ๊ณ ์ ํ๋ ๊ตฌ์ฒด์์ ์ ๋ง ์ค์ํ ํต์ฌ ๊ฐ๋ ๋ง์ ์ถ์ถํด ์ ๋๋ฌ๋ด๋ ํํ
- ์ฐ๋ฆฌ ๋๋ฉ์ธ์ ๋ฌธ๋งฅ ์์์ ์ดํด๋๋ ์ฉ์ด
-
โ
๏ธ๋จ์์ ๋ณต์๋ฅผ ๊ตฌ๋ถํ์.
- ๋์ -(e)s๋ฅผ ๋ถ์ฌ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋จ์์ธ์ง ๋ณต์์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฒ๋ง์ผ๋ก๋ ์ฝ๋ ์ด์๊ฒ ์ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ด ์ ๋ฌํ ์ ์๋ค.
-
โ
๏ธ์ด๋ฆ์ ์ค์ด์ง ์๋๋ค.
- ๊ฐ๋ ์ฑ์ ํฌ์ํด ์ป๋ ๋ถ๋ถ์ผ๋ก ์๋ ๊ฒ์ ๋นํด ์ป๋ ๊ฒ์ด ์ ๋ค.
-
โ
๏ธ์์ด/๋ฐฉ์ธ ์ฌ์ฉํ์ง ์๋๋ค.
- ๋๋ฉ์ธ ์ฉ์ด๋ฅผ ๋จผ์ ์ ์ํ๋ ๊ณผ์ ์ด ๋จผ์ ํ์ํ ์๋ ์๋ค. ๋ชจ๋๊ฐ ์๋ ๊ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
-
โ
๏ธํ ๋ฉ์๋์ ์ฃผ์ ๋ ๋ฐ๋์ ํ๋๋ค.
- ๋ฉ์๋์ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ์ถ์ํํ๋ค.
- โ ๏ธ์๋ตํ ์ ๋ณด์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๊ณ ๋๋ฌ๋ผ ์ ๋ณด๋ฅผ ๊ตฌ๋ถํ๋ค.
- โ ๏ธvoid ๋์ ๋ฐํํ ๋งํ ๊ฐ์ด ์๋์ง ๊ณ ๋ฏผํด๋ณธ๋ค. -> ๋ฐํ๊ฐ์ด ์๋ค๋ฉด ํ ์คํธ๊ฐ ์ฉ์ดํ๊ธฐ ๋๋ฌธ์
-
โ
๏ธ๋งค์ง ๋๋ฒ/๋งค์ง ์คํธ๋ง : ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์์ผ๋ ์์๋ก ์ถ์ถ๋์ง ์์ ์ซ์, ๋ฌธ์์ด ๋ฑ
- ์ด๋ฐ ์์ ์ถ์ถ์ ํตํด ์ด๋ฆ์ ์ง๊ณ ์๋ฏธ๋ฅผ ๋ถ์ฌํจ์ผ๋ก์จ ๊ธฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ธ๋ค.
- Early Return์ผ๋ก else์ ์ฌ์ฉ์ ์ง์ํ์.
// badโ
int get_string_type(char* string) {
int ret = 0;
if (is_rule_1(string)) {
ret = 1;
} else {
if (is_rule_2(string)) {
ret = 2;
} else {
ret = 0;
}
}
return ret;
}
// goodโญ
int is_valid(char* string) {
if (is_rule_1(string))
return 1;
if (is_rule_2(string))
return 2;
return 0;
}- ๋ณต์กํ ๋ก์ง์ ๋์ด ์ฝ๊ธฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ
// badโ -> 2๋ฒ์ ์ฌ๊ณ ๋ฅผ ํ์๋ก ํ๋ค.
if (!isLeftDirection()) {
doSomething();
}
// goodโญ -> 1๋ฒ์ด๋ฉด ๋
if (isNotLeftDirection()) {
doSomething();
}- ๋ถ์ ์ด๊ตฌ๋ฅผ ์ฐ์ง ์์๋ ๋๋ ์ํฉ์ธ๊ฐ๋ฅผ ์ฒดํฌํ๋ค.
- ๋ถ์ ์ด ์๋ฏธ๋ฅผ ๋ด๊ณ ์๋ ๋ค๋ฅธ ๋จ์ด๊ฐ ์กด์ฌํ๋์ง ๊ณ ๋ฏผํ๊ณ ์ง์ ๋ถ์ ์ด๊ตฌ๋ก ๋ฉ์๋๋ช
์ ๊ตฌ์ฑํ๋ค.
- ๋ถ์ ์ฐ์ฐ์(!)์ ๊ฐ๋ ์ฑ ์ ํด
- ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถ๋ ๊ฒ์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค.
- ์๋ํ ์์ธ์ ์๋์น์์ ์์ธ๋ฅผ ๊ตฌ๋ถํ๋ค.
- ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์์ธ์ ๊ฐ๋ฐ์๊ฐ ๋ณด๊ณ ์ฒ๋ฆฌํด์ผ ํ ์์ธ๋ฅผ ๊ตฌ๋ถํ๋ค.
- NPE๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฒฝ๊ฐ์ฌ์ ๊ฐ์ ธ์ผ ํ๋ค.
- ๋ฉ์๋ ์ค๊ณ ์ return null์ ์์ ํ๋ค. ๋ง์ฝ ์ด๋ ต๋ค๋ฉด Optional ์ฌ์ฉ์ ๊ณ ๋ คํด๋ณธ๋ค.
- Optional
- Optional์ ๋น์ผ ๊ฐ์ฒด์ด๋ค. ๊ผญ ํ์ํ ์ํฉ์์ ๋ฐํ ํ์ ์ ์ฌ์ฉํ๋ค.
- Optional์ ์ ๋๋ก ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ง ์๋๋ก ํ๋ค. ๋ถ๊ธฐ ์ผ์ด์ค๋ฅผ ๋ฐ์ ธ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Optional์ ๋ฐํ๋ฐ์๋ค๋ฉด ๋น ๋ฅด๊ฒ ํด์ํ๋ค.
- orElse(), orElseGet(), orElseThrow() ์ฐจ์ด๋ฅผ ์์งํ๊ณ ์ฌ์ฉํ๋๋ก ํ๋ค.
-
Optional์ด ๋น์ด์์ ๊ฒฝ์ฐ, ์ง์ ๋ ์์ธ(Exception)๋ฅผ ๋ฐ์์ํจ๋ค.
-
Optional์ด ๋น์ด์์ ๊ฒฝ์ฐ์๋ง, ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ Supplier (๋๋ค์ ๋๋ ๋ฉ์๋ ๋ ํผ๋ฐ์ค)๋ฅผ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ค.- ๋์ฒดํ ๊ธฐ๋ณธ๊ฐ์ด ์๋ก์ด ๊ฐ์ฒด ์์ฑ์ ํ์๋ก ํ ๋
- ๋์ฒดํ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ณต์กํ ์ฐ์ฐ์ด ํ์ํ ๋
- Optional์ด ๋น์ด์์ ๊ฒฝ์ฐ, ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฐ์ ๊ทธ๋๋ก ๋ฐํํ๋ค.
- ๋ถํ์ํ ์ฐ์ฐ : orElse() ์์ ๊ฐ์ฒด ์์ฑ์ด๋ ๋ฉ์๋ ํธ์ถ ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด, Optional์ ๊ฐ์ด ์กด์ฌํด์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ํ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฌด์กฐ๊ฑด ์คํ๋์ด ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋ ์ ์๋ค.
- ๊ฐ์ฒด(Object) = ๋ฐ์ดํฐ + ์ฝ๋
- ๊ฐ์ฒด ์ถ์ํ ํ์ ๋จ๊ณ
- ๋น๊ณต๊ฐ ํ๋(๋ฐ์ดํฐ) + ๋น๊ณต๊ฐ ๋ก์ง(์ฝ๋)
- ๊ณต๊ฐ ๋ฉ์๋ ์ ์ธ๋ถ๋ฅผ ํตํด ์ธ๋ถ ์ธ๊ณ์ ์ํต
- ๊ฐ์ฒด ์ฑ ์์ด ๋๋จ์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ฐ ํ๋ ฅ์ด ๋ฐ์
- โ ๏ธ1๊ฐ์ ๊ด์ฌ์ฌ๋ก ๋ช ํํ๊ฒ ์ฑ ์์ด ์ ์๋์๋๊ฐ?
-
โ
๏ธ์์ฑ์ ํน์ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋์์ ์ ํจ์ฑ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๋ค.
- ๋๋ฉ์ธ์ ํนํ๋ ๊ฒ์ฆ ๋ก์ง์ด ๋ค์ด๊ฐ ์ ์๋ค.
class Money {
private long value;
public Money(long value) {
if (value < 0) {
throw new IllegalArgumentException("๋์ 0์ ์ด์์ด์ด์ผ ํฉ๋๋ค.");
}
this.value = value;
}
}-
โ
๏ธsetter ์ฌ์ฉ์ ์์ ํ๋ค.
- ๋ฐ์ดํฐ๋ ๋ถ๋ณ์ด ์ต๊ณ ๋ค. ๋ณํ๋ ๋ฐ์ดํฐ๋ผ๋ ๊ฐ์ฒด๊ฐ ํธ๋ค๋งํ ์ ์์ด์ผ ํ๋ค.
- ๊ฐ์ฒด ๋ด๋ถ์์ ์ธ๋ถ ์ธ๊ณ์ ๊ฐ์ ์์ด ์์ฒด์ ์ธ ๋ณ๊ฒฝ/๊ฐ๊ณต์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๊ฐ๋ฅผ ํ์ธํ๋ค.
- ๋ง์ฝ ์ธ๋ถ์์ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์์ฒญ์ ํ๋ ๊ฒฝ์ฐ
set~๋ณด๋ค๋update~์ ๊ฐ์ด ์๋๋ฅผ ๋๋ฌ๋ด๋ ๋ค์ด๋ฐ์ ๊ณ ๋ คํ๋ค.
-
โ
๏ธgetter๋ ์ฒ์์ ์ฌ์ฉ์ ์์ ํ๋ค. ํ์ํ ๊ฒฝ์ฐ์๋ง ์ถ๊ฐํ๋๋ก ํ๋ค.
- ์ธ๋ถ์์ ๊ฐ์ฒด ๋ด์ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค๊ณ getter๋ฅผ ๋จ๋ฐํ๋ ๊ฒ์ ๋ฌด๋กํ ํ๋์ด๋ค. ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ์์ฒญํ๋ค.
Person person = new Person();
// badโ
if (person.getWallet().getID().findAge() >= 19) {
pass();
}
// goodโญ
if (person.isAgeGraterThanOrEqualTo(19) {
pass();
}-
โ
๏ธ๊ฐ์ฒด์ ํ๋ ์๋ฅผ ์ค์ฌ๋ผ.
- ๋ถํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ๋ณต์ก๋๊ฐ ๋์์ง๊ณ ๋์ํ ๋ณํ๊ฐ ๋ง์์ง๋ค.
- ๋ฉ์๋ ๊ธฐ๋ฅ์ผ๋ก๋ ์ ๊ณต์ด ๊ฐ๋ฅํ๋ฉด OK, ๋จ ๋ฏธ๋ฆฌ ๊ฐ๊ณตํ๋ ๊ฒ์ด ์ฑ๋ฅ ์์ ์ด์ ์ด ์๋ค๋ฉด ํ๋๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ ์ข์ ์ ์๋ค.
class Bill {
private final List<Menu> menus;
private final long totalPrice; // ๋ฏธ๋ฆฌ ๊ฐ์ง๊ณ ์์์๋ ์๋ ๊ฐ
// ๋ฉ์๋ ๊ธฐ๋ฅ์ผ๋ก ์ถฉ๋ถํ ๊ณ์ฐํ ์ ์๋ ๊ฐ
public long calculateTotalPrice() {
return this.menus.stream()
.mapToLong(Menu::getPrice)
.sum();
}
}-
โ
๏ธํ๋์ ํด๋์ค๋ ๋จ ํ ๊ฐ์ง ๋ณ๊ฒฝ ์ด์ ๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
- ๊ฐ์ฒด๊ฐ ๊ฐ์ง ๊ณต๊ฐ ๋ฉ์๋, ํ๋, ์์ ๋ฑ์ ํด๋น ๊ฐ์ฒด์ ๋จ์ผ ์ฑ ์์ ์ํด์๋ง ๋ณ๊ฒฝ์ด ๋์ด์ผ ํ๋ค.
-
โ
๏ธํ์ฅ์๋ ์ด๋ ค ์๊ณ , ์์ ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝ์์ด, ์์คํ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ด์ผ ํ๋ค.
- ์ถ์ํ์ ๋คํ์ฑ์ ํ์ฉํด OCP๋ฅผ ์งํฌ ์ ์๋ค. ๊ตฌ์ฒด์ ์์กดํ๊ธฐ๋ณด๋ค ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
- ๋ฌด์์ด, ์ ๋ณํ ๊ฒ์ธ๊ฐ?
- ๋ณํ๋ ๊ฒ์ '์ฝ์(์ธํฐํ์ด์ค)'์ผ๋ก ๋ง๋ค์๋๊ฐ?
- '์ญํ '๊ณผ '์ฑ ์'์ ๋ช ํํ ๋ถ๋ฆฌํ๋๊ฐ?
- '์์' ๋์ '๊ตฌ์ฑ'์ ์ฌ์ฉํ๊ณ ์๋๊ฐ?
-
โ
๏ธ์์ ๊ตฌ์กฐ์์ ๋ถ๋ชจ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ ํด๋์ค์ ์ธ์คํด์ค๋ก ์นํํ ์ ์์ด์ผ ํ๋ค.
- ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ์ฑ ์์ ์ค์ํ๋ฉฐ, ๋ถ๋ชจ ํด๋์ค์ ํ๋์ ๋ณ๊ฒฝํ์ง ์์์ผ ํ๋ค.
- LSP๋ฅผ ์๋ฐํ๋ฉด ์์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋ ์ค๋์, ์์ ๋ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ถํ์ํ ํ์ ์ฒดํฌ๊ฐ ๋๋ฐ๋ ์ ์๋ค.
-
โ
๏ธํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ์ธํฐํ์ด์ค์ ์์กดํ๋ฉด ์๋๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๋ฅผ ์๊ฒ ์ชผ๊ฐ๋ผ.
- ISP๋ฅผ ์๋ฐํ๋ฉด ๋ถํ์ํ ์์กด์ฑ์ผ๋ก ์ธํด ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ณ ํน์ ๊ธฐ๋ฅ ๋ณ๊ฒฝ์ด ์ฌ๋ฌ ํด๋์ค์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
- โ ๏ธ์์ ์์ค ๋ชจ๋์ ํ์ ์์ค ๋ชจ๋์ ์์กดํด์๋ ์ ๋๋ค. ๋ ๋ชจ๋ ์ถ์ํ์ ์์กดํด์ผ ํ๋ค.
- ์์๋ณด๋ค๋ ์กฐํฉ์ ์ฌ์ฉํ์.
- ์์์ ์๋ฉํธ์ฒ๋ผ ๊ตณ์ด์ง๋ ๊ตฌ์กฐ๋ค. ์์ ์ด ์ด๋ ต๋ค.
- ์กฐํฉ๊ณผ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค.
- ๊ธฐ๋ณธ ํ์ ์ ๊ฐ์ฒด๋ก ๊ฐ์ธ๊ณ ์๋ฏธ๋ฅผ ๋ถ์ฌํด ์ถ์ํ
- ๋๋ฉ์ธ์ ์ด๋ค ๊ฐ๋ ์ ์ถ์ํํ์ฌ ํํํ ๊ฐ ๊ฐ์ฒด
- ๊ฐ์ผ๋ก ์ทจ๊ธํ๊ธฐ ์ํด์ ๋ถ๋ณ์ฑ, ๋๋ฑ์ฑ, ์ ํจ์ฑ ๊ฒ์ฆ ๋ฑ์ ๋ณด์ฅํด์ผ ํ๋ค.
- ๋ถ๋ณ์ฑ : final ํ๋, setter ๊ธ์ง
- ๋๋ฑ์ฑ : ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค์ฌ๋ ๋ด๋ถ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฐ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ค. ์ด ๋,
equals()์hashCode()์ฌ์ ์๊ฐ ํ์ํ๋ค. - ์ ํจ์ฑ ๊ฒ์ฆ : ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ๋ํด ์ ํจ์ฑ์ ๊ฒ์ฆ
public class Money {
private final long value;
public Money(long value) {
if (value < 0) {
throw new IllegalArgumentException("๋์ 0์ ์ด์์ด์ด์ผ ํฉ๋๋ค.");
}
this.value = value;
}
// equals() & hashCode() ์ฌ์ ์
}
Money money1 = new Money(10000);
Money money2 = new Money(10000); // ๊ฐ์ 10000์์ด๋ผ๋ ํ๋ฉด์ ๊ฐ์น๋ฅผ ์ง๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋์ด๋ค.- Entity๋ ์๋ณ์๊ฐ ์กด์ฌํ๋ค. ์๋ณ์๊ฐ ์๋ ํ๋์ ๊ฐ์ด ๋ฌ๋ผ๋ ์๋ณ์๊ฐ ๊ฐ์ผ๋ฉด ๋๋ฑํ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ค.
- equals() & hashCode()๋ ์๋ณ์ ํ๋๋ง ๊ฐ์ง๊ณ ์ฌ์ ์ํ ์ ์๋ค.
- ์๋ณ์๊ฐ ๊ฐ์๋ฐ ์๋ณ์๊ฐ ์๋ ํ๋ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ๋ ์ธ์คํด์ค๊ฐ ์๋ค๋ฉด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํํ ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
- VO๋ ์๋ณ์ ์์ด ๋ด๋ถ ๋ชจ๋ ๊ฐ์ด ๋ค ๊ฐ์์ผ ๋๋ฑํ ๊ฐ์ฒด๋ก ์ทจ๊ธํ๋ค.
// badโ
public class Lotto {
private final List<Integer> numbers; // ๋ก๋ ๋ฒํธ๋ฅผ List๋ก ์ง์ ๊ด๋ฆฌ
public Lotto(List<Integer> numbers) {
// ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง์ด ์ธ๋ถ์ ๋
ธ์ถ๋๊ฑฐ๋ ์ค๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ๋์
if (numbers.size() != 6) {
throw new IllegalArgumentException("๋ก๋ ๋ฒํธ๋ 6๊ฐ์ฌ์ผ ํฉ๋๋ค.");
}
this.numbers = numbers;
}
// numbers๋ฅผ ์ง์ ๋ฐํํ์ฌ ์ธ๋ถ์์ ์์ ๋ ์ํ์ด ์์ (getNumbers().add(7))
public List<Integer> getNumbers() {
return numbers;
}
public boolean contains(int number) {
// ์ปฌ๋ ์
์ ๋ํ ๋จ์ ์์ ๋ฉ์๋
return numbers.contains(number);
}
}
// goodโญ
public class LottoNumbers {
private static final int LOTTO_NUMBER_SIZE = 6;
private final List<Integer> numbers;
public LottoNumbers(List<Integer> numbers) {
validateSize(numbers); // ์์ฑ ์์ ์ ์ ํจ์ฑ ๊ฒ์ฆ
validateDuplicate(numbers); // ์ค๋ณต ๊ฒ์ฆ
this.numbers = numbers;
}
// ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋ถ์ ํฌํจ (์: ํน์ ์ซ์๋ฅผ ํฌํจํ๋์ง)
public boolean contains(int number) {
return this.numbers.contains(number);
}
// ๋น์ฒจ ๋ฒํธ์ ๋ช ๊ฐ๊ฐ ์ผ์นํ๋์ง ๊ณ์ฐํ๋ ๋น์ฆ๋์ค ๋ก์ง
public int countMatch(LottoNumbers winningNumbers) {
return (int) this.numbers.stream()
.filter(winningNumbers::contains)
.count();
}
// ์ธ๋ถ์์ ์ปฌ๋ ์
์ ์ง์ ์์ ํ์ง ๋ชปํ๋๋ก ๋ฐฉ์ด์ ๋ณต์ฌ ๋๋ unmodifiableList ๋ฐํ
public List<Integer> getNumbers() {
return Collections.unmodifiableList(numbers);
}
private void validateSize(List<Integer> numbers) {
if (numbers.size() != LOTTO_NUMBER_SIZE) {
throw new IllegalArgumentException("๋ก๋ ๋ฒํธ๋ " + LOTTO_NUMBER_SIZE + "๊ฐ์ฌ์ผ ํฉ๋๋ค.");
}
}
private void validateDuplicate(List<Integer> numbers) {
if (numbers.stream().distinct().count() != numbers.size()) {
throw new IllegalArgumentException("๋ก๋ ๋ฒํธ๋ ์ค๋ณต๋ ์ ์์ต๋๋ค.");
}
}
}
// Lotto ํด๋์ค๋ ์ด์ LottoNumbers ์ผ๊ธ ์ปฌ๋ ์
์ ์ฌ์ฉ
public class Lotto {
private final LottoNumbers lottoNumbers;
private final int bonusNumber;
public Lotto(LottoNumbers lottoNumbers, int bonusNumber) {
this.lottoNumbers = lottoNumbers;
this.bonusNumber = bonusNumber;
}
// ... ๋น์ฒจ ์ฌ๋ถ ํ์ธ ๋ฑ Lotto์ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ก์ง ...
}- Enum์ ์์์ ์งํฉ์ด๋ฉฐ ์์์ ๊ด๋ จ๋ ๋ก์ง์ ๋ด์ ์ ์๋ ๊ณต๊ฐ์ด๋ค.
- ํน์ ๋๋ฉ์ธ ๊ฐ๋ ์ ๋ํด ๊ทธ ์ข ๋ฅ์ ๊ธฐ๋ฅ์ ๋ช ์์ ์ผ๋ก ํํํด์ค ์ ์๋ค.
- ๋ณ๊ฒฝ์ด ์ ๋ง ์ฆ์ ๊ฐ๋ ์ Enum๋ณด๋ค DB๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋์ ์ ์๋ค.
์ฌ์ค ์ฃผ์์ ๋ํ ๋ถ๋ถ์ ์ฌํ๊น์ง ๊ฐ๋ฐ์ ํ๋ฉด์ ํฌ๊ฒ ์ ๊ฒฝ์ ์ฐ์ง ์์๋ค. ์คํ๋ ค ๋๋ ์ฃผ์์ด๋ผ๋ ๊ฒ์ด ์ด๋ฌ์ด๋ฌํ ๊ฒ์์ ์ค๋ช ํ๊ธฐ์ ์ข๋ค๊ณ ์๊ฐํ์๋ค.
- ์ฃผ์์ ์์ฑํ ๋ ์์ฃผ ๋ณํ๋ ์ ๋ณด๋ ์ต๋ํ ์ง์ํด์ ์์ฑํ๋ค.
- ๋ง์ฝ ๊ด๋ จ ์ ์ฑ ์ด ๋ณํ๊ฑฐ๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์๋ค๋ฉด ์ฃผ์๋ ์์ง ์๊ณ ํจ๊ป ์ ๋ฐ์ดํธํ๋ค.
- ์ข์ ์ฃผ์์ด๋, ๋ชจ๋ ํํ ๋ฐฉ๋ฒ์ ์ด๋์ํด ์ฝ๋์ ์๋๋ฅผ ๋ น์ฌ๋ด๊ณ ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ ๋ฌํด์ผ ํ ์ ๋ณด๊ฐ ๋จ์์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ฃผ์์ด ๋๋ค.
๊ฐ๋ฐํ๋ฉด์ ํ๋ผ๋ฏธํฐ์ ์์๋ ๋ณ์, ๋ฉ์๋ ๋ฑ์ ์์๋ ํฌ๊ฒ ์ ๊ฒฝ์ฐ์ง ์์๋ ๊ฒ ๊ฐ๋ค.
- ๋ณ์๋ ์ฌ์ฉํ๋ ์์๋๋ก ๋์ดํ๋ค.
- ๋ฉ์๋์ ์์๋ ๊ณ ๋ คํด๋ณด์์ผ ํ๋๋ฐ, ๊ฐ์ฒด ์ ์ฅ์์ ์๊ฐํด๋ณธ๋ค.
- ํ์ํ ์ ์ ์์ค๋ณด๋ค ๋ ๋์ ์์ค์ ์์ง๋์ด๋ง
- ๊ตฌํ์ฒด๊ฐ ํ๋์ธ ์ธํฐํ์ด์ค
- ์ฝ๋ ํ์์ ์ํฅ์ ์ค ์ ์๋ค.
- ๋๋ฌด ์ด๋ฅธ ์ถ์ํ
- ์ ๋ณด๊ฐ ์จ๊ฒจ์ง๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ๋ณต์ก๋๊ฐ ๋์์ง๋ค.
- ํ๋ ๊ฐ๋ฐ์๋ค์ด ์ ๋์ ์๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ต๋ค.
- ์ง์ ๊ฐ๋ฅํ ์ํํธ์จ์ด์ ํ์ง์ด๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์๊ณ ๊ฐ๋ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์ด๋
- ํด๋ฆฐ ์ฝ๋๋ฅผ ์ถ๊ตฌํ์ง ๋ง๋ผ๋ ๊ฒ์ด ์๋๋ผ ๋ฏธ๋ ์์ ์์๋ ์ ๊ณ ์น ์ ์๋๋ก ํ๋ ์ฝ๋ ์ผ์ค๊ฐ ํ์