μΊ‘μŠν™”(encapsulation)

· β˜• 3 min read · πŸ‘€... views

μΊ‘μŠν™”(encapsulation)

  • 객체가 λ‚΄λΆ€μ μœΌλ‘œ κΈ°λŠ₯을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λŠ”μ§€λ₯Ό κ°μΆ”λŠ” 것
  • λ‚΄λΆ€μ˜ κΈ°λŠ₯ κ΅¬ν˜„μ΄ λ³€κ²½λ˜λ”λΌλ„ κ·Έ κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” μ½”λ“œλŠ” 영ν–₯을 받지 μ•ŠμŒ
    • λ‚΄λΆ€ κ΅¬ν˜„ λ³€κ²½μ˜ μœ μ—°ν•¨μ„ 쀌

1. 절차 지ν–₯ λ°©μ‹κ³Όμ˜ 비ꡐ

  • νšŒμ›μ˜ μ„œλΉ„μŠ€ 만료 λ‚ μ§œ 여뢀에 λ”°λ₯Έ 처리λ₯Ό ν•˜λŠ” 둜직
1. 절차 지ν–₯ 방식 μ½”λ“œ
1
2
3
4
5
6
@Getter
public class Member {
    ...
    private Date expireDate;
    private boolean male;
}
1
2
3
4
if(member.getExpireDate() != null 
   && member.getExpireDate().getTime() < System.currentTimeMillis()) {
    // 만료 μ‹œ 처리 둜직
}
  • Member 의 expireDate λ₯Ό ν˜„μž¬ μ‹œκ°„κ³Ό λΉ„κ΅ν•΄μ„œ 만료 μ—¬λΆ€λ₯Ό μ²΄ν¬ν•œλ‹€. 그리고 이와 λΉ„μŠ·ν•œ λ‘œμ§μ€ μ—¬λŸ¬ κ΅°λ°μ—μ„œ 쓰일 것 이닀.

  • μ‚΄μ•„μžˆλŠ” μ„œλΉ„μŠ€λŠ” μ‹œκ°„μ΄ 지남에 따라 크기가 컀질 것이고, μ œμ•½ 사항 λ˜ν•œ 생길 것이닀. 그리고 λ‹€μŒκ³Ό 같이 정책이 λ³€κ²½λ˜μ—ˆλ‹€κ³  ν•˜λ©΄…

    μ—¬μ„± νšŒμ›μΈ 경우 만료 기간이 지났어도 30일 간은 μ„œλΉ„μŠ€λ₯Ό 이용 κ°€λŠ₯ν•˜κ²Œ μ •μ±… λ³€κ²½

    1
    2
    3
    4
    5
    6
    7
    
    long days30 = 1000 * 60 * 60 * 24 * 30; // 30 days
    if((member.isMale() && member.getExpireDate() != null
        && member.getExireDate().getTime() < System.currentTimeMillis()) 
       || (!member.isMale() && member.getExpireDate() != null
        && member.getExireDate().getTime() < System.currentTimeMillis() -  days30)) {
        // 만료 μ‹œ 처리 둜직
    }
    
    • λΉ„μŠ·ν•œ 둜직이 μ—¬λŸ¬ κ΅°λ°μ—μ„œ 쓰일 ν…Œλ‹ˆ, 일일히 λ³€κ²½ν•΄μ€˜μ•Ό ν•œλ‹€.
    • κ²Œλ‹€κ°€, ν˜„μ‹€κ³Ό 같이 정책이 μˆ˜μ‹œλ‘œ λ³€κ²½λœλ‹€λ©΄..? (ㅁㄴㅇㅁ)
  • 이 뢀뢄은 What κ³Ό How 에 λŒ€ν•΄μ„œλ„ μ ‘κ·Όν•΄λ³Ό 수 μžˆλ‹€κ³  μƒκ°λ˜λŠ”λ°, μ§€λ‚˜μΉ˜κ²Œ How μ€‘μ‹¬μ μœΌλ‘œ(ν˜Ήμ€ 데이터 μ€‘μ‹¬μ μœΌλ‘œ) ν–ˆκΈ° λ•Œλ¬Έμ— 이런 λ¬Έμ œκ°€ λ°œμƒν•œ 것이닀. 그러면 μ΄λ²ˆμ—” 객체 지ν–₯ λ°©μ‹μœΌλ‘œ λ³€κ²½ν•΄λ³΄μž.

2. 객체 지ν–₯ 방식 μ½”λ“œ (μΊ‘μŠν™” 진행 μ½”λ“œ)
  • μΊ‘μŠν™”λŠ” κΈ°λŠ₯을 λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ μˆ¨κΈ°λŠ” 것
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Getter
public class Member {
    ...
    private Date expireDate;
    private boolean male;
    
    public boolean isExpired() { // 만료 μ—¬λΆ€λ₯Ό Member 객체 내뢀에 μΊ‘μŠν™”
        return expireDate != null 
            && expireDate.getTime() < System.currentTimeMills();
    }
}
1
2
3
if(member.isExpired()) {
    // λ§Œλ£Œμ— λ”°λ₯Έ 처리
}
  • λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œλŠ” isExpired() κ°€ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜μ—ˆλŠ”μ§€ μ•Œ 수 μ—†κ³ , μ•Œ ν•„μš”λ„ μ—†λ‹€. κ·Έλƒ₯ μ™„λ£Œλ˜μ—ˆλŠ”μ§€ μ•ˆ λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ 결과만 μ•Œλ©΄ λœλ‹€.

  • 절차 지ν–₯ λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 정책이 λ³€κ²½λœλ‹€λ©΄?

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    @Getter
    public class Member {
        private static final long DAYS30 = 1000 * 60 * 60 * 24 * 30; // 30 days
        ...
        private Date expireDate;
        private boolean male;
          
        public boolean isExpired() { // 만료 μ—¬λΆ€ μˆ˜μ •
            if(male) {
                return expireDate != null 
                  && expireDate.getTime() < System.currentTimeMills();
            }
            return expireDate != null 
                && expireDate.getTime() < System.currentTimeMills() - DAYS30;
        }
    }
    
    • λ‹€μŒκ³Ό 같이 isExpired() λ₯Ό μˆ˜μ •ν•΄μ£Όλ©΄ λœλ‹€.
    • 그리고 isExpired() λ₯Ό μ‚¬μš©ν•˜λŠ” 곳은 μˆ˜μ •ν•΄μ€„ ν•„μš”κ°€ μ—†λ‹€. (λ©”μ†Œλ“œ λ‚΄λΆ€κ°€ λ³€κ²½λ˜μ—ˆμ§€, λ©”μ†Œλ“œ 이름이 λ°”λ€Œκ±°λ‚˜ νŒŒλΌλ―Έν„°κ°€ 생긴 것은 μ•„λ‹ˆλ‹ˆκΉŒ)

2. μΊ‘μŠν™”μ˜ κ²°κ³Ό

  • κΈ°λŠ₯을 μΊ‘μŠν™”ν•˜λ©΄ λ‚΄λΆ€ κ΅¬ν˜„μ΄ λ³€κ²½λ˜λ”λΌλ„, κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 곳의 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆλ‹€.
  • λ³€κ²½μ˜ μœ μ—°ν•¨μ„ μ–»κ²Œ λ˜μ–΄, μ‰½κ²Œ κ΅¬ν˜„μ„ λ³€κ²½ν•  수 있게 λœλ‹€.

3. μΊ‘μŠν™”λ₯Ό μœ„ν•œ 2개의 κ·œμΉ™

1. Tell, Don't Ask

  • 데이터λ₯Ό 물어보지 μ•Šκ³ , κΈ°λŠ₯을 μ‹€ν–‰ν•΄ 달라고 λ§ν•˜λŠ” 것
  • 절차 지ν–₯μ—μ„œλŠ” 데이터λ₯Ό 직접 ν™•μΈν–ˆμ—ˆμœΌλ‚˜ (member.expireDate()), μΊ‘μŠν™”λ‘œ λ³€κ²½ν–ˆμ„ μ‹œμ—λŠ” κΈ°λŠ₯ 싀행을 μš”μ²­ν•˜λ©΄ λœλ‹€. (member.isExpired())

2. λ°λ―Έν…Œλ₯΄μ˜ 법칙 (Law of Demeter)

  • λ©”μ†Œλ“œμ—μ„œ μƒμ„±ν•œ 객체의 λ©”μ†Œλ“œλ§Œ 호좜

  • νŒŒλΌλ―Έν„°λ‘œ 받은 객체의 λ©”μ†Œλ“œλ§Œ 호좜

  • ν•„λ“œλ‘œ μ°Έμ‘°ν•˜λŠ” 객체의 λ©”μ†Œλ“œλ§Œ 호좜

    1
    2
    3
    
    member.getExpireDate().getTime() 
    // getExpireDate()κ°€ λ¦¬ν„΄ν•œ Date 객체의 
    // getTime() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆκΈ°μ— λ°λ―Έν…Œλ₯΄μ˜ 법칙 μœ„λ°˜
    
  • λ°λ―Έν…Œλ₯΄μ˜ 법칙을 지킀지 μ•ŠλŠ” μ „ν˜•μ μΈ 증상

    1. μ—°μ†λœ get λ©”μ†Œλ“œ 호좜

      1
      
      value = object.getA().getB().getValue();
      
    2. μž„μ‹œ λ³€μˆ˜μ˜ get 호좜이 많음

      1
      2
      3
      
      A a = object.getA();
      B b = a.getB();
      value = b.getValue();
      
    • 두 가지 증상이 보인닀면 λ°λ―Έν…Œλ₯΄μ˜ 법칙을 μ–΄κΈ°κ³  μžˆμ„ κ°€λŠ₯성이 λ†’κ³ , μΊ‘μŠν™”λ₯Ό μ•½ν™”μ‹œμΌœ μ½”λ“œμ˜ 변경을 μ–΄λ ΅κ²Œ λ§Œλ“œλŠ” 원인이 λœλ‹€.
    • λ”°λΌμ„œ μœ„ 두 증상이 보인닀면 확인 ν›„ 적극적으둜 μΊ‘μŠν™” ν•˜λ„λ‘ λ…Έλ ₯ν•˜μž.



  • μ°Έκ³  : κ°œλ°œμžκ°€ λ°˜λ“œμ‹œ 정볡해야할 객체 지ν–₯κ³Ό λ””μžμΈ νŒ¨ν„΄ - μ΅œλ²”κ· 

Share on

snack
WRITTEN BY
snack
Web Programmer


What's on this Page