μ€μ²© ν΄λμ€μ μ€μ²© μΈν°νμ΄μ€
ν΄λμ€λ€μ μλ‘ κΈ΄λ°ν κ΄κ³λ₯Ό λ§Ίκ³ μνΈμμ©μ νλ€.
ν΄λμ€κ° μ¬λ¬ ν΄λμ€μ κ΄κ³λ₯Ό λ§Ίλ κ²½μ°μλ λ 립μ μΌλ‘ μ μΈνλ κ²μ΄ μ’μΌλ
νΉμ ν΄λμ€μ κ΄κ³λ₯Ό λ§Ίμ κ²½μ°μλ ν΄λμ€ λ΄λΆμ μ μΈνλ κ²μ΄ μ’λ€.
1. μ€μ²© ν΄λμ€
μ€μ²© ν΄λμ€λ ν΄λμ€ λ΄λΆμ μ μΈν ν΄λμ€λ₯Ό λ§νλ€. μ€μ²© ν΄λμ€λ₯Ό μ΄μ©νλ©΄ λ ν΄λμ€μ λ©€λ²λ€μ μλ‘ μ½κ² μ κ·Όν μ μκ³ μΈλΆμλ λΆνμν κ΄κ³ ν΄λμ€λ₯Ό κ°μΆ€μΌλ‘μ¨ μ½λμ 볡μ‘μ±μ μ€μΌ μ μλ€.
class ClassNameA {
// 1. μΈμ€ν΄μ€ λ©€λ² ν΄λμ€: A κ°μ²΄λ₯Ό μμ±ν΄μΌλ§ μ¬μ©ν μ μλ B ν΄λμ€
class NestedClassNameB {
// μμ±μ
// μΈμ€ν΄μ€ νλ, μΈμ€ν΄μ€ λ©μλ
// μ μ νλ, μ μ λ©μλ (λΆκ°λ₯)
}
// 2. μ μ λ©€λ² ν΄λμ€: A ν΄λμ€λ‘ λ°λ‘ μ κ·Όν μ μλ C ν΄λμ€
static class NestedClassNameC {
// μμ±μ
// μΈμ€ν΄μ€ νλ, μΈμ€ν΄μ€ λ©μλ
// μ μ νλ, μ μ λ©μλ
}
void method() {
// μΈμ€ν΄μ€ λ©€λ² ν΄λμ€ μ¬μ© μ: λλΆλΆ ν΄λμ€ λ΄λΆμμ μ¬μ©
NestedClassNameB b = new NestedClassNameB();
b.field = 1;
b.method();
// 3. λ‘컬 ν΄λμ€: μμ±μλ method()κ° μ€νλ λλ§ μ¬μ©ν μ μλ D ν΄λμ€
// μ£Όλ‘ λΉλκΈ° μ²λ¦¬λ₯Ό μν΄ μ€λ λ κ°μ²΄λ₯Ό λ§λ€ λ μ¬μ©
// μ κ·Ό μ νμ λ° static (λΆκ°λ₯)
class NestedClassNameD {
// μμ±μ
// μΈμ€ν΄μ€ νλ, μΈμ€ν΄μ€ λ©μλ
// μ μ νλ, μ μ λ©μλ (λΆκ°λ₯)
}
// λ‘컬 ν΄λμ€ μ¬μ© μ
NestedClassNameD d = new NestedClassNameD();
d.field = 1;
d.method();
}
}
// μΈμ€ν΄μ€ λ©€λ² ν΄λμ€ μ¬μ© μ: μΈλΆ
ClassNameA a = new ClassNameA();
ClassNameA.NestedClassNameB b = a.new NestedClassNameB();
b.field = 1;
b.method();
// μ μ λ©€λ² ν΄λμ€ μ¬μ© μ
ClassNameA.NestedClassNameC c = new ClassNameA.NestedClassNameC();
c.field = 1;
c.method();
ClassNameA.NestedClassNameC.field = 2;
ClassNameA.NestedClassNameC.method();
1) μ€μ²© ν΄λμ€μ μ κ·Ό μ ν
- λ°κΉ₯ νλμ λ©μλμμ μ¬μ© μ ν
- μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ νλμ μΈμ€ν΄μ€ λ©μλμμ κ°μ²΄λ₯Ό μμ±ν μ μμΌλ μ μ νλμ μ μ λ©μλμμλ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
- μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ λͺ¨λ νλμ λ©μλμμ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
- λ©€λ² ν΄λμ€μμ μ¬μ© μ ν
- μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ λͺ¨λ νλμ λ©μλμ μ κ·Όν μ μλ€.
- μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μ μ νλμ μ μ λ©μλμλ§ μ κ·Όν μ μλ€.
- λ‘컬 ν΄λμ€μμ μ¬μ© μ ν
- final νΉμ±μ κ°μ§ λ§€κ° λ³μλ λ‘컬 λ³μλ§ λ‘컬 ν΄λμ€ λ΄λΆμμ μ¬μ©ν μ μλ€.
2. μ€μ²© μΈν°νμ΄μ€
μ€μ²© μΈν°νμ΄μ€λ ν΄λμ€ λ΄λΆμ μ μΈλ μΈν°νμ΄μ€λ₯Ό λ§νλ€. ν΄λΉ ν΄λμ€μ κΈ΄λ°ν κ΄κ³λ₯Ό λ§Ίλ ꡬν ν΄λμ€λ₯Ό λ§λ€κΈ° μν΄μ μ¬μ©νλ€.
class ClassNameA {
NestedInterfaceName iface; // μΈν°νμ΄μ€ νμ
νλ: ꡬν κ°μ²΄λ₯Ό λμ
ν΄ μ¬μ©
// 1. μΈμ€ν΄μ€ λ©€λ² μΈν°νμ΄μ€
interface NestedInterfaceNameB {
}
// 2. μ μ λ©€λ² μΈν°νμ΄μ€
static interface NestedInterfaceNameB {
}
}
3. μ΅λͺ κ°μ²΄
μ΅λͺ κ°μ²΄λ ν΄λμ€ μ΄λ¦μ΄ μλ κ°μ²΄λ₯Ό λ§νλλ° μ΄λ€ ν΄λμ€λ₯Ό μμνκ±°λ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌλ§ νλ€.
// μμ: μ΄λ¦ μλ μμ κ°μ²΄ μ°Έμ‘°
λΆλͺ¨ν΄λμ€ λ³μ = new λΆλͺ¨ν΄λμ€() {};
// ꡬν: μ΄λ¦ μλ ꡬν κ°μ²΄ μ°Έμ‘°
μΈν°νμ΄μ€ λ³μ = new μΈν°νμ΄μ€() {};
1) μ΅λͺ μμ κ°μ²΄
- μμ ν΄λμ€κ° μ¬μ¬μ©λμ§ μκ³ νΉμ μμΉμμλ§ μ¬μ©λ κ²½μ° μ΅λͺ μμ κ°μ²΄λ₯Ό μμ±ν΄μ μ¬μ©νλ κ²μ΄ μ’λ€.
- νλ μ΄κΈ°κ°, λ©μλ λ‘컬 λ³μ, λ©μλ 맀κ°λ³μ λ± μ¬λ¬ κ³³μμ μ¬μ©ν μ μλ€.
- μ΅λͺ μμ κ°μ²΄μ μλ‘κ² μ μλ νλμ λ©μλλ μΈλΆμμ μ κ·Όν μ μλ€.
λΆλͺ¨ν΄λμ€ [νλ | λ³μ] = new λΆλͺ¨ν΄λμ€(μμ±μ맀κ°κ°, ...) {
// μμ±μ (λΆκ°λ₯)
// νλ
// λ©μλ
// λΆλͺ¨ ν΄λμ€ λ©μλ μ¬μ μ
};
2) μ΅λͺ ꡬν κ°μ²΄
- ꡬν ν΄λμ€κ° μ¬μ¬μ©λμ§ μκ³ νΉμ μμΉμμλ§ μ¬μ©λ κ²½μ° μ΅λͺ ꡬν κ°μ²΄λ₯Ό μμ±ν΄μ μ¬μ©νλ κ²μ΄ μ’λ€.
- νλ μ΄κΈ°κ°, λ©μλ λ‘컬 λ³μ, λ©μλ 맀κ°λ³μ λ± μ¬λ¬ κ³³μμ μ¬μ©ν μ μλ€.
μΈν°νμ΄μ€ [νλ | λ³μ] = new μΈν°νμ΄μ€() {
// μΈν°νμ΄μ€μ μ μΈλ μΆμ λ©μλμ μ€μ²΄ λ©μλ μ μΈ
// νλ
// λ©μλ
};
3) μ΅λͺ κ°μ²΄μ λ‘컬 λ³μ μ¬μ©
- final νΉμ±μ κ°μ§ λ§€κ° λ³μλ λ‘컬 λ³μλ§ μ΅λͺ κ°μ²΄ λ΄λΆμμ μ¬μ©ν μ μλ€.