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

상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ19)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ19)]

2023. 4. 29. 09:24

  상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λŠ” 방법듀을 μ•Œμ•„λ³΄μž.

 

1. μƒμ†μš© ν΄λž˜μŠ€λŠ” μž¬μ •μ˜ν•  μˆ˜ μžˆλŠ” λ©”μ„œλ“œλ“€μ„ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ μ΄μš©ν•˜λŠ”μ§€(자기 μ‚¬μš©) λ¬Έμ„œλ‘œ 남겨야 ν•œλ‹€. πŸ›Ί

  μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” λͺ¨λ“  상황을 λ¬Έμ„œλ‘œ 남겨야 ν•œλ‹€.

  유λͺ…ν•œ 격언 쀑 ν•˜λ‚˜μΈ "쒋은 API λ¬Έμ„œλž€ 'μ–΄λ–»κ²Œ'κ°€ μ•„λ‹Œ '무엇'을 ν•˜λŠ”μ§€λ₯Ό μ„€λͺ…ν•΄μ•Ό ν•œλ‹€"와 λŒ€μΉ˜λ˜λŠ” λ‚΄μš©μ΄κΈ°λ„ ν•˜λ‹€.    ν•˜μ§€λ§Œ 상속이 μΊ‘μŠν™”λ₯Ό ν•΄μΉ˜κΈ° λ•Œλ¬Έμ— 클래슀λ₯Ό μ•ˆμ „ν•˜κ²Œ 상속할 수 μžˆλ„λ‘ ν•˜λ €λ©΄ 'μƒμ†λ§Œ μ•„λ‹ˆμ—ˆλ‹€λ©΄ κΈ°μˆ ν•˜μ§€ μ•Šμ•˜μ–΄μ•Ό ν• ' λ‚΄λΆ€ κ΅¬ν˜„ 방식을 μ„€λͺ…ν•΄μ•Ό ν•œλ‹€.

  AbstractCollection.java의 remove λ©”μ„œλ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

  μœ„μ™€ 같이 API λ¬Έμ„œμ˜ λ©”μ„œλ“œ μ„€λͺ… 끝에 "Implementation Requirements"κ°€ 뢙은 κ±Έ λ³Ό 수 μžˆλŠ”λ° 이것이 λ‚΄λΆ€ λ™μž‘ 방식을 μ„€λͺ…ν•˜λŠ” 곳이닀. IntelliJ의 였λ₯Έμͺ½ μœ„μ— μžˆλŠ” Reader Modeλ₯Ό μ„ νƒν•˜λ©΄ μœ„μ™€ 같은 ν˜•νƒœλ‘œ λ‚˜μ˜¨λ‹€. μ•„λž˜λŠ” Reader Modeλ₯Ό μ·¨μ†Œν•œ κ²½μš°μ΄λ‹€.

// AbstractCollection.java

/**
 * {@inheritDoc}
 *
 * @implSpec
 * This implementation iterates over the collection looking for the
 * specified element.  If it finds the element, it removes the element
 * from the collection using the iterator's remove method.
 *
 * <p>Note that this implementation throws an
 * {@code UnsupportedOperationException} if the iterator returned by this
 * collection's iterator method does not implement the {@code remove}
 * method and this collection contains the specified object.
 *
 * @throws UnsupportedOperationException {@inheritDoc}
 * @throws ClassCastException            {@inheritDoc}
 * @throws NullPointerException          {@inheritDoc}
 */
public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
        while (it.hasNext()) {
            if (it.next()==null) {
                it.remove();
                return true;
            }
        }
    } else {
        while (it.hasNext()) {
            if (o.equals(it.next())) {
                it.remove();
                return true;
            }
        }
    }
    return false;
}

  ν•΄λ‹Ή μ ˆμ€ λ©”μ„œλ“œ 주석에 @implSpec νƒœκ·Έλ₯Ό λΆ™μ—¬μ£Όλ©΄ μžλ°”λ… 도ꡬ가 생성해 μ€€λ‹€. 이 νƒœκ·ΈλŠ” κΈ°λ³Έκ°’μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같은 μ˜΅μ…˜μ„ μΆ”κ°€ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

-tag "implSpec:a:Implementation Requirements:"

 

2. 클래슀의 λ‚΄λΆ€ λ™μž‘ κ³Όμ • 쀑간에 끼어듀 수 μžˆλŠ” ν›…(hook)을 잘 μ„ λ³„ν•˜μ—¬ protected λ©”μ„œλ“œ ν˜•νƒœλ‘œ κ³΅κ°œν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€. πŸš™

  java.util.AbstractList의 removeRange λ©”μ„œλ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

    ...
    
    public void clear() {
        removeRange(0, size());
    }
    
    protected void removeRange(int fromIndex, int toIndex) {
        ListIterator<E> it = listIterator(fromIndex);
        for (int i=0, n=toIndex-fromIndex; i<n; i++) {
            it.next();
            it.remove();
        }
    }
}

  이 λ©”μ„œλ“œλŠ” protected둜 μ œκ³΅ν•˜κ³  μžˆλ‹€. κ·Έ μ΄μœ λŠ” clear λ©”μ„œλ“œμ—μ„œ 이λ₯Ό μ‚¬μš©ν•˜μ—¬ clearλ©”μ„œλ“œλ₯Ό κ³ μ„±λŠ₯으둜 λ§Œλ“€κΈ° μ‰½κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλ‹€. λ‹Ήμ—°ν•œ λ§μ΄μ§€λ§Œ private둜 μ„€μ •ν•˜λ©΄ 상속받은 κ³³μ—μ„œ ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†κ³ , 클래슀의 λ‚΄λΆ€ λ™μž‘ κ³Όμ •μ—μ„œλ§Œ μ‚¬μš©ν•  κ²ƒμ΄λ―€λ‘œ public으둜 μ„€μ •ν•  ν•„μš”λ„ μ—†λ‹€.

 

3. μƒμ†μš© 클래슀λ₯Ό μ‹œν—˜ν•˜λŠ” 방법은 직접 ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄λ³΄λŠ” 것이 '유일'ν•˜λ‹€. 🚜

  2λ²ˆμ—μ„œ μ‚΄νŽ΄λ³Έ 것과 같이 μƒμ†μš© 클래슀λ₯Ό 섀계할 λ•Œ μ–΄λ–€ λ©”μ„œλ“œλ₯Ό protected둜 λ…ΈμΆœν•΄μ•Ό ν• κΉŒ? μ •ν•΄μ§„ 정닡은 μ—†λ‹€. μ•„μ‰½μ§€λ§Œ 잘 μ˜ˆμΈ‘ν•΄ 보고, μ‹€μ œ ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄ μ‹œν—˜ν•΄ λ³΄λŠ” 것이 μ΅œμ„ μ΄λ‹€.

  μ±…μ—μ„œλŠ” ν•˜μœ„ 클래슀λ₯Ό 3개 정도 λ§Œλ“€μ–΄ λ³΄λŠ” 것을 μΆ”μ²œν•˜κ³  μžˆλ‹€. 그리고 이 쀑 ν•˜λ‚˜ 이상은 제 3μžκ°€ μž‘μ„±ν•˜λŠ” 것을 μΆ”μ²œν•œλ‹€.

 

4. μƒμ†μš© 클래슀의 μƒμ„±μžλŠ” μ§μ ‘μ μœΌλ‘œλ“  κ°„μ ‘μ μœΌλ‘œλ“  μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆ λœλ‹€. 🚎

  μƒμœ„ 클래슀의 μƒμ„±μžκ°€ ν•˜μœ„ 클래슀의 μƒμ„±μžλ³΄λ‹€ λ¨Όμ € μ‹€ν–‰λ˜λ―€λ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•œ λ©”μ„œλ“œκ°€ ν•˜μœ„ 클래슀의 μƒμ„±μžλ³΄λ‹€ λ¨Όμ € ν˜ΈμΆœλœλ‹€.

  μ΄λ•Œ κ·Έ μž¬μ •μ˜ν•œ λ©”μ„œλ“œκ°€ ν•˜μœ„ 클래슀의 μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•˜λŠ” 값에 μ˜μ‘΄ν•œλ‹€λ©΄ μ˜λ„λŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 것이닀.

public class Super {
    
    // 잘λͺ»λœ 예 - μƒμ„±μžκ°€ μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.
    public Super() {
        overrideMe();
    }

    public void overrideMe() {
    }
}

----------

public class Sub extends Super {

    // μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ final ν•„λ“œ. μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”λœλ‹€.
    private final Instant instant;

    Sub() {
        instant = Instant.now();
    }

    // μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œ. μƒμœ„ 클래슀의 μƒμ„±μžκ°€ ν˜ΈμΆœν•œλ‹€.
    @Override
    public void overrideMe() {
        System.out.println(instant);
    }
}

----------

public static void main(String[] args){
    Sub sub = new Sub();
    sub.overrideMe();
}

  μ½”λ“œμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μƒμœ„ 클래슀의 μƒμ„±μžκ°€ μž¬μ •μ˜ν•œ λ©”μ„œλ“œμΈ overrideMe()λ₯Ό ν˜ΈμΆœν•˜μ—¬ NullPointerException이 λ°œμƒν•œλ‹€. (ν•˜μ§€λ§Œ NullPointerException이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ° κ·Έ μ΄μœ λŠ” prinln이 null μž…λ ₯도 받아듀이기 λ•Œλ¬Έμ΄λ‹€.)

  λ˜ν•œ, Cloneableκ³Ό Serializable μΈν„°νŽ˜μ΄μŠ€λŠ” μƒμ†μš© μ„€κ³„μ˜ 어렀움을 ν•œμΈ΅ 더해쀀닀. cloneκ³Ό readObject λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ κ°μ²΄λ₯Ό λ§Œλ“ λ‹€λŠ” μ μ—μ„œ μƒμ„±μžμ™€ λΉ„μŠ·ν•œ νš¨κ³Όλ₯Ό λ‚΄κΈ° λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ cloneκ³Ό readObject λͺ¨λ‘ μ§μ ‘μ μœΌλ‘œλ“  κ°„μ ‘μ μœΌλ‘œλ“  μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆ λœλ‹€.

 

5. 상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄, 상속을 κΈˆμ§€ν•˜λΌ 🚊

  μ§€κΈˆκΉŒμ§€ μƒμ†μš©μœΌλ‘œ 클래슀λ₯Ό μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μ•˜λ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ 방법듀을 μ§€ν‚€μ§€ μ•Šμ•„μ„œ μƒμ†μš©μœΌλ‘œ μ„€κ³„ν•˜μ§€ μ•Šμ€ ν΄λž˜μŠ€κ°€ μžˆλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ? λ‹Ήμ—°ν•œ μ–˜κΈ°μ§€λ§Œ, 상속을 κΈˆμ§€ν•΄μ•Ό ν•œλ‹€.

  λ˜ν•œ, 클래슀λ₯Ό ν™•μž₯ν•΄μ•Ό ν•  λͺ…ν™•ν•œ μ΄μœ κ°€ λ– μ˜€λ₯΄μ§€ μ•ŠμœΌλ©΄ 상속을 κΈˆμ§€ν•˜λŠ” 편이 λ‚«λ‹€.

  상속을 κΈˆμ§€ν•˜λŠ” 2κ°€μ§€ 방법이 μžˆλŠ”λ°, 첫 λ²ˆμ§Έλ‘œλŠ” 클래슀λ₯Ό final둜 μ„ μ–Έν•˜λŠ” 방법이고, 두 λ²ˆμ§Έλ‘œλŠ” λͺ¨λ“  μƒμ„±μžλ₯Ό privateμ΄λ‚˜ package-private으둜 μ„ μ–Έν•˜κ³  public 정적 νŒ©ν„°λ¦¬λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” 방법이닀. (두 κ°€μ§€ 방법은 'λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ - μ•„μ΄ν…œ17'의 첫 번째 λ‚΄μš©κ³Ό 두 번째 λ‚΄μš©μ„ μ°Έκ³ ν•˜μž.)

 

ν•΄λ‹Ή 글은 λ°±κΈ°μ„  λ‹˜μ˜ 'μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

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

좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(좔상 골격 κ΅¬ν˜„(Skeletal Implementation) 클래슀)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]  (0) 2023.05.07
좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]  (0) 2023.05.07
μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ18)]  (0) 2023.04.28
λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κ³ λ €ν•  것)(3) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]  (0) 2023.04.27
λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀의 μž₯점, 단점, 단점 λŒ€μ²˜ 방법)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]  (0) 2023.04.27
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(좔상 골격 κ΅¬ν˜„(Skeletal Implementation) 클래슀)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]
    • 좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]
    • μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ18)]
    • λ³€κ²½ κ°€λŠ₯성을 μ΅œμ†Œν™”ν•˜λΌ(λΆˆλ³€ 클래슀λ₯Ό λ§Œλ“€ λ•Œ κ³ λ €ν•  것)(3) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ17)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

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