Amenable
Amenable's Blog
Amenable
  • λΆ„λ₯˜ 전체보기 (189)
    • πŸ“‚ JAVA (87)
      • μ΄νŽ™ν‹°λΈŒ μžλ°” (65)
      • μ£Όμš” κ°œλ… (22)
    • πŸ“‚ 개발 μ„œμ  (22)
      • μ‹€μš©μ£Όμ˜ ν”„λ‘œκ·Έλž˜λ¨Έ (1)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (2)
      • 클린 μ½”λ“œ (8)
      • ν•¨κ»˜ 자라기 (1)
      • 그림으둜 λ°°μš°λŠ” HTTP&Network Basic (10)
    • πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€ (8)
      • κ°œλ… (8)
      • λ¬Έμ œν’€μ΄ (0)
    • πŸ“‚ λ„€νŠΈμ›Œν¬ (14)
      • κ°œλ… (6)
      • 성곡과 μ‹€νŒ¨λ₯Ό κ²°μ •ν•˜λŠ” 1%의 λ„€νŠΈμ›Œν¬ 원리 (8)
    • πŸ“‚ μŠ€ν”„λ§ (13)
      • κΈ°λ³Έ κ°œλ… (13)
    • πŸ“‚ WEB (5)
    • πŸ“‚ 자료ꡬ쑰 (12)
      • κ°œλ… (2)
      • μ •λ ¬ (8)
      • 트리 (2)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜ (10)
      • μ΅œμ†Œμ‹ μž₯트리 (2)
      • μ΅œλ‹¨ 경둜 (2)
      • λ¬Έμžμ—΄ (2)
      • ETC (4)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄ (4)
      • BOJ_λ°±μ€€ (4)
    • πŸ“‚ ν”„λ‘œκ·Έλž˜λ° (3)
    • πŸ“‚ DevOps (2)
      • 배포 (2)
    • πŸ“‚ ν›„κΈ° (8)
      • μš°μ•„ν•œ ν…Œν¬μ½”μŠ€(ν”„λ¦¬μ½”μŠ€) (4)
      • 2023λ…„ (3)
      • 2024λ…„ (1)
    • πŸ“‚ 회고 (1)
      • 2023λ…„ (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸš€ GitHub

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Amenable

Amenable's Blog

μ μ‹œμ— 방어적 볡사본을 λ§Œλ“€λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ50)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

μ μ‹œμ— 방어적 볡사본을 λ§Œλ“€λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ50)]

2023. 12. 10. 15:02

  μžλ°”λŠ” 일반적으둜 μ•ˆμ „ν•œ μ–Έμ–΄λ‹€.

  ν•˜μ§€λ§Œ 아무리 μžλ°”λΌ 해도 λ‹€λ₯Έ ν΄λž˜μŠ€λ‘œλΆ€ν„°μ˜ 침범을 μ•„λ¬΄λŸ° λ…Έλ ₯ 없이 λ‹€ 막을 수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈκ°€ μš°λ¦¬μ˜ λΆˆλ³€μ‹μ„ κΉ¨λœ¨λ¦¬λ € ν˜ˆμ•ˆμ΄ λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜κ³  λ°©μ–΄μ μœΌλ‘œ ν”„λ‘œκ·Έλž˜λ°ν•΄μ•Ό ν•œλ‹€.

 

πŸ“™ 1. 첫 번째 곡격 - μƒμ„±μž 이용

  'μ‹œμž‘ μ‹œκ°μ΄ μ’…λ£Œ μ‹œκ°λ³΄λ‹€ λŠ¦μ„ 수 μ—†λ‹€λŠ” λΆˆλ³€μ‹'이 μžˆλŠ” λ‹€μŒκ³Ό 같은 ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  ν•˜μž.

public final class Period {
    private final Date start;
    private final Date end;
    
    /**
     * @param start μ‹œμž‘ μ‹œκ°
     * @param end μ’…λ£Œ μ‹œκ°; μ‹œμž‘ μ‹œκ°λ³΄λ‹€ λ’€μ—¬μ•Ό ν•˜λ‚Ÿ.
     * @throws IllegalArgumentException μ‹œμž‘ μ‹œκ°μ΄ μ’…λ£Œ μ‹œκ°λ³΄λ‹€ λŠ¦μ„ λ•Œ λ°œμƒν•œλ‹€.
     * @throws NullPointerException startλ‚˜ endκ°€ null이면 λ°œμƒν•œλ‹€.
    */
    public Period(Date start, Date end) {
        if(start.compareTo(end) > 0) 
            throw new IllegalArgumentException(
                start + "κ°€ " + end + "보닀 λŠ¦λ‹€.");
        this.start = start;
        this.end = end;
    }
    
    public Date start() {
        return start;
    }
    
    public Date end() {
        return end;
    }
    
    ...
}

  이 ν΄λž˜μŠ€λŠ” Dateκ°€ κ°€λ³€μ΄λΌλŠ” 사싀을 μ΄μš©ν•œλ‹€λ©΄ μ–΄λ ΅μ§€ μ•Šκ²Œ λΆˆλ³€μ‹μ΄ κΉ¨μ§„λ‹€.

Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
end.setYear(78); // p의 λ‚΄λΆ€λ₯Ό μˆ˜μ •!!

  μ™ΈλΆ€ κ³΅κ²©μœΌλ‘œλΆ€ν„° Period μΈμŠ€ν„΄μŠ€μ˜ λ‚΄λΆ€λ₯Ό λ³΄ν˜Έν•˜λ €λ©΄ μƒμ„±μžμ—κ²Œ 받은 κ°€λ³€ λ§€κ°œλ³€μˆ˜ 각각을 λ°©μ–΄μ μœΌλ‘œ 볡사(defensive copy) ν•΄μ•Ό ν•œλ‹€.

public Period(Date start, Date end) {
    this.start = new Date(start.getTime());
    this.end = new Date(end.getTime());
    
    if(this.start.compareTo(this.end) > 0)
        throw new IllegalArgumentException(
            this.start + "κ°€ " + this.end + "보닀 λŠ¦λ‹€.");
}

  그리고 Period μΈμŠ€ν„΄μŠ€ μ•ˆμ—μ„œλŠ” 원본이 μ•„λ‹Œ 볡사본을 μ΄μš©ν•΄μ•Ό ν•œλ‹€.

 

  μ΄λ•Œ, λ§€κ°œλ³€μˆ˜μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜κΈ° 전에 방어적 볡사본을 λ§Œλ“€κ³ , 이 λ³΅μ‚¬λ³ΈμœΌλ‘œ μœ νš¨μ„±μ„ κ²€μ‚¬ν•œ 점을 μ£Όλͺ©ν•˜μž. μˆœμ„œκ°€ λΆ€μžμ—°μŠ€λŸ¬μ›Œ λ³΄μ΄κ² μ§€λ§Œ λ°˜λ“œμ‹œ μ΄λ ‡κ²Œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. λ©€ν‹°μŠ€λ ˆλ”© ν™˜κ²½μ΄λΌλ©΄ μ›λ³Έ κ°μ²΄μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•œ ν›„ λ³΅μ‚¬λ³Έμ„ λ§Œλ“œλŠ” κ·Έ μ°°λ‚˜μ˜ μ·¨μ•½ν•œ μˆœκ°„에 λ‹€λ₯Έ μŠ€λ ˆλ“œκ°€ μ›λ³Έ κ°μ²΄λ₯Ό μˆ˜μ •ν•  μœ„ν—˜μ΄ μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

  λ˜ν•œ, 방어적 볡사에 Date의 clone λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 점에도 μ£Όλͺ©ν•˜μž. DateλŠ” final이 μ•„λ‹ˆλ―€λ‘œ clone이 Dateκ°€ μ •μ˜ν•œ κ²Œ μ•„닐 μˆ˜ μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ“™ 2. 두 번째 곡격 - μ ‘κ·Όμž 이용

  μ•„μ§κΉŒμ§€ μ•ˆμ „ν•˜μ§€ μ•Šλ‹€. μ ‘κ·Όμž λ©”μ„œλ“œκ°€ λ‚΄λΆ€μ˜ κ°€λ³€ 정보λ₯Ό 직접 λ“œλŸ¬λ‚΄κ³  μžˆλ‹€. κ·Έλž˜μ„œ μ•„λž˜μ™€ κ°™μ€ κ³΅κ²©μ΄ κ°€λŠ₯ν•˜λ‹€.

Date start = new Date();
Date end = new Date();
Period p = new Period(start, end);
p.end().setYear(78); // p의 λ‚΄λΆ€λ₯Ό λ³€κ²½!!!

 

  이λ₯Ό λ°©μ–΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹¨μˆœνžˆ μ ‘κ·Όμžκ°€ κ°€λ³€ ν•„λ“œμ˜ 방어적 볡사본을 λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

public Date start() {
    return new Date(start.getTime());
}

public Date end() {
    return new Date(end.getTime());
}

 

πŸ“™ 3. μΆ”κ°€ λ‚΄μš© 정리

  μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ λ‚΄μš©μ„ 톡해 방어적 볡사본을 μƒμ„±μžμ™€ μ ‘κ·Όμžλ₯Ό μ²˜λ¦¬ν•  λ•Œλ§Œ λ§Œλ“ λ‹€κ³  μƒκ°ν•˜μ§€ 말자.

  λ©”μ„œλ“œλ“  μƒμ„±μžλ“  ν΄λΌμ΄μ–ΈνŠΈκ°€ μ œκ³΅ν•œ 객체의 μ°Έμ‘°λ₯Ό λ‚΄λΆ€μ˜ μžλ£Œκ΅¬μ‘°μ— 보관해야 ν•  λ•Œλ©΄ ν•­μ‹œ κ·Έ 객체가 잠재적으둜 변경될 수 μžˆλŠ”μ§€λ₯Ό 생각해야 ν•œλ‹€.

  λ˜ν•œ, ν΄λž˜μŠ€κ°€ λΆˆλ³€μ΄λ“  가변이든, 가변인 λ‚΄λΆ€ 객체λ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ μ‹¬μ‚¬μˆ™κ³ ν•΄μ•Ό ν•œλ‹€.

 

  방어적 λ³΅μ‚¬μ—λŠ” μ„±λŠ₯ μ €ν•˜κ°€ λ”°λ₯΄κ³ , 또 항상 μ“Έ 수 μžˆλŠ” 것도 μ•„λ‹ˆλ‹€. (같은 νŒ¨ν‚€μ§€μ— μ†ν•˜λŠ” λ“±μ˜ 이유둜) ν˜ΈμΆœμžκ°€ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠμœΌλ¦¬λΌ ν™•μ‹ ν•˜λ©΄ 방어적 볡사λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 상황이라도 ν˜ΈμΆœμžμ—μ„œ ν•΄λ‹Ή λ§€κ°œλ³€μˆ˜λ‚˜ λ°˜ν™˜κ°’μ„ μˆ˜μ •ν•˜μ§€ 말아야 함은 λͺ…ν™•νžˆ λ¬Έμ„œν™”ν•˜λŠ” 게 μ’‹λ‹€. λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ μ‚¬μš©ν•˜λŠ” κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œ ν™•μ‹€νžˆ λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.

 

ν•΄λ‹Ή 글은 Joshua Bloch λ‹˜μ˜ 'Effective Java 3/E'λ₯Ό μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

'πŸ“‚ JAVA > μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

λ‹€μ€‘μ •μ˜λŠ” μ‹ μ€‘νžˆ μ‚¬μš©ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ52)]  (1) 2023.12.11
λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‹ μ€‘νžˆ μ„€κ³„ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ51)]  (0) 2023.12.10
λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ49)]  (0) 2023.12.10
슀트림 λ³‘λ ¬ν™”λŠ” μ£Όμ˜ν•΄μ„œ μ μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ48)]  (0) 2023.12.10
λ°˜ν™˜ νƒ€μž…μœΌλ‘œλŠ” μŠ€νŠΈλ¦Όλ³΄λ‹€ μ»¬λ ‰μ…˜μ΄ λ‚«λ‹€ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ47)]  (1) 2023.12.09
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • λ‹€μ€‘μ •μ˜λŠ” μ‹ μ€‘νžˆ μ‚¬μš©ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ52)]
    • λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μ‹ μ€‘νžˆ μ„€κ³„ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ51)]
    • λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λΌ - [8μž₯. λ©”μ„œλ“œ(μ•„μ΄ν…œ49)]
    • 슀트림 λ³‘λ ¬ν™”λŠ” μ£Όμ˜ν•΄μ„œ μ μš©ν•˜λΌ - [7μž₯. λžŒλ‹€μ™€ 슀트림(μ•„μ΄ν…œ48)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”