μ€μ²© ν΄λμ€(nested class)λ λ€λ₯Έ ν΄λμ€ μμ μ μλ ν΄λμ€λ₯Ό λ§νλ€. μ€μ²© ν΄λμ€λ μμ μ κ°μΌ λ°κΉ₯ ν΄λμ€μμλ§ μ°μ¬μΌ νλ©°, κ·Έ μΈμ μ°μμκ° μλ€λ©΄ ν±λ 벨 ν΄λμ€λ‘ λ§λ€μ΄μΌ νλ€.
μ€μ²© ν΄λμ€μ μ’ λ₯λ μλμ 4κ°μ§κ° μλ€.
- μ μ λ©€λ² ν΄λμ€
- (λΉμ μ ) λ©€λ² ν΄λμ€
- μ΅λͺ ν΄λμ€
- μ§μ ν΄λμ€
'μ μ λ©€λ² ν΄λμ€'λ₯Ό μ μΈνκ³ λ λͺ¨λ λ΄λΆ ν΄λμ€(inner class)μ ν΄λΉνλ€. 'μ μ λ©€λ² ν΄λμ€'μ 'λΉμ μ λ©€λ² ν΄λμ€'λ λ©€λ² ν΄λμ€μ ν΄λΉνλ€.
μ΄λ² κΈμ ν΅ν΄ 4κ°μ§ μ€μ²© ν΄λμ€μ λν΄μ μμλ³΄κ³ , μ λ©€λ² ν΄λμ€λ λλλ‘ staticμΌλ‘ λ§λ€μ΄μΌ νλμ§ μμλ³΄κ³ μ νλ€.
1. μ μ λ©€λ² ν΄λμ€ π§°
μ μ λ©€λ² ν΄λμ€λ λ€λ₯Έ ν΄λμ€ μμ μ μΈλκ³ , λ°κΉ₯ ν΄λμ€μ private λ©€λ²μλ μ κ·Όν μ μλ€λ μ λ§ μ μΈνκ³ λ μΌλ° ν΄λμ€μ λκ°λ€.
public class OuterClass {
private static int number = 10;
static private class InnerClass {
void doSomething() {
System.out.println(number);
}
}
}
μ μ λ©€λ² ν΄λμ€λ νν λ°κΉ₯ ν΄λμ€μ ν¨κ» μ°μΌ λλ§ μ μ©ν public λμ°λ―Έ ν΄λμ€λ‘ μ°μΈλ€.
2. λΉμ μ λ©€λ² ν΄λμ€ π©
public class OuterClass {
private int number = 10;
void printNumber() {
InnerClass innerClass = new InnerClass();
}
private class InnerClass {
void doSomething() {
System.out.println(number);
// μ κ·νλ this μ¬μ©
OuterClass.this.printNumber();
}
}
}
λΉμ μ λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μ묡μ μΌλ‘ μ°κ²°λλ€. κ·Έλμ λΉμ μ λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€ λ©μλμμ μ κ·νλ thisλ₯Ό μ¬μ©ν΄ λ°κΉ₯ μΈμ€ν΄μ€μ λ©μλλ₯Ό νΈμΆνκ±°λ λ°κΉ₯ μΈμ€ν΄μ€μ μ°Έμ‘°λ₯Ό κ°μ Έμ¬ μ μλ€.
κ·Έλ κΈ° λλ¬Έμ κ°λ μ μ€μ²© ν΄λμ€μ μΈμ€ν΄μ€κ° λ°κΉ₯ μΈμ€ν΄μ€μ λ 립μ μΌλ‘ μ‘΄μ¬ν μ μλ€λ©΄ μ μ λ©€λ² ν΄λμ€λ‘ λ§λ€μ΄μΌ νλ€.
λΉμ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλμμ λΉμ μ λ©€λ² ν΄λμ€μ μμ±μλ₯Ό νΈμΆν λ μλμΌλ‘ λ§λ€μ΄μ§λ κ² λ³΄ν΅μ΄μ§λ§, λλ¬Όκ²λ μ§μ λ°κΉ₯ μΈμ€ν΄μ€μ ν΄λμ€.new MemberClass(args)λ₯Ό νΈμΆν΄ μλμΌλ‘ λ§λ€κΈ°λ νλ€. μ΄ κ΄κ³λ λΉμ μ λ©€λ² ν΄λμ€μ μΈμ€ν΄μ€ μμ λ§λ€μ΄μ Έ λ©λͺ¨λ¦¬ 곡κ°μ μ°¨μ§νλ©°, μμ± μκ°λ λ κ±Έλ¦°λ€.
public static void main(String[] args) {
// μ§μ λ°κΉ₯ μΈμ€ν΄μ€μ ν΄λμ€.new MemberClass(args)λ₯Ό νΈμΆν΄ μλμΌλ‘ λ§λλ κ²½μ°
InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.doSomething();
}
λ©€λ² ν΄λμ€μμ λ°κΉ₯ μΈμ€ν΄μ€μ μ κ·Όν μΌμ΄ μλ€λ©΄ 무쑰건 staticμ λΆμ¬μ μ μ λ©€λ² ν΄λμ€λ‘ λ§λ€μ. staticμ μλ΅νλ©΄ λ°κΉ₯ μΈμ€ν΄μ€λ‘μ μ¨μ μΈλΆ μ°Έμ‘°λ₯Ό κ°κ² λλ€. μ΄ μ°Έμ‘°λ₯Ό μ μ₯νλ €λ©΄ μκ°κ³Ό 곡κ°μ΄ μλΉλλ€. λ λμκ°μλ κ°λΉμ§ 컬λ μ μ΄ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μκ±°νμ§ λͺ»νλ λ©λͺ¨λ¦¬ λμκ° μκΈΈ μ μλ€. (μμ΄ν 7)
λΉμ μ λ©€λ² ν΄λμ€λ μ΄λν°λ₯Ό μ μν λ μμ£Ό μ¬μ©λλ€. μ΄λ€ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό κ°μΈ λ§μΉ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€μ²λΌ 보μ΄κ² νλ λ·°λ‘ μ¬μ©νλ κ²μ΄λ€.
public class MySet<E> extends AbstractSet<E> {
@Override
public Iterator<E> iterator() {
return new MyIterator();
}
@Override
public int size() {
return 0;
}
private class MyIterator implements Iterator<E> {
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
}
3. μ΅λͺ ν΄λμ€ π§²
static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(a);
return new AbstractList<>(){
@Override
public Integer get(int i){
return a[i];
}
@Override public Integer set(int i , Integer val){
int oldVal = a[i];
a[i] = val; // μ€ν μΈλ°μ±
return oldVal; // μ€ν λ°μ±
}
@Override
public int size() {
return a.length;
}
};
}
μ΅λͺ ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ λ©€λ²λ μλλ€. λ©€λ²μ λ¬λ¦¬, μ°μ΄λ μμ μ μ μΈκ³Ό λμμ μΈμ€ν΄μ€κ° λ§λ€μ΄μ§λ€. κ·Έλ¦¬κ³ μ€μ§ λΉμ μ μΈ λ¬Έλ§₯μμ μ¬μ©λ λλ§ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν μ μλ€.
μλ°μμ λλ€λ₯Ό μ§μνκΈ° μ μ μ¦μμμ μμ ν¨μ κ°μ²΄λ μ²λ¦¬ κ°μ²΄λ₯Ό λ§λ€ λ μ¬μ©νλ€. μ΄κ²μ νμ¬ λλ€μκ² μ리λ₯Ό λ¬Όλ €μ£Όμλ€.
μ΅λͺ ν΄λμ€μ μ μ ν©ν°λ¦¬ λ©μλλ₯Ό λ§λ€ λ μ¬μ©ν μλ μλ€.
4. μ§μ ν΄λμ€ π§
μ§κΈκΉμ§ μ΄ν΄λ³Έ μ€μ²© ν΄λμ€ μ€μμ κ°μ₯ λλ¬Όκ² μ¬μ©λλ€.
public class MyClass {
private int number = 10;
void doSomething() {
class LocalClass {
private void printNumber() {
System.out.println(number);
}
}
}
}
μ§μ λ³μλ₯Ό μ μΈνλ κ³³μ΄λ©΄ μ΄λλ μ§μ ν΄λμ€λ₯Ό μ μν΄ μ¬μ©ν μ μλ€. κ°λ μ±μ μν΄μλ μ§§κ² μμ±ν΄μΌ νλ€.
ν΄λΉ κΈμ λ°±κΈ°μ λμ 'μ΄νν°λΈ μλ° μλ²½ 곡λ΅'μ μ°Έκ³ νμμ΅λλ€.