βΆ λ΄λΆ ν΄λμ€
*λ΄λΆ ν΄λμ€ μ μμ μ ν → μ£Όλ‘ λ³΄μμͺ½μμ λ§μ΄ μ°μ
λ΄λΆ ν΄λμ€λ λ§ κ·Έλλ‘ 'ν΄λμ€ λ΄λΆμ μ μΈν ν΄λμ€'μ΄λ€. λ΄λΆμ ν΄λμ€λ₯Ό μ μΈνλ μ΄μ λ λκ° μ΄ ν΄λμ€μ μΈλΆ ν΄λμ€κ° λ°μ ν κ΄λ ¨μ΄ μκΈ° λλ¬Έμ΄λ€. λν κ·Έ λ°μ λ€λ₯Έ ν΄λμ€μ νλ ₯ν μΌμ΄ μλ κ²½μ°μ λ΄λΆ ν΄λμ€λ‘ μ μΈν΄μ μ¬μ©νλ€.
μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€, μ μ (static) λ΄λΆ ν΄λμ€, μ§μ(local) λ΄λΆ ν΄λμ€κ° μλλ°, μ΄κ²μ ν΄λμ€ λ΄λΆμ μ μΈνλ λ³μμ μ ν(μΈμ€ν΄μ€ λ³μ, μ μ λ³μ, μ§μ λ³μ)κ³Ό μ μ¬νλ€. λ§μ§λ§μΌλ‘ ν΄λμ€ μ΄λ¦ μμ΄ μ μΈνκ³ λ°λ‘ μμ±νμ¬ μ¬μ©ν μ μλ μ΅λͺ (anonymous) λ΄λΆ ν΄λμ€κ° μλ€.
β
β
β
*μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€
μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€λ μΈμ€ν΄μ€ λ³μλ₯Ό μ μΈν λμ κ°μ μμΉμ μ μΈνλ©°, μΈλΆ ν΄λμ€ λ΄λΆμμλ§ μμ±νμ¬ μ¬μ©νλ κ°μ²΄λ₯Ό μ μΈν λ μ΄λ€. μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€λ μΈλΆ ν΄λμ€ μμ± ν μμ±λλ€. λ°λΌμ μΈλΆ ν΄λμ€λ₯Ό λ¨Όμ μμ±νμ§ μκ³ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©ν μλ μλ€. (μ μ λ΄λΆ ν΄λμ€μ λ€λ₯Έ μ )
β
β
InnerTest.java
package innerclass;
class OutClass { // μΈλΆ ν΄λμ€
private int num = 10; // μΈλΆ ν΄λμ€ private λ³μ
private static int sNum = 20; // μΈλΆ ν΄λμ€ μ μ λ³μ
private InClass inClass; // λ΄λΆ ν΄λμ€ μλ£ν λ³μλ₯Ό λ¨Όμ μ μΈ
public OutClass() { // μΈλΆ ν΄λμ€ λν΄νΈ μμ±μ. μΈλΆ ν΄λμ€κ° μμ±λ νμ λ΄λΆ ν΄λμ€ μμ± κ°λ₯
inClass = new InClass();
}
class InClass { // μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€
int inNum = 100; // λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ
// static int sInNum = 200; ← μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ μ μ λ³μ μ μΈ λΆκ°λ₯
void inTest() {
System.out.println("OutClass sNum = " + sNum + "(μΈλΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
System.out.println("InStaticClass sInNum = " + sInNum + "(λ΄λΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
}
// static void sTtest() {} ← μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ μ μ λ©μλ μ μ λΆκ°λ₯
}
public void usingClass() {
inClass.inTest();
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass outClass = new OutClass();
System.out.println("μΈλΆ ν΄λμ€ μ΄μ©νμ¬ λ΄λΆ ν΄λμ€ κΈ°λ₯ νΈμΆ");
outClass.usingClass(); // λ΄λΆ ν΄λμ€ κΈ°λ₯ νΈμΆ
}
}
<μ€ν κ²°κ³Ό>
-μΈλΆ ν΄λμ€λ₯Ό λ¨Όμ μμ±ν΄μΌ λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©ν μ μλ€.
β
β
β
*μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μμ μ¬μ©νλ λ³μμ λ©μλ
Class λ³μλ Class λ©μλλ μ¬μ© λΆκ°!
ν΄λμ€μ μμ±κ³Ό μκ΄μμ΄ μ¬μ©ν μ μλ μ μ λ³μλ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μμ μ μΈν μ μλ€.
λ§μ°¬κ°μ§ μ΄μ λ‘ μ μ λ©μλλ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μμ μ μΈν μ μλ€.
μ 리νμλ©΄, μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€λ μΈλΆ ν΄λμ€κ° λ¨Όμ μμ±λμ΄μΌ μ¬μ©ν μ μλ€. κ·Έλ¦¬κ³ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ λ©μλλ μΈλΆ ν΄λμ€μ λ©μλκ° νΈμΆλ λ μ¬μ©ν μ μλ€.
β
β μ΄λ€ ν΄λμ€μ λ΄λΆμμλ§ μ¬μ©ν λͺ©μ μ΄λΌλ©΄ λ΄λΆ ν΄λμ€λ₯Ό privateμΌλ‘ μ μΈνλ€.
β
β
β
*μ μ λ΄λΆ ν΄λμ€
μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€λ μΈλΆ ν΄λμ€κ° λ¨Όμ μμ±λμ΄μΌ μμ±ν μ μκΈ° λλ¬Έμ μ μ λ³μλ μ μ λ©μλλ₯Ό μ¬μ©ν μ μλ€κ³ νλ€. κ·Έλ°λ° λ΄λΆ ν΄λμ€κ° μΈλΆ ν΄λμ€ μμ±κ³Ό 무κ΄νκ² μ¬μ©ν μ μμ΄μΌ νκ³ μ μ λ³μλ μ¬μ©ν μ μμ΄μΌ νλ€λ©΄ μ μ λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ λλ€. μ μ λ΄λΆ ν΄λμ€λ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ²λΌ μΈλΆ ν΄λμ€μ λ©€λ² λ³μμ κ°μ μμΉμ μ μνλ©° static μμ½μ΄λ₯Ό ν¨κ» μ¬μ©νλ€.
package innerclass;
class OutClass {
private int num = 10;
private static int sNum = 20;
static class inStaticClass { // μ μ λ΄λΆ ν΄λμ€
int inNum = 100; // μ μ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ
static int sInNum = 200; // μ μ λ΄λΆ ν΄λμ€μ μ μ λ³μ
void inTest() { // μ μ λ΄λΆ ν΄λμ€μ μΌλ° λ©μλ
// num += 10; ← μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μλ μ¬μ©ν μ μμ
System.out.println("InStaticClass inNum = " + inNum + "(λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ μ¬μ©)");
System.out.println("InStaticClass sInNum = " + sInNum + "(λ΄λΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
System.out.println("OutClass sNum = " + sNum + "(μΈλΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
}
static void sTest() { // μ μ λ΄λΆ ν΄λμ€μ μ μ λ©μλ
// num += 10;
// inNum += 10; ← μΈλΆ ν΄λμ€μ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μλ μ¬μ©ν μ μμ
System.out.println("OutClass sNum = " + sNum + "(μΈλΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
System.out.println("InStaticClass sInNum = " + sInNum + "(λ΄λΆ ν΄λμ€μ μ μ λ³μ μ¬μ©)");
}
}
}
public class InnerTest {
public static void main(String[] args) {
OutClass.inStaticClass sInClass = new OutClass.inStaticClass(); // μΈλΆ ν΄λμ€λ₯Ό μμ±νμ§ μκ³ λ°λ‘ μ μ λ΄λΆ ν΄λμ€ μμ± κ°λ₯
System.out.println("μ μ λ΄λΆ ν΄λμ€ μΌλ° λ©μλ νΈμΆ");
sInClass.inTest();
System.out.println();
System.out.println("μ μ λ΄λΆ ν΄λμ€μ μ μ λ©μλ νΈμΆ");
OutClass.inStaticClass.sTest();
}
}
<μ€ν κ²°κ³Ό>
μ μ λ΄λΆ ν΄λμ€ λ©μλ |
λ³μ μ ν |
μ¬μ© κ°λ₯ μ¬λΆ |
μΌλ° λ©μλ void inTest( ) |
μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ(num) |
X |
μΈλΆ ν΄λμ€μ μ μ λ³μ(sNum) |
O |
|
μ μ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ (inNum) |
O |
|
μ μ λ΄λΆ ν΄λμ€μ μ μ λ³μ(sInNum) |
O |
|
μ μ λ©μλ static void sTest( ) |
μΈλΆ ν΄λμ€ μΈμ€ν΄μ€ λ³μ(num) |
X |
μΈλΆ ν΄λμ€μ μ μ λ³μ(sNum) |
O |
|
μ μ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ (inNum) |
X |
|
μ μ λ΄λΆ ν΄λμ€μ μ μ λ³μ(sInNum) |
O |
-μμ μ νμμ μμμλ―μ΄ μ μ λ΄λΆ ν΄λμ€μμ μ¬μ©νλ λ©μλκ° μ μ λ©μλμΈ κ²½μ°μλ μΈλΆ ν΄λμ€μ μ μ λ΄λΆ ν΄λμ€μ μ μΈλ λ³μ μ€ μ μ λ³μλ§ μ¬μ©ν μ μλ€.
β
β
β
*λ€λ₯Έ ν΄λμ€μμ μ μ λ΄λΆ ν΄λμ€ μ¬μ©νκΈ°
μ μ λ΄λΆ ν΄λμ€λ μΈλΆ ν΄λμ€λ₯Ό μμ±νμ§ μκ³ λ λ΄λΆ ν΄λμ€ μλ£νμΌλ‘ λ°λ‘ μ μΈνμ¬ μμ±ν μ μλ€.
λ μ μ λ΄λΆ ν΄λμ€μ μ μΈν λ©μλ(μ μ λ©μλ ν¬ν¨)λ λ³μλ privateμ΄ μλ κ²½μ°μ λ€λ₯Έ ν΄λμ€μμλ λ°λ‘ μ¬μ©ν μ μλ€.
λ°λΌμ λ΄λΆ ν΄λμ€λ₯Ό λ§λ€κ³ μΈλΆ ν΄λμ€μ 무κ΄νκ² λ€λ₯Έ ν΄λμ€μμλ μ¬μ©νλ €λ©΄ μ μ λ΄λΆ ν΄λμ€λ‘ μμ±νλ©΄ λλ€. νμ§λ§ μ μ λ΄λΆ ν΄λμ€λ₯Ό privateμΌλ‘ μ μΈνλ€λ©΄ μ΄κ² μμ λ€λ₯Έ ν΄λμ€μμ μ¬μ©ν μ μλ€.
β
β
β
*μ§μ λ΄λΆ ν΄λμ€
μ§μ λ΄λΆ ν΄λμ€λ μ§μ λ³μμ²λΌ λ©μλ λ΄λΆμ ν΄λμ€λ₯Ό μ μνμ¬ μ¬μ©νλ κ²μ λ§νλ€. λ°λΌμ μ΄ ν΄λμ€λ λ©μλ μμμλ§ μ¬μ©ν μ μλ€.
β
β
LocalInnerTest.java
package innerclass;
class Outer {
int outNum = 100;
static int sNum = 200;
Runnable getRunnable(int i) {
int num = 100; // μ§μ λ³μ
class MyRunnable implements Runnable { // μ§μ λ΄λΆ ν΄λμ€
int localNum = 10; // μ§μ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ λ³μ
@Override
public void run() {
// num = 200;
// i = 100;
System.out.println("i = " + i);
System.out.println("num = " + num);
System.out.println("localNum = " + localNum);
System.out.println("outNum = " + outNum + "(μΈλΆ ν΄λμ€ μΈμ€ν΄μ€ λ³μ)");
System.out.println("Outer.sNum = " + Outer.sNum + "(μΈλΆ ν΄λμ€ μ μ λ³μ)");
}
}
return new MyRunnable();
}
}
public class LocalInnerTest {
public static void main(String[] args) {
Outer out = new Outer();
Runnable runner = out.getRunnable(10); // λ©μλ νΈμΆ
runner.run();
}
}
<μ€ν κ²°κ³Ό>
-μ§μ λ΄λΆ ν΄λμ€ MyRunnableμ μ μΈνμ§λ§, μ΄ ν΄λμ€ μ΄λ¦μ μ¬μ©νλ κ³³μ 맨 λ§μ§λ§μ ν΄λμ€λ₯Ό μμ±νμ¬ λ°νν λ λΏμ΄λ€. κ·Έλμ λ€μ μμ μ²λΌ μ΄λ¦μ μλ΅ν Runnable μΈν°νμ΄μ€λ₯Ό λ°λ‘ μμ±ν΄μ λ°ννλ μ΅λͺ ν΄λμ€ νμμΌλ‘ μλ‘κ² μ μΈνλ€.
β
β
β
*μ§μ λ΄λΆ ν΄λμ€μμ μ§μ λ³μμ μ ν¨μ±
μ§μ λ³μλ λ©μλκ° νΈμΆλ λ μ€ν λ©λͺ¨λ¦¬μ μμ±λκ³ λ©μλμ μνμ΄ λλλ©΄ λ©λͺ¨λ¦¬μμ μ¬λΌμ§λ€.
run( ) λ©μλλ getRunnable( ) λ©μλμ μ§μ λ³μ iμ numμ μ¬μ©νλ€. κ·Έλ°λ° μ§μ λ΄λΆ ν΄λμ€λ₯Ό κ°μ§κ³ μλ getRunnable( ) λ©μλ νΈμΆμ΄ λλ νμλ run( ) λ©μλκ° μ μμ μΌλ‘ νΈμΆλλ€. μ΄λ getRunnable( ) λ©μλ νΈμΆμ΄ λλκ³ μ€ν λ©λͺ¨λ¦¬μμ μ§μμ§ λ³μλ₯Ό μ΄νμ λ μ°Έμ‘°ν μ μλ€λ κ²μ΄λ€. μ 리νλ©΄, μ§μ λ΄λΆ ν΄λμ€μμ μ¬μ©νλ λ©μλμ μ§μ λ³μλ λͺ¨λ μμλ‘ λ°λλ€.
β
β
β
*μ΅λͺ λ΄λΆ ν΄λμ€
ν΄λμ€ μ΄λ¦μ μ¬μ©νμ§ μλ ν΄λμ€. λμ }; μ μ΄λ€.
package innerclass;
class Outer2 {
Runnable getRunnable(int i) {
int num = 100;
return new Runnable() { // μ΅λͺ
λ΄λΆ ν΄λμ€. Runnable μΈν°νμ΄μ€ μμ±
@Override
public void run() {
// num = 200;
// i = 10;
System.out.println(i);
System.out.println(num);
}
};
}
Runnable runner = new Runnable() { // μ΅λͺ
λ΄λΆ ν΄λμ€λ₯Ό λ³μμ λμ
@Override
public void run() {
System.out.println("Runnableμ΄ κ΅¬νλ μ΅λͺ
ν΄λμ€ λ³μ");
}
};
}
public class AnonymousInnerTest {
public static void main(String[] args) {
Outer2 out = new Outer2();
Runnable runnerble = out.getRunnable(10);
runnerble.run();
out.runner.run();
}
}
-μ΅λͺ λ΄λΆ ν΄λμ€λ λ¨ νλμ μΈν°νμ΄μ€ λλ λ¨ νλμ μΆμ ν΄λμ€λ₯Ό λ°λ‘ μμ±ν μ μλ€. κ·Έλ°λ° Runnable μΈν°νμ΄μ€λ₯Ό μμ±ν μ μμΌλ €λ©΄ μΈν°νμ΄μ€ λͺΈμ²΄κ° νμνλ€.
-μ 리νλ©΄ μ΅λͺ λ΄λΆ ν΄λμ€λ λ³μμ μ§μ λμ νλ κ²½μ°λ μκ³ λ©μλ λ΄λΆμμ μΈν°νμ΄μ€λ μΆμ ν΄λμ€λ‘ ꡬννλ κ²½μ°λ μλ€. μ΄λ μ¬μ©νλ μ§μ λ³μλ μμνλλ―λ‘ λ©μλ νΈμΆμ΄ λλ νμλ μ¬μ©ν μ μλ€.
β
β
β
*λ΄λΆ ν΄λμ€ λ΄μ©
μ’ λ₯ |
ꡬν μμΉ |
μ¬μ©ν μ μλ μΈλΆ ν΄λμ€ λ³μ |
μμ± λ°©λ² |
μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€ |
μΈλΆ ν΄λμ€ λ©€λ² λ³μμ λμΌ |
μΈλΆ μΈμ€ν΄μ€ λ³μ μΈλΆ μ μ λ³μ |
μΈλΆ ν΄λμ€λ₯Ό λ¨Όμ λ§λ ν λ΄λΆ ν΄λμ€ μμ± |
μ μ λ΄λΆ ν΄λμ€ |
μΈλΆ ν΄λμ€ λ©€λ² λ³μμ λμΌ |
μΈλΆ μ μ λ³μ |
μΈλΆ ν΄λμ€μ 무κ΄νκ² μμ± |
μ§μ λ΄λΆ ν΄λμ€ |
λ©μλ λ΄λΆμ ꡬν |
μΈλΆ μΈμ€ν΄μ€ λ³μ μΈλΆ μ μ λ³μ |
λ©μλλ₯Ό νΈμΆν λ μμ± |
μ΅λͺ λ΄λΆ ν΄λμ€ |
λ©μλ λ΄λΆμ ꡬν λ³μμ λμ νμ¬ μ§μ ꡬν |
μΈλΆ μΈμ€ν΄μ€ λ³μ μΈλΆ μ μ λ³μ |
λ©μλλ₯Ό νΈμΆν λ μμ±λκ±°λ, μΈν°νμ΄μ€ νμ λ³μμ λμ ν λ new μμ½μ΄λ₯Ό μ¬μ©νμ¬ μμ± |
β
'Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java-κΈ°μ΄] μ€νΈλ¦Ό (0) | 2021.02.22 |
---|---|
[Java-κΈ°μ΄] λλ€μ (0) | 2021.02.22 |
[Java-κΈ°μ΄] Map μΈν°νμ΄μ€ (0) | 2021.02.22 |
[Java-κΈ°μ΄] Comparable μΈν°νμ΄μ€μ Comparator μΈν°νμ΄μ€ (0) | 2021.02.22 |
[Java-κΈ°μ΄] set μΈν°νμ΄μ€ (0) | 2021.02.22 |
λκΈ