βοΈ κΉμνμ μ€μ μλ° - μ€κΈ 1νΈ μ λ£κ³ μμ±νλ λ³΅μ΅ λΈλ‘κ·Έ μ λλ€.
0. λ°°κ²½
ν΄λμ€λ₯Ό κ·Έλ₯ λ¨μΌ ν΄λμ€λ‘ μμ±ν΄μ μ¬μ©ν μ μμ§λ§, μ€μ²©ν΄μ μ°κ±°λ λ΄λΆμ μ°κ±°λ λ€μν λ°©μμΌλ‘λ νμ©ν μ μλ€
λ€μνκ² νμ©λλ ν΄λμ€ μ€ μ€μ²© ν΄λμ€μ λ΄λΆ ν΄λμ€μ λν΄μ μμ보μ
1. μ€μ²© ν΄λμ€
π‘ ν΄λμ€ μμ ν΄λμ€λ₯Ό μ€μ²©ν΄μ μ¬μ©νλ κ²
class Outer {
class Nested {...}
}
- μ€μ²© ν΄λμ€λ μ€μ²©μ΄λΌλ λ§μμ μ μ μλ―μ΄ ν΄λμ€ μμ ν΄λμ€λ₯Ό λ£μ΄μ μ¬μ©νλ κ²μ μλ―Ένλ€
- μ΄λ ν΄λμ€λ₯Ό μ μνλ μμΉμ λ°λΌμ λΆλ₯κ° λ¬λΌμ§λ€
- μ΄ 4κ°μ§κ° μκ³ , μΈμ€ν΄μ€ μμμ λ°λΌ ν¬κ² 2κ°μ§λ‘ λΆλ₯ν μ μλ€
μΈμ€ν΄μ€ μμ | μ€μ²© ν΄λμ€ μ΄λ¦ | μ€λͺ |
μ ν λ€λ₯Έ μΈμ€ν΄μ€ | μ μ μ€μ²© ν΄λμ€ (static nested) | static μ μ¬μ©ν΄ μ μΈ |
λ°κΉ₯ μΈμ€ν΄μ€ μμ | λ΄λΆ ν΄λμ€ (inner) | μΈμ€ν΄μ€ λ΄λΆμ μ μΈ |
μ§μ ν΄λμ€ (local) | μ½λ λΈλ‘μ μ μΈ | |
μ΅λͺ ν΄λμ€ (anoymous) | μ΄λ¦ μλ ν΄λμ€ |
β μ€μ²© (Nested) vs λ΄λΆ (Inner)
μ€μ²© : λ€λ₯Έ κ²μ΄ λ΄λΆμ μμΉνκ±°λ ν¬ν¨λλ ꡬ쑰μ μΈ κ΄κ³
→ λ¨μν μμΉλ§ μμ μκ³ , λ΄ κ²μ΄ μλ κ²
λ΄λΆ : λμ λ΄λΆμ μλ λλ₯Ό ꡬμ±νλ μμ
→ μμΉλ μμ μκ³ , λ΄ κ²μΈ κ²
μ€μ²©κ³Ό λ΄λΆλ μμΉκ° μμ μλ κ²μ κ°μ§λ§, λ΄κ²μΈμ§ λ΄κ²μ΄ μλμ§λ‘ λλλ€.
πβοΈ λ΄ κ²μΈ κ²½μ° → μ€μ²©
π βοΈ λ΄ κ²μ΄ μλ κ²½μ° → λ΄λΆ
μ€μ²©ν΄λμ€λ₯Ό μ¬μ©νλ μ΄μ λ
- λ
Όλ¦¬μ κ·Έλ£Ήν
- νΉμ ν΄λμ€κ° λ€λ₯Έ νλμ ν΄λμ€ μμμλ§ μ¬μ©λλ κ²½μ° μ€μ²© ν΄λμ€λ₯Ό μ¬μ©νλ©΄ κ·Έλ£Ήνλ₯Ό ν μ μλ€
- λ€λ₯Έ κ³³μμ μ¬μ©ν νμκ° μλ ν΄λμ€κ° λ ΈμΆλμ§ μκΈ° λλ¬Έμ κ°λ°μμ νΌλμ μ€μ¬μ€λ€
- μΊ‘μν
- μ€μ²© ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ private λ©€λ²μ μ κ·Όν μ μλ€
- λ ν΄λμ€λ₯Ό κΈ΄λ°νκ² μ°κ²°νκ³ , λΆνμν public λ©μλλ₯Ό μ κ±°ν μ μλ€
μ΄μ κ°κ°μ μ€μ²© ν΄λμ€μ λν΄μ μμ보μ
2. μ μ μ€μ²© ν΄λμ€ (static nested class)
π‘ μλ‘ κ΄κ³κ° μλ ν΄λμ€ λ κ°λ₯Ό μ€μ²©ν΄λ ν΄λμ€
- μ μ μ€μ²© ν΄λμ€λ ν΄λμ€ μμ static μ λΆμ¬μ λ§λ λ€
- static μ λΆμ¬μ λ§λ€κΈ° λλ¬Έμ μΈλΆμ ν΄λμ€μ κ΄κ³ μμ΄ ν΄λμ€ λ‘λ© μ Method Area μ λ‘λ©λλ€
public class NestedOuter {
private static int outCalssValue = 3;
private int outInstanceValue = 2;
static class Nested {
private int nestedInstanceValue = 1;
public void print() {
System.out.println(nestedInstanceValue);
System.out.println(outInstanceValue);
System.out.println(outCalssValue);
}
}
}
- μμ μ λ©€λ²λ³μμΈ nestedInstanceValue μλ μ κ·Ό πβοΈ
- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ³μμΈ outInstanceValue μλ μ κ·Ό π βοΈ
- λ°κΉ₯ ν΄λμ€μ ν΄λμ€λ³μμΈ outClassValue μλ μ κ·Ό πβοΈ
μ¬μ€μ NestedOuter μ Nested ν΄λμ€λ ν΄λμ€λ₯Ό λ°λ‘ 2κ°λ₯Ό λ§λ κ²κ³Ό κ°λ€
class NestedOuter {
}
class Nested {
}
→ μ μΌν μ°¨μ΄λ κ°μ ν΄λμ€μ΄κΈ° λλ¬Έμ private μ κ·Ό μ μ΄μμ μ κ·Όν μ μλ€.
3. λ΄λΆ ν΄λμ€
π‘ λ°κΉ₯ ν΄λμ€ μΈμ€ν΄μ€μ μμλλ€
- static μ λΆμ΄μ§ μκ³ class λ‘ λ§λ λ€
- μ½κ² λ§ν΄μ μΈμ€ν΄μ€ λ©€λ²κ° λλ€
public class InnerOuter {
private static int outClassValue = 3;
private int outInstanceValue = 2;
class Inner {
private int innerInstanceValue = 1;
public void print() {
System.out.println(innerInstanceValue);
System.out.println(outInstanceValue);
System.out.println(outClassValue);
}
}
}
- μμ μ λ©€λ²λ³μμΈ nestedInstanceValue μλ μ κ·Ό πβοΈ
- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ³μμΈ outInstanceValue μλ μ κ·Ό πβοΈ
- λ°κΉ₯ ν΄λμ€μ ν΄λμ€λ³μμΈ outClassValue μλ μ κ·Ό πβοΈ
InnerOuter outer = new InnerOuter();
InnerOuter.Inner inner = outer.new Inner();
- λ΄λΆ ν΄λμ€μ κ²½μ° new λ°κΉ₯ν΄λμ€μ μΈμ€ν΄μ€ μ°Έμ‘°.new λ΄λΆν΄λμ€() λ‘ μμ±ν μ μλ€
- μ€μ λ‘λ λ΄λΆ μΈμ€ν΄μ€κ° λ°κΉ₯ μΈμ€ν΄μ€ μμ μμ±λμ§ μκ³ , λ΄λΆ μΈμ€ν΄μ€κ° λ°κΉ₯ μΈμ€ν΄μ€μ μ°Έμ‘°λ₯Ό 보κ΄νλ λ°©μμΌλ‘ μμ±λλ€
- νμ§λ§, κ°λ μ μΈμ€ν΄μ€ μμ μμ±λλ€κ³ μ΄ν΄νλ©΄ λλ€
4. μ§μ ν΄λμ€
π‘ μ§μ λ³μμ κ°μ μμΉμ μμ±λλ ν΄λμ€
- λ΄λΆ ν΄λμ€μ νΉμ§μ κ·Έλλ‘ κ°μ§λ€
- λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ λ³μμ μ κ·Όν μ μλ€
- μ§μλ³μμ κ°μ΄ μ½λ λΈλ μμμ μ μλλ€
- μ§μ λ³μμ²λΌ μ κ·Ό μ μ΄μλ₯Ό μ¬μ©ν μ μλ€
class Outer {
public void process() {
int localVar = 0;
class Local { .. }
}
}
4-1. μλͺ μ£ΌκΈ° λ¬Έμ
μ§μ ν΄λμ€μ κ²½μ° μλͺ μ£ΌκΈ° λ¬Έμ λ₯Ό κ°μ§λ€
λ³μμ μλͺ μ£ΌκΈ°λ μλ νμ κ°λ€
λ³μλͺ | μμ‘΄ μ£ΌκΈ° | λ³μ μ‘΄μ¬ μμ |
ν΄λμ€ λ³μ | ν΄λμ€ μ 보λ₯Ό μ½μ΄λ€μ΄λ μκ°λΆν° νλ‘κ·Έλ¨ μ’ λ£κΉμ§ | λ©μλ μμ |
μΈμ€ν΄μ€ λ³μ | μΈμ€ν΄μ€κ° GC λκΈ° μ κΉμ§ | ν μμ |
μ§μ λ³μ | λ©μλ νΈμΆμ΄ μ’ λ£λ λκΉμ§ | μ€ν μμ |
λ§μ½ μ§μ ν΄λμ€ λ΄λΆμμ μΈλΆ ν΄λμ€μ μ§μ λ³μλ₯Ό μ¬μ©νλ€λ©΄ μλͺ μ£ΌκΈ°κ° λ§μ§ μκ² λλλ°
μ΄λ° κ²½μ°λ μ΄λ»κ² λμν κΉ?
class Outer {
public Printer process() {
int processVar = 1;
class Local implements Printer {
int localVar = 2;
@Override
public void print() {
System.out.println("processVar = " + processVar);
System.out.println("localVar = " + localVar);
}
}
return new Local();
}
public static void main(String[] args) {
Outer outer = new Outer();
Printer printer = outer.process();
printer.print();
}
}
Outer ν΄λμ€ λ΄λΆμ process() λ©μλμ Local μ§μ ν΄λμ€κ° μλ€.
Local μ§μ ν΄λμ€μ print() λ©μλμμ
- process() λ©μλμ μ§μ λ³μμΈ processVar (μλͺ μ£ΌκΈ° : process() λ©μλκ° νΈμΆλ λκΉμ§)
- Local ν΄λμ€μ μΈμ€ν΄μ€ λ³μμΈ localVar (μλͺ μ£ΌκΈ° : Local ν΄λμ€κ° GCμμ μμ λ λκΉμ§
μ μΆλ ₯νλ€.
κ·Έλ¦¬κ³ main μμλ process() λ©μλλ₯Ό νΈμΆνκ³ print() λ©μλλ₯Ό νΈμΆνλλ°
μ΄λ ... ? π€
process() λ©μλλ₯Ό νΈμΆνκ³ λλ©΄ processVar λ³μλ μλͺ μ΄ λ€ν΄μ μ¬λΌμ§λ κ±Έλ‘ μκ³ μλλ°
print() λ©μλ λ΄λΆμμ processVar λ³μλ₯Ό μ¬μ©νκ³ μλ€ !!!! ?
→ μ΄κ±΄ μ§μ λ³μ μΊ‘μ²λ₯Ό ν΅ν΄μ ν΄κ²°λλ€.
4-2. μ§μ λ³μ μΊ‘μ²
π‘ μ§μ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ μμ μ νμν μ§μ λ³μλ₯Ό 볡μ¬ν΄μ μμ±ν μΈμ€ν΄μ€μ λ£μ΄μ€λ€
κ°λ¨νκ² λ§νλ©΄ μ§μ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν λ λ°μμ μ°Έμ‘°νκ³ μλ μ§μ λ³μκ° μλ€λ©΄ 볡μ¬ν΄μ λ§λ€μ΄μ€λ€
- μ§μ ν΄λμ€ μΈμ€ν΄μ€ μμ± μλ
- μ¬μ©νλ μ§μλ³μ 볡μ¬
- μ§μ λ³μ λ³΅μ¬ μλ£
- μΈμ€ν΄μ€ μμ± μλ£
μ κ³Όμ μ ν΅ν΄ μ§μ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λκΈ° λλ¬Έμ μμ κ°μ μλͺ μ£ΌκΈ° λ¬Έμ κ° λ°μνμ§ μλλ€
μ΄λ κ² λ³΅μ¬λ₯Ό νκΈ° λλ¬Έμ μ§μ ν΄λμ€κ° μ κ·Όνλ μ§μ λ³μλ μ€κ°μ κ°μ΄ λ³νλ©΄ μλλ€. (μ¬μ€μ final)
5. μ΅λͺ ν΄λμ€
π‘ ν΄λμ€ μ΄λ¦μ΄ μλ μ§μ ν΄λμ€
- μ΅λͺ ν΄λμ€λ μ§μ ν΄λμ€μ νΉλ³ν μ’ λ₯ μ€μ νλλ€
- μ§μ ν΄λμ€μ΄μ§λ§, ν΄λμ€μ μ΄λ¦μ κ°μ§μ§ μλλ€
Printer printer = new Printer() {
int value = 0;
@Override
public void print() {
System.out.println("value = " + value);
}
};
- μμ μ½λμ²λΌ ν΄λμ€μ μ΄λ¦μ μλ΅νκ³ ν΄λμ€μ μ μΈκ³Ό μμ±μ λμμ μ²λ¦¬ν μ μλ€
- Printer μ μΈν°νμ΄μ€μΈλ° μΈν°νμ΄μ€λ₯Ό μμ±νλ κ²μ²λΌ 보μ΄μ§λ§, μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ ν΄λμ€λ₯Ό μμ±νλ κ²μ΄λ€
- μ΅λͺ ν΄λμ€λ λΆλͺ¨ ν΄λμ€λ₯Ό μμλ°κ±°λ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ―λ‘ μμ ν΄λμ€λ μΈν°νμ΄μ€κ° νμνλ€
μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μΈμλ‘ ν΄λμ€λ₯Ό λ°λ‘ λκΈΈ μ μλ€
hello(new Process() {
@Override
public void run() {
int randomValue = new Random().nextInt(6) + 1;
System.out.println("μ£Όμ¬μ = " + randomValue);
}
});
→ μ΄κ² μ’ λ λ°μ ν΄μ λλ€κ° λλ€!! (lambda)
'π± μΈνλ° > βοΈ κΉμνμ μ€μ μλ° - μ€κΈ 1νΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλ° Object ν΄λμ€ (0) | 2025.09.01 |
---|---|
μλ° λνΌ, Class μ΄μ 리 (0) | 2025.07.19 |
μλ° μμΈμ²λ¦¬ μ΄μ 리 (1) | 2025.07.11 |
μλ° μ΄κ±°ν ENUM μ΄μ 리 (2) | 2025.07.10 |
μλ° λ μ§μ μκ° λΌμ΄λΈλ¬λ¦¬ μ΄μ 리 (0) | 2025.07.07 |