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

좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]

2023. 5. 7. 16:39

  μžλ°”κ°€ μ œκ³΅ν•˜λŠ” 닀쀑 κ΅¬ν˜„ λ©”μ»€λ‹ˆμ¦˜μ€ 'μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀' 2κ°€μ§€κ°€ μžˆλ‹€. μžλ°” 8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λ„ Default Methodλ₯Ό μ œκ³΅ν•  수 있기 λ•Œλ¬Έμ— 두 λ©”μ»€λ‹ˆμ¦˜ λͺ¨λ‘ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ ν˜•νƒœλ‘œ μ œκ³΅ν•  수 μžˆλ‹€.

  λ‘˜μ˜ κ°€μž₯ 큰 μ°¨μ΄λŠ” 좔상 ν΄λž˜μŠ€κ°€ μ •μ˜ν•œ νƒ€μž…μ„ κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ 좔상 클래슀의 ν•˜μœ„ ν΄λž˜μŠ€κ°€ λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 점이닀. μžλ°”λŠ” λ‹¨μΌ μƒμ†λ§Œ μ§€μ›ν•˜λ‹ˆ, μΆ”상 ν΄λž˜μŠ€ λ°©μ‹μ€ μƒˆλ‘œμš΄ νƒ€μž…을 μ •μ˜ν•˜λŠ” λ° μ»€λ‹€λž€ μ œμ•½μ„ μ•ˆκ²Œ λ˜λŠ” κ²ƒμ΄λ‹€.
  반면 μΈν„°νŽ˜μ΄μŠ€κ°€ μ„ μ–Έν•œ λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ μ •μ˜ν•˜κ³  κ·Έ 일반 κ·œμ•½μ„ 잘 지킨 클래슀라면 λ‹€λ₯Έ μ–΄λ–€ 클래슀λ₯Ό μƒμ†ν–ˆλ“  같은 νƒ€μž…μœΌλ‘œ μ·¨κΈ‰λœλ‹€.

  μ—¬κΈ°κΉŒμ§€κ°€ μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ κ°„λ‹¨ν•œ μ„€λͺ…이닀. 이번 κΈ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€μ˜ 5κ°€μ§€ μž₯점듀을 μ‚΄νŽ΄λ³΄λ©΄μ„œ 'μ™œ 좔상 ν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”κ°€'에 λŒ€ν•œ 이유λ₯Ό μ•Œμ•„λ³΄μž.

 

μž₯점 1. κΈ°μ‘΄ ν΄λž˜μŠ€μ—λ„ μ†μ‰½κ²Œ μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄ 넣을 수 μžˆλ‹€. 🍡

  μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 맀우 쉽닀. μΈν„°νŽ˜μ΄μŠ€κ°€ μš”κ΅¬ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜κ³ , 클래슀 선언에 implements ꡬ문만 μΆ”κ°€ν•˜λ©΄ λœλ‹€. (μžλ°” ν”Œλž«νΌμ—μ„œλ„ Comparable, Iterable, AutoCloseable μΈν„°νŽ˜μ΄μŠ€κ°€ μƒˆλ‘œ μΆ”κ°€λ˜μ—ˆμ„ λ•Œ ν‘œμ€€ 라이브러리의 μˆ˜λ§Žμ€ κΈ°μ‘΄ ν΄λž˜μŠ€κ°€ 이 μΈν„°νŽ˜μ΄μŠ€λ“€μ„ κ΅¬ν˜„ν•œ 채 릴리슀 λ˜μ—ˆλ‹€.)

  ν•˜μ§€λ§Œ, κΈ°μ‘΄ 클래슀 μœ„μ— μƒˆλ‘œμš΄ 좔상 클래슀λ₯Ό λΌμ›Œλ„£κΈ°λŠ” μ–΄λ ΅λ‹€. 두 ν΄λž˜μŠ€κ°€ 같은 좔상 클래슀λ₯Ό ν™•μž₯ν•˜κΈΈ μ›ν•œλ‹€λ©΄, κ·Έ 좔상 ν΄λž˜μŠ€λŠ” 계측ꡬ쑰상 두 클래슀의 곡톡 쑰상이어야 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 이 λ°©μ‹μ€ ν΄λž˜μŠ€ κ³„측ꡬ쑰에 μ»€λ‹€λž€ ν˜Όλž€μ„ μ•ΌκΈ°ν•œλ‹€.

 

μž₯점 2. μΈν„°νŽ˜μ΄μŠ€λŠ” 믹슀인(mixin) μ •μ˜μ— μ•ˆμ„±λ§žμΆ€μ΄λ‹€. 🍢

  '믹슀인(mixin)'μ΄λž€ ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•  수 μžˆλŠ” νƒ€μž…μœΌλ‘œ, λ―ΉμŠ€μΈμ„ κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ— μ›λž˜μ˜ '주된 νƒ€μž…'외에도 νŠΉμ • 선택적 ν–‰μœ„λ₯Ό μ œκ³΅ν•œλ‹€κ³  μ„ μ–Έν•˜λŠ” 효과λ₯Ό μ€€λ‹€. 예λ₯Ό λ“€μ–΄, Comparable은 μžμ‹ μ„ κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ“€λΌλ¦¬λŠ” μˆœμ„œλ₯Ό μ •ν•  μˆ˜ μžˆλ‹€κ³  μ„ μ–Έν•˜λŠ” λ―ΉμŠ€μΈ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€.

  μΈν„°νŽ˜μ΄μŠ€λŠ” λ―ΉμŠ€μΈμ„ μ •μ˜ν•  수 μžˆμ§€λ§Œ, 좔상 ν΄λž˜μŠ€λ‘œλŠ” λ―ΉμŠ€μΈμ„ μ •μ˜ν•  수 μ—†λ‹€. μ΄μœ λŠ” κ°„λ‹¨ν•˜λ‹€. κΈ°μ‘΄ ν΄λž˜μŠ€μ— λ§μ”ŒμšΈ 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. μžλ°”λŠ” λ‹€μ€‘ μƒμ†μ„ ν—ˆμš©ν•˜μ§€ μ•Šκ³ , ν΄λž˜μŠ€ κ³„μΈ΅κ΅¬μ‘°μ—λŠ” λ―ΉμŠ€μΈμ„ μ‚½μž…ν•˜κΈ°μ— ν•©λ¦¬μ μΈ μœ„μΉ˜κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

 

μž₯점 3. μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” 계측ꡬ쑰가 μ—†λŠ” νƒ€μž… ν”„λ ˆμž„μ›Œν¬λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. πŸ₯›

  'λ„ν˜• - μ‚¬κ°ν˜• - μ •μ‚¬κ°ν˜•'κ³Ό 같이 계측 ꡬ쑰λ₯Ό μ‰½κ²Œ ꡬ뢄할 수 μžˆλŠ” 것도 μžˆμ§€λ§Œ, ν˜„μ‹€μ—λŠ” 계측을 μ—„κ²©νžˆ κ΅¬λΆ„ν•˜κΈ° μ–΄λ €μš΄ κ°œλ…λ„ λ§Žλ‹€.

  예λ₯Ό λ“€μ–΄, 'κ°€μˆ˜' λ˜λŠ” 'μž‘κ³‘κ°€'λ₯Ό κ΅¬ν˜„ν•  μˆ˜λ„ μžˆκ² μ§€λ§Œ, 'κ°€μˆ˜'와 'μž‘κ³‘κ°€'λ₯Ό λ‘˜ λ‹€ κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€.

public interface Singer {
    AudioClip sing(Song s);
}

----------

public interface Songwriter {
    Song compose(int chartPosition);
}

----------

public interface SingerSongwriter extends Singer, Songwriter {
    AudioClip strum();
    void actSensitive();
}

 

μž₯점 4. λž˜νΌ ν΄λž˜μŠ€ κ΄€μš©κ΅¬μ™€ ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λŠ₯을 ν–₯상 μ‹œν‚€λŠ” μ•ˆμ „ν•˜κ³  κ°•λ ₯ν•œ μˆ˜λ‹¨μ΄ λœλ‹€. πŸ§‰

  이 뢀뢄은 μ•„μ΄ν…œ 18(μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ)μ—μ„œ λ‹€λ£¨μ—ˆλ˜ λ‚΄μš©μ΄λ‹€.

  νƒ€μž…μ„ 좔상 클래슀둜 μ •μ˜ν•΄ 두면 κ·Έ νƒ€μž…μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ” 방법은 상속뿐이닀. μ•„μ΄ν…œ 18μ—μ„œ μ‚΄νŽ΄λ³Έ κ²ƒμ²˜λŸΌ μ•„λž˜μ˜ μ΄μœ λ“€λ‘œ 인해 상속은 μΊ‘μŠν™”λ₯Ό κΉ¨λœ¨λ¦°λ‹€λŠ” 문제점이 μžˆλ‹€.

  • μƒμœ„ ν΄λž˜μŠ€κ°€ μ–΄λ–»κ²Œ κ΅¬ν˜„λ˜λŠλƒμ— λ”°λΌ ν•˜μœ„ ν΄λž˜μŠ€μ˜ λ™μž‘에 μ΄μƒμ΄ μƒκΈΈ μˆ˜ μžˆλ‹€.
  • μƒμœ„ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ λ©”μ„œλ“œκ°€ μΆ”κ°€λœλ‹€λ©΄ ν•˜μœ„ ν΄λž˜μŠ€κ°€ κΉ¨μ§ˆ μˆ˜ μžˆλ‹€.

  κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같이 래퍼 클래슀 κ΄€μš©κ΅¬μ™€ ν•¨κ»˜ μ‚¬μš©ν•œλ‹€λ©΄ μΈν„°νŽ˜μ΄μŠ€λŠ” κΈ°λŠ₯을 ν–₯상 μ‹œν‚€λŠ” μ•ˆμ „ν•˜κ³  κ°•λ ₯ν•œ μˆ˜λ‹¨μ΄ λœλ‹€.

public class ForwardingSet<E> implements Set<E> {
    private final Set<E> s;
    public ForwardingSet(Set<E> s){
        this.s = s;
    }
    
    public void clear()               { s.clear(); }
    public boolean contains(Object o) { return s.contains(o); }
    public boolean isEmpty()        { return s.isEmpty(); }
    public int size()               { return s.size(); }
    public Iterator<E> iterator()   { return s.iterator(); }
    public boolean add(E e)         { return s.add(e); }
    public boolean remove(Object o) { return s.remove(o); }
    public boolean containsAll(Collection<?> c)
                                    { return s.containsAll(c); }
    public boolean addAll(Collection<? extends E> c)
                                    { return s.addAll(c); }
    public boolean removeAll(Collection<?> c)
                                    { return s.removeAll(c); }
    public boolean retainAll(Collection<?> c)
                                    { return s.retainAll(c); }
    public Object[] toArray()       { return s.toArray(); }
    public <T> T[] toArray(T[] a)   { return s.toArray(a); }
    @Override
    public boolean equals(Object o) { return s.equals(o); }
    @Override
    public int hashCode()           { return s.hashCode(); }
    @Override
    public String toString()        { return s.toString(); }
}

 

μž₯점 5. μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œ μ€‘ κ΅¬ν˜„ λ°©λ²•이 λͺ…λ°±ν•œ κ²ƒμ΄ μžˆλ‹€λ©΄, κ·Έ κ΅¬ν˜„을 λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μ œκ³΅ν•΄ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ˜ μΌκ°μ„ λœμ–΄μ€„ μˆ˜ μžˆλ‹€. β˜•

  Collection.java의 removeIfκ°€ 쒋은 μ˜ˆμ‹œκ°€ 될 수 μžˆλ‹€.

public interface Collection<E> extends Iterable<E> {
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
}

  μ΄λ ‡κ²Œ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  λ•ŒλŠ” μƒμ†ν•˜λ €λŠ” μ‚¬λžŒμ„ μœ„ν•œ μ„€λͺ…을 @implSpec μžλ°”λ… νƒœκ·Έλ₯Ό λΆ™μ—¬ λ¬Έμ„œν™”ν•΄μ•Ό ν•œλ‹€.


  μ§€κΈˆκΉŒμ§€ μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점듀을 μ•Œμ•„λ³΄μ•˜λ‹€. λ‹€μŒ κΈ€μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”상 ν΄λž˜μŠ€μ˜ μž₯점을 λͺ¨λ‘ μ·¨ν•˜λŠ” λ°©λ²•인 '좔상 κ³¨κ²© κ΅¬ν˜„(Skeletal Implementation) ν΄λž˜μŠ€'λ₯Ό μ•Œμ•„λ³΄μž.

 

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

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

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

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