μμ±μ μ£Όμ
μ μ νν΄λΌ!
κ³Όκ±°μλ μμ μ μ£Όμ κ³Ό νλ μ£Όμ μ λ§μ΄ μ¬μ©νμ§λ§, μ΅κ·Όμλ μ€νλ§μ ν¬ν¨ν DI νλ μμν¬ λλΆλΆμ΄
μμ±μ μ£Όμ μ κΆμ₯νλ€. κ·Έ μ΄μ λ λ€μκ³Ό κ°λ€.
λΆλ³
λλΆλΆμ μμ‘΄κ΄κ³ μ£Όμ μ νλ² μΌμ΄λλ©΄ μ ν리μΌμ΄μ μ’ λ£μμ κΉμ§ μμ‘΄κ΄κ³λ₯Ό λ³κ²½ν μΌμ΄ μλ€.
μ€νλ € λλΆλΆμ μμ‘΄κ΄κ³λ μ ν리μΌμ΄μ μ’ λ£ μ κΉμ§ λ³νλ©΄ μλλ€.(λΆλ³ν΄μΌ νλ€.)
μμ μ μ£Όμ
μ μ¬μ©νλ©΄, setXxx λ©μλλ₯Ό publicμΌλ‘ μ΄μ΄λμ΄μΌ νλ€.
λκ΅°κ° μ€μλ‘ λ³κ²½ν μ λ μκ³ , λ³κ²½νλ©΄ μλλ λ©μλλ₯Ό μ΄μ΄λλ κ²μ μ’μ μ€κ³ λ°©λ²μ΄ μλλ€.
μμ±μ μ£Όμ μ κ°μ²΄λ₯Ό μμ±ν λ λ± 1λ²λ§ νΈμΆλλ―λ‘ μ΄νμ νΈμΆλλ μΌμ΄ μλ€. λ°λΌμ λΆλ³νκ² μ€κ³ν μ μλ€.
final ν€μλ
μμ±μ μ£Όμ μ μ¬μ©νλ©΄ νλμ final ν€μλλ₯Ό μ¬μ©ν μ μλ€.
κ·Έλμ μμ±μμμ νΉμλΌλ κ°μ΄ μ€μ λμ§ μλ μ€λ₯λ₯Ό μ»΄νμΌ μμ μ λ§μμ€λ€.
μ°Έκ³ : μμ μ μ£Όμ μ ν¬ν¨ν λλ¨Έμ§ μ£Όμ λ°©μμ λͺ¨λ μμ±μ μ΄νμ νΈμΆλλ―λ‘, νλμ final ν€μλλ₯Ό μ¬μ©ν μ μλ€.
μ€μ§ μμ±μ μ£Όμ λ°©μλ§ final ν€μλλ₯Ό μ¬μ©ν μ μλ€.
final ν€μλ / μμ±μ(constructor)
final ν€μλλ λ³μ(variable), λ©μλ(method), λλ ν΄λμ€(class)μ μ¬μ©λ μ μμ΅λλ€.
final ν€μλλ₯Ό λΆμ΄λ©΄ 무μΈκ°λ₯Ό μ ννλ€λ μλ―Έ
λ³μ(variable)
λ³μμ finalμ λΆμ΄λ©΄ μ΄ λ³μλ μμ ν μ μλ€λ μλ―Έ
μμ λ μ μκΈ° λλ¬Έμ μ΄κΈ°ν κ°μ νμμ μ λλ€. λ§μ½μ κ°μ²΄μμ λ³μλΌλ©΄ μμ±μ μ΄κΈ°νκΉμ§λ νμ©
λ©μλ(method)
λ©μλμ finalμ λΆμ΄λ©΄ overrideλ₯Ό μ ν
μμ λ°μ ν΄λμ€μμ ν΄λΉ λ©μλλ₯Ό μμ ν΄μ μ¬μ©νμ§ λͺ»νλλ‘ ν μ μλκ²μ΄ λ©μλμ finalμ λΆμ΄λ κ²
ν΄λμ€(Class)
final ν€μλλ₯Ό ν΄λμ€μ λΆμ΄λ©΄ μμ λΆκ°λ₯ ν΄λμ€
λ€λ₯Έ ν΄λμ€μμ μμνμ¬ μ¬μ μλ₯Ό ν μ μλ κ²μ λλ€
μΈμ€ν΄μ€ λ³μμ μ΄κΈ°ν
ν΄λμ€λ₯Ό κ°μ§κ³ κ°μ²΄λ₯Ό μμ±νλ©΄, ν΄λΉ κ°μ²΄λ λ©λͺ¨λ¦¬μ μ¦μ μμ±λ©λλ€.
νμ§λ§ μ΄λ κ² μμ±λ κ°μ²΄λ λͺ¨λ μΈμ€ν΄μ€ λ³μκ° μμ§ μ΄κΈ°νλμ§ μμ μνμ λλ€.
μμ±μ(constructor)
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
κ°μ²΄μ μμ±κ³Ό λμμ μΈμ€ν΄μ€ λ³μλ₯Ό μνλ κ°μΌλ‘ μ΄κΈ°νν μ μλ λ©μλ
μμ±μ(constructor)μ μ΄λ¦μ ν΄λΉ ν΄λμ€μ μ΄λ¦κ³Ό κ°μμΌ ν©λλ€.
μ΄λ¬ν μμ±μλ λ€μκ³Ό κ°μ νΉμ§μ κ°μ§λλ€.
1. μμ±μλ λ°νκ°μ΄ μμ§λ§, λ°ν νμ μ voidνμΌλ‘ μ μΈνμ§ μμ΅λλ€.
2. μμ±μλ μ΄κΈ°νλ₯Ό μν λ°μ΄ν°λ₯Ό μΈμλ‘ μ λ¬λ°μ μ μμ΅λλ€.
3. κ°μ²΄λ₯Ό μ΄κΈ°ννλ λ°©λ²μ΄ μ¬λ¬ κ° μ‘΄μ¬ν κ²½μ°μλ νλμ ν΄λμ€κ° μ¬λ¬ κ°μ μμ±μλ₯Ό κ°μ§ μ μμ΅λλ€.
μ¦, μμ±μλ νλμ λ©μλμ΄λ―λ‘, λ©μλ μ€λ²λ‘λ©μ΄ κ°λ₯νλ€λ μλ―Έμ λλ€.
λ©μλ μ€λ²λ‘λ©(overloading) : κ°μ μ΄λ¦μ λ©μλλ₯Ό μ€λ³΅νμ¬ μ μνλ κ²μ μλ―Έν©λλ€.
맀κ°λ³μμ κ°μλ νμ μ λ€λ₯΄κ² νλ©΄, νλμ μ΄λ¦μΌλ‘ λ©μλλ₯Ό μμ±ν μ μμ΅λλ€.
μμ±μμ νΈμΆ
μλ°μμλ new ν€μλλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±ν λ μλμΌλ‘ μμ±μκ° νΈμΆλ©λλ€.
"μμ±μ μ£Όμ μ νΈμΆ μμ μ νΈμΆλκ³ νλΌλ―Έν°κ° μ΄κΈ°νλλ―λ‘ finalμ΄ μ¬μ©κ°λ₯νμ§λ§,
setterλ κ°μ²΄κ° μμ±λ λ€μμ νΈμΆ λ° μ΄κΈ°νλλ―λ‘ finalμ μ¬μ©ν μ μλ€."
final ν€μλλ κ°λ¨ν λ§νλ©΄ λ©€λ² λ³μλ₯Ό 'μμ'(const)λ‘ λ§λ€κ² λ€λ λ»μ λλ€.
λ³μμ κ²½μ°λ κ·Έλ κ³ λ©μλμ λΆλ finalμ μ¬μ μκ° λΆκ°λ₯, ν΄λμ€μ λΆλ finalμ μμ λΆκ°λ₯ λ±μΌλ‘ μλ―Έκ° λ¬λΌμ§λλ€.
μμλ νλ² κ°μ ν λΉνλ©΄, λ€μ κ·Έ κ°μ λ³κ²½ν μ μμμ λ§ν©λλ€.
κ·Έλμ μλ°μμλ μμλ μ μΈκ³Ό λμμ κ°μ ν λΉνλλ‘ μ ννκ³ μμ΅λλ€.
private final int score = 0;
κ·Έλ¬λ μ μΈκ³Ό λμμ κ°μ ν λΉνμ§ μμλ λλ μμΈκ° μλλ°, μμ±μμμ μμλ₯Ό μ΄κΈ°ν ν λ μ λλ€.
μμ±μλ κ°μ²΄λ₯Ό μμ±νκΈ° μν΄ 'λ°λμ' κ±°μ³μΌ νλ κ³Όμ μ΄κ³ ,
μ¬κΈ°μ μμκ°μ μ΄κΈ°νλ₯Ό νκ³ μλ€λ©΄ μ΄λ 'νμ€ν μμκ° μ΄κΈ°ν λ¨μ 보μ₯'ν©λλ€.
κ·Έλμ μ΄λ° κ²½μ°λ μ»΄νμΌμ νκ° ν©λλ€.
private final int score;
public SomeClass(int score) {
this.score = score;
}
setterλ‘ λ©€λ² λ³μλ₯Ό μ€μ νλ€λ κ²μ κ°μ²΄κ° μμ±λλ κ³Όμ μ΄ λͺ¨λ λλ μ΄νμ
setter λ©μλλ₯Ό νΈμΆνμ¬ λ©€λ² λ³μμ κ°μ ν λΉνκ² λ€λ λ»μ λλ€.
λ§μ½ μ΄ κ°μ²΄μ λ©€λ² λ³μμ€ μμκ° μμκ²½μ°, μμκ° μμ±μ λμμΌλ μΈμ μ΄κΈ°ν λ μ§λ₯Ό μ»΄νμΌλ¬κ° μ μ μμ΅λλ€.
κ·Έλμ μ΄λ° κ²½μ° final ν€μλλ₯Ό μ°μ§ λͺ»νλλ‘ μ»΄νμΌλ¬κ° λ§μ΅λλ€.
μ 리
μμ±μ μ£Όμ λ°©μμ μ ννλ μ΄μ λ μ¬λ¬κ°μ§κ° μμ§λ§,
νλ μμν¬μ μμ‘΄νμ§ μκ³ , μμν μλ° μΈμ΄μ νΉμ§μ μ μ΄λ¦¬λ λ°©λ²μ΄κΈ°λ νλ€.
κΈ°λ³ΈμΌλ‘ μμ±μ μ£Όμ
μ μ¬μ©νκ³ , νμ κ°μ΄ μλ κ²½μ°μλ μμ μ μ£Όμ
λ°©μμ μ΅μ
μΌλ‘ λΆμ¬νλ©΄ λλ€.
μμ±μ μ£Όμ κ³Ό μμ μ μ£Όμ μ λμμ μ¬μ©ν μ μλ€.
νμ μμ±μ μ£Όμ μ μ νν΄λΌ! κ·Έλ¦¬κ³ κ°λ μ΅μ μ΄ νμνλ©΄ μμ μ μ£Όμ μ μ νν΄λΌ. νλ μ£Όμ μ μ¬μ©νμ§ μλκ² μ’λ€.
둬볡과 μ΅μ νΈλλ
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
λ§μ κ°λ°μ ν΄λ³΄λ©΄, λλΆλΆμ΄ λ€ λΆλ³μ΄κ³ , κ·Έλμ λ€μκ³Ό κ°μ΄ νλμ final ν€μλλ₯Ό μ¬μ©νκ² λλ€.
κ·Έλ°λ° μμ±μλ λ§λ€μ΄μΌ νκ³ , μ£Όμ λ°μ κ°μ λμ νλ μ½λλ λ§λ€μ΄μΌ νκ³ ...
νλ μ£Όμ
μ²λΌ μ’ νΈλ¦¬νκ² μ¬μ©νλ λ°©λ²μ μμκΉ?
μ΄μ 둬볡μ μ μ©ν΄λ³΄μ.
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
μμ±μλ λ§λ€μ΄μΌ νκ³ , μ£Όμ λ°μ κ°μ λμ νλ μ½λλ λ§λ€μ΄μΌ νκ³ ...
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
둬볡 λΌμ΄λΈλ¬λ¦¬κ° μ 곡νλ @RequiredArgsConstructor κΈ°λ₯μ μ¬μ©νλ©΄
finalμ΄ λΆμ νλλ₯Ό λͺ¨μμ μμ±μλ₯Ό μλμΌλ‘ λ§λ€μ΄μ€λ€.
μ 리
μ΅κ·Όμλ μμ±μλ₯Ό λ± 1κ° λκ³ , @Autowired λ₯Ό μλ΅νλ λ°©λ²μ μ£Όλ‘ μ¬μ©νλ€.
μ¬κΈ°μ Lombok λΌμ΄λΈλ¬λ¦¬μ @RequiredArgsConstructor ν¨κ» μ¬μ©νλ©΄
κΈ°λ₯μ λ€ μ 곡νλ©΄μ, μ½λλ κΉλνκ² μ¬μ©ν μ μλ€.