Skip to content

Latest commit

Β 

History

History
161 lines (133 loc) Β· 5.35 KB

item24.md

File metadata and controls

161 lines (133 loc) Β· 5.35 KB

멀버 ν΄λž˜μŠ€λŠ” λ˜λ„λ‘ static 클래슀둜 λ§Œλ“€λΌ.

쀑첩 클래슀 (Nested Class) : μžμ‹ μ„ λ‘˜λŸ¬μ‹Ό λ°”κΉ₯ ν΄λž˜μŠ€μ—μ„œλ§Œ μ“°μ΄λŠ” 클래슀

  • 정적 멀버 클래슀 (static member class)
  • 비정적 멀버 클래슀
  • 읡λͺ… 클래슀
  • 지역 클래슀

정적 멀버 클래슀

  • 클래슀 λ‚΄λΆ€μ˜ static 클래슀

λ°”κΉ₯ 클래슀의 private 멀버에도 λ°”λ‘œ μ ‘κ·Ό κ°€λŠ₯. μ΄μ™Έμ—λŠ” 일반 ν΄λž˜μŠ€μ™€ κ°™λ‹€.

  • private 정적 멀버 클래슀 : λ°”κΉ₯ 클래슀의 ꡬ성 μš”μ†Œλ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ
public class Person {
    private String firstName;
    private String lastName;
    
    private static class Computer { // private, public
        private String name;
        private int price;

        public Computer(String name, int price) {
            this.name = name;
            this.price = price;
        }

        public int getPrice() {
            return price;
        }
    }
}
  • public 정적 멀버 클래슀 : λ°”κΉ₯ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ 쓰일 λ•Œλ§Œ μœ μš©ν•œ public λ„μš°λ―Έ 클래슀
public class Calculator {
    public enum Operation1 {
        PLUS(Integer::sum),
        MINUS((x, y) -> x - y);

        private BiFunction<Integer, Integer, Integer> calculate;

        Operation1(BiFunction<Integer, Integer, Integer> calculate) {
            this.calculate = calculate;
        }

        public BiFunction<Integer, Integer, Integer> getFunction() {
            return calculate;
        }
    }


    public int Sum(int x, int y) {
        return Operation1.PLUS.getFunction().apply(x, y);
    }
}
public static void main(String[] args) {
       Calculator c = new Calculator();
       System.out.println(c.Sum(1, 2)); // 3

       System.out.println(Calculator.Operation1.PLUS); // PLUS
   }


비정적 멀버 클래슀

  • 비정적 멀버 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€μ™€ μ•”λ¬΅μ μœΌλ‘œ μ—°κ²°
  • λ”°λΌμ„œ, 비정적 멀버 클래슀의 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œ μ •κ·œν™”λœ this λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘°λ₯Ό κ°€μ Έμ˜¬ 수 있음.

μ •κ·œν™”λœ this == 클래슀λͺ….this

  • λΉ„ 정적 멀버 ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό κ°μ‹Έμ„œ 마치 λ‹€λ₯Έ 클래슀처럼 보이게 ν•˜λŠ” 뷰인 μ–΄λŒ‘ν„°μ—μ„œ 주둜 쓰인닀.
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable {
...
    // View class support
    class Values extends AbstractCollection<V> {
        public Iterator<V> iterator() {
            return new ValueIterator(getFirstEntry());
        }

        public int size() {
            return TreeMap.this.size();
        }

        public boolean contains(Object o) {
            return TreeMap.this.containsValue(o);
        }

        public boolean remove(Object o) {
            for (Entry<K,V> e = getFirstEntry(); e != null; e = successor(e)) {
                if (valEquals(e.getValue(), o)) {
                    deleteEntry(e);
                    return true;
                }
            }
            return false;
        }

        public void clear() {
            TreeMap.this.clear();
        }

        public Spliterator<V> spliterator() {
            return new ValueSpliterator<>(TreeMap.this, null, null, 0, -1, 0);
        }
    }    


    class EntrySet extends AbstractSet<Map.Entry<K,V>> {
        public Iterator<Map.Entry<K,V>> iterator() {
            return new EntryIterator(getFirstEntry());
        }

        public boolean contains(Object o) {
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry<?,?> entry = (Map.Entry<?,?>) o;
            Object value = entry.getValue();
            Entry<K,V> p = getEntry(entry.getKey());
            return p != null && valEquals(p.getValue(), value);
        }

        public boolean remove(Object o) {
            if (!(o instanceof Map.Entry))
                return false;
            Map.Entry<?,?> entry = (Map.Entry<?,?>) o;
            Object value = entry.getValue();
            Entry<K,V> p = getEntry(entry.getKey());
            if (p != null && valEquals(p.getValue(), value)) {
                deleteEntry(p);
                return true;
            }
            return false;
        }
    }
...
}
  • TreeMap.this, getFirstEntry() λŠ” λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžˆμ–΄μ•Ό μ“Έ 수 μžˆλ‹€.
  • λ”°λΌμ„œ 비정적 멀버 클래슀의 μΈμŠ€ν„΄μŠ€μ•ˆμ— 관계정보가 μ €μž₯λ˜μ–΄ λ©”λͺ¨λ¦¬ 곡간을 μ°¨μ§€ν•˜κ³ , 생성 μ‹œκ°„λ„ 더 κ±Έλ¦°λ‹€.
  • λ˜ν•œ λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό GC κ°€ νšŒμˆ˜ν•˜μ§€ λͺ»ν•œλ‹€.
    public Set<Map.Entry<K,V>> entrySet() {
        EntrySet es = entrySet;
        return (es != null) ? es : (entrySet = new EntrySet());
    }

μœ„μ˜ μ½”λ“œμ—μ„œ 비정적 멀버 클래슀 EntrySet의 객체λ₯Ό μƒμ„±ν•œλ‹€. μ•”λ¬΅μ μœΌλ‘œ λ°”κΉ₯ ν΄λž˜μŠ€μ™€ 멀버 ν΄λž˜μŠ€κ°„μ˜ μ—°κ²°λ˜λŠ” 관계가 비정적 멀법 클래슀의 μΈμŠ€ν„΄μŠ€ μ•ˆμ— λ§Œλ“€μ–΄μ§€κ³ ,
Map 객체가 μ‚¬μš©ν•˜λŠ” 곳이 없더라도 이 κ΄€κ³„λ•Œλ¬Έμ— GC κ°€ μΌμ–΄λ‚˜μ§€ λͺ»ν•œλ‹€.


κ²°λ‘ 

κ°œλ…μƒ 쀑첩 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ™€ λ…λ¦½μ μœΌλ‘œ μ‘΄μž¬ν•  수 μžˆλ‹€λ©΄, 정적 멀버 클래슀둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

멀버 ν΄λž˜μŠ€μ—μ„œ λ°”κΉ₯ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  일이 μ—†λ‹€λ©΄ 무쑰건 static 을 λΆ™μ—¬μ„œ 정적 멀버 클래슀둜 λ§Œλ“€μž.