1. μμκ³Ό μ‘°ν©
π μμλ³΄λ€ μ‘°ν©μ μ¬μ©νμ!
- μμμ μλ©νΈμ²λΌ κ΅³μ΄μ§λ κ΅¬μ‘°λ‘ μμ μ΄ μ΄λ ΅λ€.
- λΆλͺ¨μ μμμ κ²°ν©λκ° λλ€. → λΆλͺ¨μ κΈ°λ₯μ μμμ΄ κ·Έλλ‘ κ°μ Έκ°μ μ¬μ©νκΈ° λλ¬Έ
- μμμ΄ λΆλͺ¨μ λͺ¨λ νμμ κΈ°λ₯μ μκ³ μμ΄μΌνλ€. → μΊ‘μνκ° κΉ¨μ§λ κ²
- λΆλͺ¨μ νμμ κΈ°λ₯μ΄ μ‘°κΈμ΄λΌλ λ³κ²½λλ©΄ λͺ¨λ μμλ€μ΄ λ€ μν₯μ λ°λλ€.
- μ‘°ν©κ³Ό μΈν°νμ΄μ€λ₯Ό νμ©νλ κ²μ΄ μ μ°ν ꡬ쑰
- μμμ ν΅ν μ½λμ μ€λ³΅ μ κ±°κ° μ£Όλ μ΄μ λ³΄λ€ μ€λ³΅μ΄ μκΈ°λλΌλ μ μ°ν ꡬ쑰 μ€κ³κ° μ£Όλ μ΄μ μ΄ λ ν¬λ€.
- κ³Όκ±°μ νλμ¨μ΄μ μ±λ₯μ΄ λ°λΌμμ£Όμ§ μμΌλ μ½λμ μ€λ³΅ μ κ±°λ₯Ό ν΅ν΄ ν¨μ¨μ μ»λ κ²μ΄ ν¨κ³Όμ μΈ ννμμΌλ νμ¬λ νλμ¨μ΄ μ±λ₯μ΄ λ°μ΄λκΈ° λλ¬Έμ μ‘°ν©μ΄λ μΈν°νμ΄μ€λ₯Ό νμ©νμ¬ μ μ§λ³΄μνκΈ° μ¬μ΄ μ μ°ν μ½λλ₯Ό μμ±νλκ² μ’λ€.
- μμꡬ쑰λ₯Ό μ¬μ©ν΄μΌλ§ ν¨μ¨μ μΈ κ΅¬μ‘°λ μμμ μ¬μ©νκ³ , μ¬λ§νλ©΄ μ‘°ν©κ³Ό μΈν°νμ΄μ€ κ΅¬μ‘°λ‘ μ μ°νκ² νμ΄λ΄μ.
2. Value Object (VO)
- κΈ°λ³Ένμ μ κ°μ²΄λ‘ κ°μΈμ μλ―Έλ₯Ό λΆμ¬νκ³ μΆμννλ κΈ°λ²
- λλ©μΈμ μ΄λ€ κ°λ μ μΆμννμ¬ ννν κ° κ°μ²΄
- κ°μ²΄λ₯Ό κ°μΌλ‘ μ·¨κΈνκΈ° μν΄ λΆλ³μ±, λλ±μ±, μ ν¨μ± κ²μ¦ λ±μ 보μ₯ν΄μΌνλ€.
- λΆλ³μ± : final νλ, setter μ¬μ© κΈμ§
- λλ±μ± : μλ‘ λ€λ₯Έ μΈμ€ν΄μ€μ¬λ(λμΌμ±μ΄ λ¬λΌλ), λ΄λΆμ κ°μ΄ κ°μΌλ©΄ κ°μ κ° κ°μ²΄λ‘ μ·¨κΈνλ€.
→ equals() & hashCode() μ¬μ μ νμ - μ ν¨μ± κ²μ¦ : κ°μ²΄κ° μμ±λλ μμ μ κ°μ λν μ ν¨μ±μ 보μ₯
→ μμ±μμμ κ²μ¦λ‘μ§μ μΆκ°
Entityμ VO μ°¨μ΄
βΌ Entity
class UserAccount {
private String userId; // μλ³μ!!!
private String μ΄λ¦;
private String μλ
μμΌ;
private Address μ§μ£Όμ;
}
βΌ VO
class Address {
private String μλ;
private String μꡰꡬ;
private String λλ‘λͺ
;
private String 건물λ²νΈ;
}
- μ μΌ ν° μ°¨μ΄μ μ μλ³μμ΄λ€.
- Entityμλ μλ³μκ° μ‘΄μ¬νλ€.
- μλ³μκ° μλ λ€λ₯Έ νλμ κ°μ΄ λ¬λΌλ, μλ³μκ° κ°μΌλ©΄ λλ±ν κ°μ²΄λ‘ μ·¨κΈνλ€.
- equals() & hashCode()λ μλ³μ νλλ§ κ°μ§κ³ μ¬μ μν μ μμ
- μλ³μκ° κ°μλ° μλ³μκ° μλ νλΈμ κ°μ΄ μλ‘ λ€λ₯Έ λ μΈμ€ν΄μ€κ° μλ€λ©΄, κ°μ Entityκ° μκ°μ΄ μ§λ¨μ λ°λΌ λ³νν κ²μΌλ‘ μ΄ν΄ν μ μμ
- ex) userIdκ° λμΌν μνμ ν΄λν°λ²νΈκ° λ³κ²½λμ΄ phonNumber νλκ° μμ λλ€κ³ νμ λ, λ€λ₯Έ κ°μ²΄λ‘ 보λ κ²μ΄ μλλΌ μλ³μκ° λμΌνλ λμΌν κ°μ²΄λ‘ λ³Έλ€.
- μλ³μκ° κ°μλ° μλ³μκ° μλ νλΈμ κ°μ΄ μλ‘ λ€λ₯Έ λ μΈμ€ν΄μ€κ° μλ€λ©΄, κ°μ Entityκ° μκ°μ΄ μ§λ¨μ λ°λΌ λ³νν κ²μΌλ‘ μ΄ν΄ν μ μμ
- VOλ μλ³μκ° μλ€.
- λ΄λΆμ λͺ¨λ κ°μ΄ λ€ κ°μμΌ λλ±ν κ°μ²΄λ‘ μ·¨κΈλλ€.
- κ°λ μ μΌλ‘ μ 체 νλκ° λ€ κ°μ΄ μλ³μ μν μ νλ€κ³ λ³Ό μ μλ€.
- Entityμλ μλ³μκ° μ‘΄μ¬νλ€.
3. μΌκΈ 컬λ μ
μΌκΈ μλ―Ό
- λ€λ₯Έ μμμκ² μ¬μ© κ°λ₯ν λͺ¨λ μ°μ°μ μ§μνλ μμ
- μ¬μ©κ°λ₯ν λͺ¨λ μ°μ°μ΄λ? μλμ κ°μ κ²½μ°λ₯Ό μΌκΈ μλ―Όμ΄λΌκ³ λΆλ¦°λ€.
- μ΄λ€ μμκ° λ³μλ‘ ν λΉ λκ±°λ
- μ΄λ€ μμκ° νλΌλ―Έν°λ‘ μ λ¬λκ±°λ
- μ΄λ€ μμκ° ν¨μμ κ²°κ³Όλ‘ λ°νλκ±°λ
- ex) μΌκΈ ν¨μ
- ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ ν¨μλ μΌκΈ μλ―Όμ΄λΌκ³ λ³Ό μ μλ€.
ν¨μλ λ³μμ ν λΉλ μ μκ³ , μΈμλ‘ μ λ¬λ μ μκ³ , ν¨μμ κ²°κ³Όλ‘ ν¨μκ° λ°νλ μ μλ€.
- ν¨μν νλ‘κ·Έλλ° μΈμ΄μμ ν¨μλ μΌκΈ μλ―Όμ΄λΌκ³ λ³Ό μ μλ€.
- μ¬μ©κ°λ₯ν λͺ¨λ μ°μ°μ΄λ? μλμ κ°μ κ²½μ°λ₯Ό μΌκΈ μλ―Όμ΄λΌκ³ λΆλ¦°λ€.
μΌκΈ 컬λ μ
- 컬λ μ
(List, Set, Map)μ ν¬μ₯νλ©΄μ 컬λ μ
λ§μ μ μΌνκ² νλλ‘ κ°μ§λ κ°μ²΄λ₯Ό λ§νλ€.
- λ¨ νλμ 컬λ μ νλλ§ κ°μ§λ€.
- 컬λ μ μ λ€λ₯Έ κ°μ²΄μ λλ±ν λ λ²¨λ‘ λ€λ₯΄κΈ° μν΄ μ¬μ©λλ€.
- 컬λ μ
μ κ°μΈλ©΄μ μΆμννμ¬ μλ―Έλ₯Ό λ΄μ μ μκ³ , κ°κ³΅ λ‘μ§μ 보κΈμλ¦¬κ° μκΈ΄λ€.
- κ°κ³΅ λ‘μ§μ λν ν
μ€νΈλ μμ±ν μ μκ²λλ€.
→ 컬λ μ μμ²΄λ§ μ½λ λ΄μ λμλ€λλ©΄ μλ―Έλ₯Ό λ΄μ μλ ν μ€νΈλ₯Ό ν μλ μλ μ½λκ° λλ€.
μ΄λ₯Ό VOμ²λΌ νλ² κ°μΈμ κ°κ³΅ λ‘μ§μ²λΌ λ‘μ§μ λ΄λ κ²μ΄λ€.
- κ°κ³΅ λ‘μ§μ λν ν
μ€νΈλ μμ±ν μ μκ²λλ€.
- μ¬μ© μ£Όμ μ¬ν!
- λ§μ½ getterλ‘ μ»¬λ μ
μ λ°νν μΌμ΄ μκΈ°λ©΄ μΈλΆ μ‘°μμ νΌνκΈ° μν΄ κΌ μλ‘μ΄ μ»¬λ μ
μ μμ±νμ¬ λ°νν΄μΌνλ€.
→ μΈλΆμμ getterλ‘ μ»¬λ μ μ λ³κ²½ν μ μλ€λ©΄ μ 보μ μΌκ΄μ±μ΄ κΉ¨μ§κΈ° λλ¬Έ(κ°μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό 곡μ νκΈ° λλ¬Έ)
- λ§μ½ getterλ‘ μ»¬λ μ
μ λ°νν μΌμ΄ μκΈ°λ©΄ μΈλΆ μ‘°μμ νΌνκΈ° μν΄ κΌ μλ‘μ΄ μ»¬λ μ
μ μμ±νμ¬ λ°νν΄μΌνλ€.
public List<CellPosition> getPositions() {
return new ArrayList<>(positions);
}
4. Enumμ νμ©
- μμμ μ§ν©μΌλ‘ μμμ κ΄λ ¨λ λ‘μ§μ λ΄μ μ μλ 곡κ°μ΄λ€.
- μνμ νμλ₯Ό ν κ³³μμ κ΄λ¦¬ν μ μλ μΆμνλ κ°μ²΄
- νΉμ λλ©μΈ κ°λ
μ λν΄ κ·Έ μ’
λ₯μ κΈ°λ₯μ λͺ
μμ μΌλ‘ ννν΄μ€ μ μλ€.
- ex) λ μΈλ³΄μ° μ»¬λ¬ Enum ν΄λμ€λΌλ©΄? λΉ¨,μ£Ό,λ Έ,μ΄,ν,λ¨,보λ₯Ό μμλ‘ μ μν μ μλ€.
- Enumμ μμ κ°μ΄λ νμ μ λ³κ²½μ΄ μ¦μ κ²½μ° Enum λ³΄λ¨ DBλ‘ κ΄λ¦¬νλκ² λ μ¬μΈμλ μμ
5. λ€νμ± νμ©νκΈ°
- λ°λ³΅μ μΈ ifλ¬Έμ λ¨μνκ² λ§λ€μ΄λ³Ό μ μμκΉ?
private String decideCellSignFrom(CellSnapshot snapshot) {
CellSnapshotStatus status = snapshot.getStatus();
if (status == CellSnapshotStatus.EMPTY) {
return EMPTY_SIGN;
}
if (status == CellSnapshotStatus.FLAG) {
return FLAG_SIGN;
}
if (status == CellSnapshotStatus.LAND_MINE) {
return LAND_MINE_SIGN;
}
if (status == CellSnapshotStatus.NUMBER) {
return String.valueOf(snapshot.getNearbyLandMineCount());
}
if (status == CellSnapshotStatus.UNCHECKED) {
return UNCHECKED_SIGN;
}
throw new IllegalStateException("νμΈν μ μλ μ
μ
λλ€.");
}
- μ΄λ€ 쑰건μ λ§μ‘±νλ©΄ κ·Έ 쑰건μ ν΄λΉνλ νμλ₯Ό μννλ€! → μ΄ κΈ°λ₯μ ifλ¬Έμ ν΅ν΄ λ°λ³΅μ μΌλ‘ μ¬μ©νκ³ μλ€.
- ꡬ체μ μΆμμ ν΅ν΄ λ€νμ±μ νμ©ν μ μλ€.
- λ³ννλ κ² ↔ λ³νμ§ μλ κ²
- 쑰건 & νμ ↔ 쑰건μ λ§μ‘±νλκ°?, νμλ₯Ό μννλ€.
- λ³ννλ κ²μ μ λμ μΌλ‘ ν΄κ²°ν΄μ£Όμ΄μΌνκ³ , λ³νμ§ μλ κ²μ μ§μΌμΌ OCPλ₯Ό μ§ν€λ ꡬ쑰κ°λ¨
- λ³νμ§ μλ κ²μ μΈν°νμ΄μ€ννκ³ , λ³νλ κ²μ ꡬ체ν΄λμ€λ‘ μμ±νμ¬ λ€νμ±μ νμ©νλ€.
- Enumμ νμ©ν μλμλ€.
6. μ¨κ²¨μ Έ μλ λλ©μΈ κ°λ λμΆνκΈ°
- λλ©μΈ μ§μμ λ§λλ κ²μ΄ μλλΌ λ°κ²¬νλ κ²μ΄λ€.
- κ°μ²΄ μ§ν₯μ νμ€μ 100% λ°μνλ λκ΅¬κ° μλ νλ΄λ΄λ κ²μΌλ‘ νμ€ μΈκ³μμ μ½κ² μΈμ§νμ§ λͺ»νλ κ°λ λ λμΆν΄μ μ¬μ©ν΄μΌ ν λκ° μλ€.
- μ€κ³ ν λλ κ·Όμμ , κ±°μμ κ΄μ μμ μ΅λν λ―Έλλ₯Ό μμΈ‘νκ³ , μκ°μ΄ μ§λ λ§μ½ νλ Έλ€λ κ²μ μΈμ§νλ©΄ μΈμ λ λμμ¬ μ μλλ‘ μ½λλ₯Ό μμ±ν΄μΌνλ€.
π μλ²½ν μ€κ³λ μλ€. κ·Έ λΉμμ μ΅μ μ΄ μμ λΏ
μΆμ² : μΈνλ°, μλ°μ
ν΄λ½3κΈ° - λ°±μλ μ½λ
π Readable Code: μ½κΈ° μ’μ μ½λλ₯Ό μμ±νλ μ¬κ³ λ²
π Practical Testing: μ€μ©μ μΈ ν
μ€νΈ κ°μ΄λ
'μλ°μ ν΄λ½3κΈ° - λ°±μλμ½λ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| μΉμ 4. SOLID (0) | 2025.03.07 |
|---|---|
| μΉμ 3. λ Όλ¦¬,μ¬κ³ μ νλ¦ + μΉμ 4.κ°μ²΄ μ§ν₯ ν¨λ¬λ€μ (1) | 2025.03.07 |
| μΉμ 1. intro + μΉμ 2. μΆμμ λν΄ (1) | 2025.03.05 |
| μΈνλ° μλ°μ ν΄λ½3κΈ° λ°±μλ μ½λ μ°Έκ° μ μ²! (0) | 2025.03.05 |