[Java] ν΄λμ€ μμ ν΄λμ€ / Static Nested Class, Member Inner Class, Local Inner class, Anonymous Inner Class
μΆμ²
ChatGPT
Nested Class ꡬ쑰
Nested class
⨽ Static Nested Class
⨽ Inner class
⨽ Memeber Inner Class (Non-static Inner Class, Inner Class)
⨽ Local Inner class (Local Class)
⨽ Anonymouse Inner class (Anonymouse Class)
1. Outer class
- μΈλΆ ν΄λμ€λ λͺ¨λ μ€μ²© ν΄λμ€(nested class)μ 컨ν μ΄λ μν μ νλ€.
- μ€ν λ λͺ¨λ ν΄λμ€λ μΈλΆ ν΄λμ€ λ΄λΆμ μ μλλ€.
2. Static Nested Class
class OuterClass {
static class StaticNestedClass {
// Static Nested Class code
}
}
μ‘΄μ¬ μ΄μ
1. λ©λͺ¨λ¦¬ κ΄λ¦¬
static nested classλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λ 립μ μ΄κΈ° λλ¬Έμ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€μ§ μκ³ λ μ¬μ©ν μ μλ€. μ΄λ λ©λͺ¨λ¦¬ μ¬μ©μ μ΅μ ννλ λ° μ μ©νλ€. μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό νμλ‘ νμ§ μλ κ²½μ°, λ©λͺ¨λ¦¬ ν¨μ¨μ±μ λμΌ μ μλ€.
2. μμ§λ ν₯μ
κ΄λ ¨ μλ ν΄λμ€λ€μ νλμ λ Όλ¦¬μ μΈ λ¨μλ‘ λ¬Άμ΄ κ΄λ¦¬ν μ μκ² ν©λλ€. μΈλΆ ν΄λμ€μ λ Όλ¦¬μ μΌλ‘ κ΄λ ¨μ΄ μμ§λ§, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μλ μκ΄μλ ν΄λμ€λ₯Ό μ μν λ static nested classκ° μ ν©ν©λλ€.
3. μΊ‘μν
static nested classλ μΈλΆ ν΄λμ€μ λΉκ³΅κ° λ©€λ²μ μ κ·Όν μ μκΈ° λλ¬Έμ, λ Όλ¦¬μ μΈ κ΄κ³λ₯Ό μ μ§νλ©΄μλ μΈλΆ ν΄λμ€μμ λΆνμν κ²°ν©μ νΌν μ μμ΅λλ€.
4. μ νΈλ¦¬ν° ν΄λμ€
μ νΈλ¦¬ν° μν μ νλ ν΄λμ€λ μΈλΆ ν΄λμ€μμ μΈμ€ν΄μ€ κ΄κ³κ° νμ μμΌλ―λ‘ static nested classλ‘ μ μΈνλ κ²μ΄ μ μ ν©λλ€.
νΉμ§
- static ν€μλλ₯Ό κ°μ§λ©° μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λ 립μ μΌλ‘ μ‘΄μ¬λ€.
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄ μμ± κ°λ₯νλ€.
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
- μΈλΆ ν΄λμ€μ λΉμ μ λ©€λ²μ μ§μ μ κ·Όν μ μλ€. λ€λ§, μΈλΆ ν΄λμ€μ static λ©€λ²μλ μ κ·Όμ΄ κ°λ₯νλ€.
μΈλΆ ν΄λμ€μμ μ°Έμ‘° κ°λ₯ν λ³μλ€
- μ°Έμ‘° κ°λ₯: μΈλΆ ν΄λμ€μ static λ³μ
- μ°Έμ‘° λΆκ°: μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ
ν΄λμ€ λ‘λμ μμ± μ λ©λͺ¨λ¦¬ λμ
3. Inner class
- λ΄λΆ ν΄λμ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ’ μμ μ΄λ€.
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ΄μΌλ§ μ¬μ©λ μ μμΌλ©°, μΈλΆ ν΄λμ€μ λΉμ μ λ©€λ²μ μ κ·Όν μ μλ€.
3.1 Memeber Inner Class (Inner Class)
class OuterClass {
class InnerClass {
// Non-static Inner Class code
}
}
μ‘΄μ¬ μ΄μ
- Non-static Inner Classλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ κ°νκ² κ²°ν©λμ΄ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λ νμλ§ μμ±λ μ μλ€. λ°λΌμ μΈλΆ ν΄λμ€μ λ°μ΄ν°λ λ©μλμ λ°μ νκ² μ°κ²°λ μμ μ μνν λ μ μ©νλ€.
- μΈλΆ ν΄λμ€μ μΈλΆ ꡬνμ Non-static Inner Classλ₯Ό ν΅ν΄ μλν μ μλ€. μλ₯Ό λ€μ΄, νΉμ μμ μ΄λ λ‘μ§μ λ΄λΆ ν΄λμ€μμλ§ μ²λ¦¬νλλ‘ νμ¬ μΈλΆμμ μ§μ μ κ·Όνμ§ λͺ»νκ² ν μ μλ€.
- μ½λ ꡬ쑰λ₯Ό λͺ¨λννλ λ° λμμ μ€λ€. ν ν΄λμ€ λ΄λΆμ κ΄λ ¨λ μλΈ κΈ°λ₯λ€μ κ°μ§λ ν΄λμ€λ₯Ό μ μνλ©΄ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ λμμ§λ€.
νΉμ§
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ μ κ·Όν μ μμΌλ©°, μΈλΆ ν΄λμ€ μΈμ€ν΄μ€μ μ°κ΄λμ΄ λμνλ€.
- μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μ‘΄μ¬ν΄μΌλ§ μμ±ν μ μλ€.
- μΈλΆ ν΄λμ€μ private λ©€λ²μλ μ κ·Όν μ μλ€.
- μ£Όλ‘ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλλ μμ±μ λ΄μμ μ¬μ©λλ€. ...? μμ νμ...?
μΈλΆ ν΄λμ€μμ μ°Έμ‘° κ°λ₯ν λ³μλ€
- μ°Έμ‘° κ°λ₯: μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ, static λ³μ
μ¬μ© μμ
- GUI μ ν리μΌμ΄μ : μ΄λ²€νΈ νΈλ€λ¬λ UI μ»΄ν¬λνΈμ κ°μ κΈ°λ₯μ΄ μΈλΆ ν΄λμ€μ κ°νκ² μ°κ²°λμ΄ μμ λ Non-static Inner Classλ₯Ό μ¬μ©νλ€.
class Outer {
private String name;
class Inner {
void showName() {
System.out.println("Name: " + name); // μΈλΆ ν΄λμ€μ νλμ μ κ·Ό κ°λ₯
}
}
}
ν΄λμ€ λ‘λμ μμ± μ λ©λͺ¨λ¦¬ λμ
3.2 Local Inner class (Local Class)
class OuterClass {
void someMethod() {
class LocalClass {
// Local class inside a method
}
}
}
μ‘΄μ¬ μ΄μ
- Local Classλ λ©μλ λ΄λΆμ μ μΈλμ΄ λ©μλμ νΉμ μμ μ μΊ‘μννλ€. λ‘μ§μ΄ 볡μ‘ν΄μ§ λ, ν΄λΉ λ‘μ§μ λ©μλ λ΄λΆμμ ν΄λμ€ ννλ‘ λΆλ¦¬ν΄ μμ±ν μ μλ€.
- νΉμ λ©μλ λ΄μμλ§ μλ―Έκ° μλ ν΄λμ€λ₯Ό μ μν μ μμ΄ μ½λμ ꡬ쑰νμ κ°λ μ±μ λμΌ μ μλ€.
- νΉμ 리μμ€λ λ°μ΄ν°μ μ²λ¦¬κ° νλμ λ©μλμλ§ κ΅νλ λ, Local Classλ‘ μ μΈνμ¬ μ½λμ λͺ¨λμ±μ λμ΄κ³ νμ μλ μ μ μ κ·Όμ νΌν μ μλ€.
νΉμ§
- Local classλ λ©μλ λ΄λΆμ μ μλ ν΄λμ€μ΄λ€.
- Local Classλ λ©μλλ μμ±μμ λ΄λΆμμ μ μΈλλ―λ‘, ν΄λΉ λ©μλλ μμ±μκ° μ€νλ λμλ§ μ ν¨νλ€.
- 볡μ‘ν λ‘μ§μ μ²λ¦¬νκΈ° μν΄ λ©μλ λ΄λΆμ ν΄λμ€λ₯Ό μ μΈνμ¬ μ¬μ©νλ κ²½μ°κ° λ§λ€.
- μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Όν μ μλ€.
- λ©μλμ μ μΈλ λ‘컬 λ³μλ₯Ό μ°Έμ‘°ν μ μμΌλ, μ°Έμ‘°λ λ³μλ final λλ effectively finalμ΄μ΄μΌ νλ€.
- Local classκ° μ°Έμ‘°νλ λ©μλ μ λ‘컬 λ³μκ° final λλ effectively final μ΄μ΄μΌ νλ μ΄μ
Local classκ° μ°Έμ‘°νλ λ©μλ μ λ‘컬 λ³μκ° final λλ effectively final μ΄μ΄μΌ νλ μ΄μ
Local calssμμ λ‘컬 λ³μλ₯Ό μ°Έμ‘°ν μ μμ§λ§, μ°Έμ‘°λ λ³μλ final λλ effectively finalμ΄μ΄μΌ νλ€λ κ·μΉμ μ΄μ λ μλ°μ λ©λͺ¨λ¦¬ λͺ¨λΈκ³Ό κ΄λ ¨μ΄ μλ€.
1. λ‘컬 λ³μμ μλͺ μ£ΌκΈ°μ ν΄λμ€μ μλͺ μ£ΌκΈ°
- λ‘컬 λ³μλ λ©μλκ° μ’ λ£λλ©΄ λ©λͺ¨λ¦¬μμ μ¬λΌμ§λ€. μ¦, μ€ν λ©λͺ¨λ¦¬μμ μ κ±°λλ€.
- νμ§λ§ λ‘컬 ν΄λμ€λ λ©μλκ° μ’ λ£λ μ΄νμλ μ€νλ μ μλ€. λ©μλκ° μ’ λ£λ νμλ λ‘컬 ν΄λμ€κ° λ©λͺ¨λ¦¬ μμμ μ΄μλ¨μ ν΄λΉ λ³μλ₯Ό μ°Έμ‘°νλ €λ κ²½μ°, μ΄λ―Έ λ©λͺ¨λ¦¬μμ μ¬λΌμ§ λ³μμ μ κ·Όνλ €κ³ νκ² λμ΄ λ¬Έμ κ° λ°μνλ€.
λ‘컬 ν΄λμ€κ° λ©μλκ° μ’ λ£λ μ΄νμλ μ€νλ μ μλ μν©μ λν μμ
λ‘컬 ν΄λμ€κ° λ©μλ λ΄λΆμμ μ μλμμ§λ§, ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€κ° λ©μλ μΈλΆμμλ μλν μ μλ μν©μ μμλ‘ λ€μ κ²μ΄λ€.
μλ μμ λ java.lang.Runnable μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ λ©ν°μ€λ λ νλ‘κ·Έλ¨μ΄λ€. μ΄ νλ‘κ·Έλ¨μμλ λ©μλ λ΄λΆμ λ‘컬 ν΄λμ€λ₯Ό μ μνκ³ , κ·Έ ν΄λμ€μ μΈμ€ν΄μ€κ° λ©μλκ° μ’ λ£λ νμλ μ€νλλ μν©μ 보μ¬μ€λ€.
public class LocalClassExample {
public void startThread() {
// λ©μλ λ΄λΆμμ λ‘컬 ν΄λμ€ μ μ
class Task implements Runnable {
@Override
public void run() {
// λ©μλκ° μ’
λ£λ νμλ μ€νλ λ‘μ§
System.out.println("Task is running...");
}
}
// λ‘컬 ν΄λμ€μ μΈμ€ν΄μ€ μμ±
Task task = new Task();
// μλ‘μ΄ μ€λ λλ₯Ό μμνλ©΄μ λ‘컬 ν΄λμ€ μΈμ€ν΄μ€ μ€ν
Thread thread = new Thread(task);
thread.start(); // μ€λ λκ° μμλλ©΄ λ©μλκ° μ’
λ£λ νμλ Taskκ° μ€νλ¨
}
public static void main(String[] args) {
LocalClassExample example = new LocalClassExample();
example.startThread();
System.out.println("Main method finished.");
}
}
μ€ν κ²°κ³Ό
Main method finished.
Task is running...
μ€λͺ
- startThread() λ©μλ λ΄λΆμμ TaskλΌλ μ΄λ¦μ λ‘컬 ν΄λμ€λ₯Ό μ μνλ€. μ΄ ν΄λμ€λ Runnable μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ€λ λμμ μ€νλ μ μλ€.
- Task ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , ν΄λΉ μΈμ€ν΄μ€λ₯Ό Thread κ°μ²΄μ μ λ¬ν λ€ thread.start()λ₯Ό νΈμΆνλ€. μ΄λ‘ μΈν΄ μλ‘μ΄ μ€λ λκ° μμλκ³ , Task ν΄λμ€μ run() λ©μλκ° μ€νλλ€.
- startThread() λ©μλλ μ€λ λκ° μ€νλλ λμ€μ μ’ λ£λμ§λ§, Task ν΄λμ€λ μ€λ λ λ΄μμ μ€νλλ―λ‘ λ©μλκ° μ’ λ£λ νμλ Taskμ run() λ©μλκ° κ³μν΄μ μ€νλλ€.
μ΄ μμμμμ²λΌ, λ‘컬 ν΄λμ€λ λ©μλ λ΄λΆμμ μ μλμ§λ§, κ·Έ μΈμ€ν΄μ€λ λ©μλκ° μ’ λ£λ νμλ μ€νλ μ μλ€.
2. μΊ‘μ³λ λ³μ 볡μ¬
- μλ°μμλ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ‘컬 λ³μμ κ°μ 볡μ¬ν΄μ λ‘컬 ν΄λμ€κ° ν΄λΉ κ°μ μ¬μ©νκ² νλ€. μ΄λ, κ°μ΄ λ³κ²½λλ©΄ 볡μ¬λ κ°κ³Ό μλ λ³μμ κ°μ΄ μΌμΉνμ§ μκ² λλ λ¬Έμ κ° μκΈ΄λ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ ν΄λΉ λ³μλ finalμ΄κ±°λ effectively finalμ΄μ΄μΌ νλ€λ μ νμ΄ μ μ©λλ€. μ΄λ κ² ν¨μΌλ‘μ¨, λ‘컬 ν΄λμ€κ° μ°Έμ‘°νλ κ°μ΄ λ³κ²½λμ§ μμμ 보μ₯νλ€.
3. final λλ effectively finalμ μλ―Έ
- final: ν΄λΉ λ³μκ° ν λ²λ§ μ΄κΈ°νλκ³ λ³κ²½λμ§ μμμ μνλ€. μ¦, λ‘컬 ν΄λμ€κ° μ°Έμ‘°νλ κ°μ΄ λΆλ³νκ² λ³΄μ₯λλ€.
- effectively final: final ν€μλκ° λͺ μμ μΌλ‘ μ μΈλμ§ μμμ§λ§, ν΄λΉ λ³μκ° μ½λμμ λ³κ²½λμ§ μμμ μλ―Ένλ€. μ΄λ μλ° 8 μ΄νλΆν° λμ λ κ°λ μΌλ‘, λ³μμ κ°μ΄ ν λ² μ€μ λ ν λ³κ²½λμ§ μλλ€λ©΄ effectively finalλ‘ κ°μ£Όλλ€.
κ²°λ‘
λ‘컬 ν΄λμ€μμ μ°Έμ‘°λλ λ³μλ λ©λͺ¨λ¦¬ λͺ¨λΈκ³Ό λμμ λν μΌκ΄μ±μ μ μ§νκΈ° μν΄ final λλ effectively finalλ‘ μ νλλ€. μ΄λ‘μ¨, λ©λͺ¨λ¦¬μμ μ¬λΌμ§κ±°λ λ³μ§λ λ³μλ₯Ό μ°Έμ‘°νλ €λ μνμ λ°©μ§νκ³ , μμ μ μΈ μ½λ λμμ 보μ₯νλ€.
μΈλΆ ν΄λμ€μμ μ°Έμ‘° κ°λ₯ν λ³μλ€
- μ°Έμ‘° κ°λ₯: μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ/static λ³μ, μΈλΆ λ©μλμ final λλ effectively final λ³μ
μ¬μ© μμ
- μ΄λ²€νΈ κΈ°λ° νλ‘κ·Έλλ°: μ΄λ²€νΈ μ²λ¦¬μ νμν λ‘μ§μ λ©μλ λ΄λΆμμ μ²λ¦¬ν΄μΌ ν λ Local Classκ° μ μ©νλ€.
class Outer {
public void someMethod() {
class Local {
void print() {
System.out.println("This is a local class");
}
}
Local local = new Local();
local.print();
}
}
ν΄λμ€ λ‘λμ μμ± μ λ©λͺ¨λ¦¬ λμ
3.3 Anonymouse Inner class (Anonymouse class)
class OuterClass {
void someMethod() {
Runnable r = new Runnable() {
public void run() {
// Anonymous inner class code
}
};
}
}
μ‘΄μ¬ μ΄μ
- μΈν°νμ΄μ€λ μΆμ ν΄λμ€μ κ°λ¨ν ꡬνμ²΄κ° νμν κ²½μ°, λ³λμ ν΄λμ€λ₯Ό μ μΈνμ§ μκ³ μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νμ¬ λΉ λ₯΄κ² μ½λλ₯Ό μμ±ν μ μλ€.
- νΉμ κ°μ²΄κ° ν λ²λ§ μ¬μ©λκ±°λ λ§€μ° μ νλ λ²μμμ μ¬μ©λ λ μ μ©νλ€. μ£Όλ‘ μ½λ°±, μ΄λ²€νΈ 리μ€λ, μ€λ λ μμ λ±μμ μ¬μ©λλ€.
- νΉμ λ©μλλ₯Ό ν λ²λ§ μ€λ²λΌμ΄λν΄μ μ¬μ©ν λ λ³λμ ν΄λμ€λ₯Ό μ μνλ λμ μ΅λͺ ν΄λμ€λ₯Ό ν΅ν΄ ν΄λΉ λ©μλλ₯Ό μ¬μ μν μ μλ€.
νΉμ§
- μ΅λͺ ν΄λμ€λ μ΄λ¦μ΄ μλ λ΄λΆ ν΄λμ€λ€.
- ν΄λμ€ μ μμ λμμ μΈμ€ν΄μ€νλλ€.
- μ£Όλ‘ μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ₯Ό ꡬνν λ μ¬μ©νλ€.
- μΌμμ μΌλ‘ ν λ²λ§ μ¬μ©νκ³ λ²λ €μ§λ€. μ¬μ¬μ©λμ§ μλλ€.
- μ¬μ¬μ©μ±μ΄ μκ³ νμ₯μ±μ νμ©νλ κ²μ΄ μ μ§λ³΄μμ λ λΆλ¦¬ν λ μ¬μ©νλ€.
μΈλΆ ν΄λμ€μμ μ°Έμ‘° κ°λ₯ν λ³μλ€
- μ°Έμ‘° κ°λ₯: μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ, μΈλΆ ν΄λμ€μ static λ³μ, μΈλΆ λ©μλμ final λλ effectively final λ³μ
μ¬μ© μμ
- μ΄λ²€νΈ 리μ€λ: λ²νΌ ν΄λ¦, λ§μ°μ€ μ΄λ²€νΈ λ± μ΄λ²€νΈ κΈ°λ° νλ‘κ·Έλλ°μμ κ°λ¨νκ² μ΄λ²€νΈ νΈλ€λ¬λ₯Ό μ μνλ λ° μ μ©νλ€.
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked!");
}
});
ν΄λμ€ λ‘λμ μμ± μ λ©λͺ¨λ¦¬ λμ
μ 리
- Static nested classλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄λ μ¬μ©ν μ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ ν¨μ¨μ±μ λμ΄κ³ , μΈλΆ ν΄λμ€μμ κ²°ν©μ μ€μ΄λ©΄μ λ Όλ¦¬μ μμ§λλ₯Ό μ μ§νλ λ° μ 리νλ€.
- Member inner classλ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λ°μ ν κ΄κ³λ₯Ό κ°μ§λ©°, μΈλΆ ν΄λμ€μ μνλ₯Ό μ½κ² μ°Έμ‘°νκ±°λ λ³κ²½ν μ μλ ꡬ쑰μ΄λ€.
- Local classμ Anonymous classλ νΉμ 컨ν μ€νΈμμλ§ μ‘΄μ¬νλ μΌμμ μΈ ν΄λμ€λ‘, μ½λμ κ°λ μ±κ³Ό λͺ λ£μ±μ λμ΄κΈ° μν μ©λλ‘ μ¬μ©λλ€.