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μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ21)]
πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„ν•˜λŠ” μͺ½μ„ 생각해 μ„€κ³„ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ21)]

2023. 5. 7. 21:55

1. κ°œλ… πŸ‘»

  λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜λ©΄, κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν›„ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•Šμ€ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ λ””ν΄νŠΈ κ΅¬ν˜„μ΄ μ“°μ΄κ²Œ λœλ‹€.

  κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€μ— λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 길이 μ—΄λ Έμ§€λ§Œ λͺ¨λ“  κΈ°μ‘΄ κ΅¬ν˜„μ²΄λ“€κ³Ό λ§€λ„λŸ½κ²Œ μ—°λ™λ˜λ¦¬λΌλŠ” 보μž₯은 μ—†λ‹€. μžλ°” 7κΉŒμ§€μ˜ μ„Έμƒμ—μ„œλŠ” λͺ¨λ“  ν΄λž˜μŠ€κ°€ "ν˜„μž¬μ˜ μΈν„°νŽ˜μ΄μŠ€μ— μƒˆλ‘œμš΄ λ©”μ„œλ“œκ°€ μΆ”가될 μΌμ€ μ˜μ›νžˆ μ—†λ‹€"라고 κ°€μ •ν•˜κ³  μž₯μ„±λμœΌλ‹ˆ λ§μ΄λ‹€.

  λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” κ΅¬ν˜„ ν΄λž˜μŠ€μ— λŒ€ν•΄ 아무것도 λͺ¨λ₯Έ 채 ν•©μ˜ 없이 λ¬΄μž‘μ„± 'μ‚½μž…'될 뿐이닀. 이번 κΈ€μ—μ„œλŠ” 이런 κ²½μš° λ°œμƒν•  μˆ˜ μžˆλŠ” λ¬Έμ œ μƒν™©λ“€μ„ μ‚΄νŽ΄λ³΄κ³  κ·Έμ— λŒ€ν•œ ν•΄κ²°μ±…을 μ•Œμ•„λ³΄μž.

 

2. [문제 상황 1] 생각할 수 μžˆλŠ” λͺ¨λ“  μƒν™©μ—μ„œ λΆˆλ³€μ‹μ„ ν•΄μΉ˜μ§€ μ•ŠλŠ” λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•˜κΈ°λž€ μ–΄λ ΅λ‹€. πŸ€–

  μžλ°” 8의 Collction μΈν„°νŽ˜μ΄μŠ€μ— μΆ”κ°€λœ 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;
    }
}

  이 λ©”μ„œλ“œλŠ” μ£Όμ–΄μ§„ boolean ν•¨μˆ˜(Predicate)κ°€ trueλ₯Ό λ°˜ν™˜ν•˜λŠ” λͺ¨λ“  μ›μ†Œλ₯Ό μ œκ±°ν•œλ‹€. λ””ν΄νŠΈ κ΅¬ν˜„μ€ 반볡자λ₯Ό μ΄μš©ν•΄ μˆœνšŒν•˜λ©΄μ„œ 각 μ›μ†Œλ₯Ό 인수둜 λ„£μ–΄ predicateλ₯Ό ν˜ΈμΆœν•˜κ³ , predicateκ°€ trueλ₯Ό λ°˜ν™˜ν•˜λ©΄ 반볡자의 remove λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄ κ·Έ μ›μ†Œλ₯Ό μ œκ±°ν•œλ‹€.

  이 μ½”λ“œλ³΄λ‹€ 더 λ²”μš©μ μœΌλ‘œ κ΅¬ν˜„ν•˜κΈ°λ„ μ–΄λ ΅κ² μ§€λ§Œ, κ·Έλ ‡λ‹€κ³  ν•΄μ„œ ν˜„μ‘΄ν•˜λŠ” λͺ¨λ“  Collection κ΅¬ν˜„μ²΄μ™€ 잘 μ–΄μš°λŸ¬μ§€λŠ” 것은 μ•„λ‹ˆλ‹€.

  org.apache.commons.collections4.collection.SynchronizedCollecion을 생각해 보자. SynchronizedCollection ν΄λž˜μŠ€κ°€ removeIf의 λ””ν΄νŠΈ κ΅¬ν˜„μ„ λ¬Όλ €λ°›κ²Œ λœλ‹€λ©΄, λͺ¨λ“  λ©”μ„œλ“œ ν˜ΈμΆœμ„ μ•Œμ•„μ„œ λ™κΈ°ν™”ν•˜μ§€ λͺ»ν•œλ‹€λŠ” λ¬Έμ œκ°€ μƒκΈ°κ²Œ λœλ‹€. removeIf의 κ΅¬ν˜„μ€ 동기화에 κ΄€ν•΄ 아무것도 λͺ¨λ₯΄λŠ” μƒνƒœμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

  κ·Έλž˜μ„œ SynchronizedCollection μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” ν™˜κ²½μ—μ„œ ν•œ μŠ€λ ˆλ“œκ°€ removeIfλ₯Ό ν˜ΈμΆœν•˜λ©΄ ConcurrentModificationException이 λ°œμƒν•˜κ±°λ‚˜ λ‹€λ₯Έ 예기치 λͺ»ν•œ 결과둜 μ΄μ–΄μ§ˆ 수 μžˆλ‹€.

 

3. [문제 상황 2] λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μ»΄νŒŒμΌμ— μ„±κ³΅ν•˜λ”λΌλ„ κΈ°μ‘΄ κ΅¬ν˜„μ²΄μ— λŸ°νƒ€μž„ 였λ₯˜λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€. πŸ‘Ύ

  SuperClass, SubClassλ₯Ό μ΄μš©ν•œ μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž.

public class SuperClass {

    public void hello() {
        System.out.println("hello class");
    }
}

----------

public class SubClass extends SuperClass {
}

----------

public static void main(String[] args) {

    SubClass subClass = new SubClass();
    subClass.hello();
}

  μœ„μ˜ μ½”λ“œλ₯Ό λ™μž‘μ‹œμΌœ 보면 μ‰½κ²Œ μ˜ˆμƒν•  수 μžˆλ“―μ΄ "hello class"κ°€ 좜λ ₯λœλ‹€. 그러면 SuperClass, SubClass, MarkerInterfaceλ₯Ό μ΄μš©ν•œ μ•„λž˜ μ½”λ“œλŠ” μ–΄λ–¨κΉŒ?

public class SuperClass {

    // μ ‘κ·Ό μ œν•œμžκ°€ privateλΌλŠ” 것을 ν™•μΈν•˜μž.
    private void hello() {
        System.out.println("hello class");
    }
}

----------

public interface MarkerInterface {

    default void hello() {
        System.out.println("hello interface");
    }
}

----------

public class SubClass extends SuperClass implements MarkerInterface{
}

----------

public static void main(String[] args) {

    SubClass subClass = new SubClass();
    subClass.hello();
}

  SuperClass의 hello() λ©”μ„œλ“œκ°€ privateμ΄λ―€λ‘œ SubClassμ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ MarkerInterface에 λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ hello()κ°€ μžˆμœΌλ―€λ‘œ 이것을 μ΄μš©ν•˜λ©΄ 될 것이닀.

  ν•˜μ§€λ§Œ, μ‹€μ œ λ™μž‘μ„ μ‹œμΌœλ³΄λ©΄ IllegalAccessErrorκ°€ λ°œμƒν•œλ‹€. 

  μœ„μ—μ„œ μ–˜κΈ°ν•œ μƒκ°μ˜ νλ¦„λŒ€λ‘œλΌλ©΄ λ‹Ήμ—°νžˆ MarkerInterface의 hello()λ₯Ό μ‚¬μš©ν•  κ±° κ°™μ§€λ§Œ, μ‹€μ œλ‘œλŠ” SuperClass의 hello()λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•˜κΈ° λ•Œλ¬Έμ— IllegalAccessErrorκ°€ λ°œμƒν•œ κ²ƒμ΄λ‹€. (λ©”μ„œλ“œλ₯Ό μ°ΎμœΌλ €κ³  ν•  λ•Œ ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄κΈ°κ²Œ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.)

  즉, μ΄λ ‡κ²Œ 기쑴에 μ§œμ—¬μ§„ μžλ°” μ½”λ“œκ°€ 영ν–₯을 받을 수 μžˆλ‹€.

 

4. ν•΄κ²°μ±… πŸ‘½

  μœ„μ™€ 같은 문제 상황듀을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€.


  • κΈ°μ‘΄ μΈν„°νŽ˜μ΄μŠ€μ— λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μƒˆ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” μΌμ€ κΌ­ ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ ν”Όν•΄μ•Ό ν•œλ‹€.
  • μΆ”κ°€ν•˜λ €λŠ” λ””ν΄νŠΈ λ©”μ„œλ“œκ°€ κΈ°μ‘΄ κ΅¬ν˜„체듀과 μΆ©λŒν•˜μ§€ μ•Šμ„μ§€ μ‹¬μ‚¬μˆ™κ³ ν•΄μ•Ό ν•¨λ„ λ‹Ήμ—°ν•˜λ‹€.

  • λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° λ©”μ„œλ“œλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ κΈ°μ‘΄ λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό μˆ˜μ •ν•˜λŠ” μš©λ„κ°€ μ•„λ‹˜μ„ λͺ…심해야 ν•œλ‹€.
  • 이런 ν˜•νƒœλ‘œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ³€κ²½ν•˜λ©΄ λ°˜λ“œμ‹œ κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό λ§κ°€λœ¨λ¦¬κ²Œ λœλ‹€.

  • μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€λΌλ©΄ λ¦΄λ¦¬μŠ€ μ „에 λ°˜λ“œμ‹œ ν…ŒμŠ€νŠΈλ₯Ό κ±°μ³μ•Ό ν•œλ‹€.
  • μ„œλ‘œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ΅œμ†Œν•œ μ„Έ κ°€μ§€λŠ” κ΅¬ν˜„ν•΄ 보자.
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ¦΄λ¦¬μŠ€ν•œ ν›„라도 κ²°ν•¨μ„ μˆ˜μ •ν•˜λŠ” κ²Œ κ°€λŠ₯ν•œ κ²½μš°λ„ μžˆκ² μ§€λ§Œ, μ ˆλŒ€ κ·Έ κ°€λŠ₯성에 κΈ°λŒ€μ„œλŠ” μ•ˆ λœλ‹€.

 

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

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

νƒœκ·Έ 달린 ν΄λž˜μŠ€λ³΄λ‹€λŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ23)]  (1) 2023.05.08
μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ22)]  (0) 2023.05.07
좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(좔상 골격 κ΅¬ν˜„(Skeletal Implementation) 클래슀)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]  (0) 2023.05.07
좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]  (0) 2023.05.07
상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ19)]  (0) 2023.04.29
    'πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • νƒœκ·Έ 달린 ν΄λž˜μŠ€λ³΄λ‹€λŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ23)]
    • μΈν„°νŽ˜μ΄μŠ€λŠ” νƒ€μž…μ„ μ •μ˜ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ22)]
    • 좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(좔상 골격 κ΅¬ν˜„(Skeletal Implementation) 클래슀)(2) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]
    • 좔상 ν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ(μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점)(1) - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ20)]
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

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