...

λ΄λΆ ν΄λμ€ (Inner Class)
λ΄λΆ ν΄λμ€(inner class)λ νλμ ν΄λμ€ λ΄λΆμ μ μΈλ λ λ€λ₯Έ ν΄λμ€λ₯Ό μλ―Ένλ€.
λ³΄ν΅ μ¬μ©μ ν΄λμ€ μλ£νμ΄ νμνλ©΄, λ©μΈ ν΄λμ€ μΈλΆμ μ μΈνκ±°λ, λ°λ‘ λ 립μ μΈ ν΄λμ€ νμΌμ λ§λ€μ΄ λΆλ¬μ μ¬μ©ν΄ μλ€. λ΄λΆ ν΄λμ€λ λμ ν΄λμ€ λ΄μ μ μΈλμ΄ μ¬μ©λλ©°, λ΄λΆμ μ μλλ€λ μ μ μ μΈνκ³ λ μΌλ°μ μΈ ν΄λμ€μ λ€λ₯΄μ§ μλ€. μ°λ¦¬κ° μ΄λ ν΄λμ€μ λ³μλ μμκ° νμνλ€λ©΄ ν΄λμ€ λ©€λ²λ‘μ ν΄λμ€ λ΄μμ μ μΈνμ¬ μ¬μ©ν΄ μλ―μ΄, μ μΈ μ£Όμ²΄λ₯Ό λ³μμμ ν΄λμ€λ‘ λ°κΎΌλ€λ©΄ κ·Έκ²μ΄ λ΄λΆ ν΄λμ€μΈ κ²μ΄λ€.
μ΄μ²λΌ λ΄λΆ ν΄λμ€λ λ³΄ν΅ λ ν΄λμ€κ° μλ‘ κΈ΄λ°ν κ΄κ³κ° μκ±°λ, νλμ ν΄λμ€λλ λ©μλμμλ§ μ¬μ©λλ ν΄λμ€μΌ λ μ΄μ©λλ κΈ°λ²μ΄λΌκ³ 보면 λλ€.
λ΄λΆ(inner) ν΄λμ€λ μ€μ²©(nested) ν΄λμ€λ‘ λΆλ₯λκΈ°λ νλ€.

// Creature ν΄λμ€λ λ΄λΆ ν΄λμ€λ€μ μΈλΆ ν΄λμ€
class Creature {
int life;
// Animal ν΄λμ€λ Creature ν΄λμ€μ λ΄λΆ ν΄λμ€
class Animal {
}
// Insect ν΄λμ€λ Creature ν΄λμ€μ λ΄λΆ ν΄λμ€
class Insect {
}
public void method() {
Animal animal = new Animal();
Insect insect = new Insect();
// ...
}
}
λ΄λΆ ν΄λμ€μ μ₯μ
1. ν΄λμ€λ₯Ό λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήν
ν΄λμ€κ° μ¬λ¬ ν΄λμ€μ κ΄κ³λ₯Ό λ§Ίμ§ μκ³ νλμ νΉμ ν΄λμ€μλ§ κ΄κ³λ₯Ό λ§Ίλλ€λ©΄, μΈλΆμ ν΄λμ€λ₯Ό μλ‘ μμ±νλ κ²μ΄ μλ λ΄λΆ ν΄λμ€λ‘ μμ±ν μ μλ€.
μ΄λ° κ²½μ° λ΄λΆ ν΄λμ€μ μΈλΆ ν΄λμ€λ₯Ό ν¨κ» κ΄λ¦¬νλ κ²μ΄ κ°λ₯ν΄ μ μ§λ³΄μ λ©΄μμλ μ½λ μ΄ν΄μ± λ©΄μμ νΈλ¦¬ν΄μ§λ€.
λν λ΄λΆ ν΄λμ€λ‘ μΈν΄ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νμ§ μμλ λλ―λ‘ ν¨ν€μ§λ₯Ό κ°μνν μ μλ€.
μ½λλ‘ μμλ₯Ό λ€μ΄λ³΄μ.
νμλλ‘λΌλ©΄ μλμ²λΌ μΈλΆ νΉμ λ€λ₯Έ νμΌλ‘ ν΄λμ€λ₯Ό μ μΈν΄λκ³ , μΈμ€ν΄μ€ν νμ¬ μ¬μ©ν΄μμ κ²μ΄λ€.
class Creature {
int life;
public void method() {
Animal animal = new Animal(); // Animal κ°μ²΄λ μ€λ‘μ§ Creature ν΄λμ€μ λ©μλ λ΄μμλ§ μ¬μ©λλ€κ³ κ°μ
// ...
}
}
// μΈλΆμ μ μΈλ ν΄λμ€
class Animal {
}
κ·Έλ°λ° λ§μΌ Animal ν΄λμ€ μλ£νμ΄ μ€λ‘μ§ Creature ν΄λμ€μ λ©μλ λ΄μμλ§ μ μΈλμ΄ μ¬μ©λλ€λ©΄, Animal ν΄λμ€λ₯Ό Creature ν΄λμ€ λ΄λΆλ‘ λ£μ΄μ€μΌλ‘μ¨ λ³΄λ€ μ½λ μμμ μ΄ν΄μ λμμ΄ λλ€. (νλμ μμ μκ΄ κ΄κ³ νμ μ λμλ¨)
class Creature {
int life;
// ν΄λμ€ λ©€λ² κ°μ΄ Creature ν΄λμ€ μμλ€ λ£μ΄ μ μΈνλ€.
class Animal {
}
public void method() {
Animal animal = new Animal(); // Animal κ°μ²΄λ μ€λ‘μ§ Creature ν΄λμ€μ λ©μλ λ΄μμλ§ μ¬μ©λλ€κ³ κ°μ
// ...
}
}
2. λμ± νμ΄νΈν μΊ‘μνμ μ μ©
λ΄λΆ ν΄λμ€μ private μ μ΄μλ₯Ό μ μ©ν΄μ€μΌλ‘μ¨, μΊ‘μνλ₯Ό ν΅ν΄ ν΄λμ€λ₯Ό λ΄λΆλ‘ μ¨κΈΈ μ μλ€.
μ¦, μΊ‘μνλ₯Ό ν΅ν΄ μΈλΆμμμ μ κ·Όμ μ°¨λ¨νλ©΄μλ, λ΄λΆ ν΄λμ€μμ μΈλΆ ν΄λμ€μ λ©€λ²λ€μ μ μ½ μμ΄ μ½κ² μ κ·Όν μ μμ΄ κ΅¬μ‘°μ μΈ νλ‘κ·Έλλ°μ΄ κ°λ₯ν΄ μ§λ€. κ·Έλ¦¬κ³ ν΄λμ€ κ΅¬μ‘°λ₯Ό μ¨κΉμΌλ‘μ¨ μ½λμ 볡μ‘μ±λ μ€μΌ μ μλ€.
class Creature {
private int life = 50;
// private class λ‘, μ€λ‘μ§ Creature μΈλΆ ν΄λμ€μμλ§ μ κ·Ό κ°λ₯ν λ΄λΆ ν΄λμ€λ‘ μ€μ
private class Animal {
private String name = "νΈλμ΄";
int getOuter() {
return life; // μΈλΆ ν΄λμ€μ private λ©€λ²λ₯Ό μ μ½ μμ΄ μ κ·Ό κ°λ₯
}
}
public void method() {
Animal animal = new Animal();
// Getter μμ΄ λ΄λΆ ν΄λμ€μ private λ©€λ²μ μ κ·Όμ΄ κ°λ₯
System.out.println(animal.name); // νΈλμ΄
// λ΄λΆ ν΄λμ€μμ μΈλΆ ν΄λμ€μ΄ private λ©€λ²λ₯Ό μΆλ ₯
System.out.println(animal.getOuter()); // 50
}
}
3. κ°λ μ±μ΄ μ’κ³ μ μ§ κ΄λ¦¬κ° μ¬μ΄ μ½λ
κ²°κ΅μ λ΄λΆ ν΄λμ€λ₯Ό μμ±νλ κ²½μ° ν΄λμ€λ₯Ό λ°λ‘ μΈλΆμ μμ±νλ κ²½μ°λ³΄λ€, 물리μ μΌλ‘ λ Όλ¦¬μ μΌλ‘ μΈλΆ ν΄λμ€μ λ κ°κΉκ² μμΉνκ² λλ€. λ°λΌμ μκ°μ μΌλ‘ μ½κΈ°κ° νΈν΄μ§ λΏ μλλΌ μ μ§λ³΄μμ μμ΄ μ΄μ μ κ°μ§κ² λλ€.
ν ν΄λμ€λ₯Ό λ€λ₯Έ ν΄λμ€μ λ΄λΆ ν΄λμ€λ‘ μ μΈνλ©΄ λ ν΄λμ€ λ©€λ²λ€ κ°μ μλ‘ μμ λ‘μ΄ μ κ·Όν μ μκ³ , κ·Έλ¦¬κ³ μΈλΆμλ λΆνμν ν΄λμ€λ₯Ό κ°μΆ°μ ν΄λμ€κ°μ μ°κ΄ κ΄κ³ λ°μ§λ κ²κ³Ό κ°μ μ½λμ 볡μ‘μ±μ μ€μΌ μ μλ€λ μ₯μ μ΄ μκΈ° λλ¬Έμ΄λ€.
κ°λ¨νκ² λ§νμλ©΄ μ΄μ°¨νΌ A ν΄λμ€μμμλ§ μ¬μ©νκΈ° μν ν΄λμ€μ΄λ κ΄ν μ°κ΄κ΄κ³ μκ°μμ΄ λ΄λΆμ μ μΈν΄ μ§κ΄μ μΌλ‘ μ¬μ©νμλ μ·¨μ§μΈ κ²μ΄λ€.
λ΄λΆ ν΄λμ€ μ’ λ₯
ν΄λμ€ λ©€λ² λ³μλ μ μΈλλ μμΉλ μ κ·Όμ μ΄μμ λ°λΌ μν κ³Ό μ΄λ¦μ΄ λ¬λΌμ§λ―μ΄, λ΄λΆ ν΄λμ€λ μ μΈλ μμΉ, static ν€μλμ μ 무 λ±μ λ°λΌ 4κ°μ§λ‘ λ΄λΆ ν΄λμ€κ° ꡬλΆλλ€.
λ΄λΆ ν΄λμ€μλ μλ νμκ°μ΄ μ΄ 4κ°μ§κ° μλλ°, μ΄μ€μμ μ€μ μ μΌλ‘ λ΄μΌν μμλ static ν΄λμ€μ μ΅λͺ ν΄λμ€ μ΄λ€.
μΆνμ λ°°μ°κ² μ§λ§ static ν΄λμ€λ λμμΈ ν¨ν΄μμ μ±κΈν€ ν¨ν΄κ³Ό Holder ν¨ν΄μμ μ°μ΄λ κΈ°λ²μ€ νλμ΄κ³ , μ΅λͺ ν΄λμ€λ μλ°8μ λλ€ ννμμ κΈ°λ³Έ 골μμ΄κΈ° λλ¬Έμ΄λ€.
λ΄λΆ ν΄λμ€ | νΉμ§ |
μΈμ€ν΄μ€ ν΄λμ€ (instance class) | μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈ μμΉμ μ μΈνλ©°, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μ²λΌ λ€λ€μ§λ€. μ£Όλ‘ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈλλ€. |
μ€νν± ν΄λμ€ (static class) | μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈ μμΉμ μ μΈνλ©°, μΈλΆ ν΄λμ€μ static λ©€λ²μ²λΌ λ€λ€μ§λ€. λ€λ§ μ£Όμν μ μ staticμ΄λΌκ³ ν΄μ new μμ±μ μ΄κΈ°νλ₯Ό λͺ»νλ 건 μλλ€. μ¦, μΌλ°μ μΈ static νλ λ³μλ static λ©μλμ λ¬λ¦¬, staic λ΄λΆ ν΄λμ€λ κ°μ staticμ΄μ§λ§ λ©λͺ¨λ¦¬ ꡬ쑰λ κΈ°λ₯μ΄ μ ν λ€λ₯΄λ€. |
μ§μ ν΄λμ€ (local class) | μΈλΆ ν΄λμ€μ λ©μλλ μ΄κΈ°νλΈλ μμ μ μΈνλ©°, μ μΈλ λ©μλ λΈλ‘ μμ λ΄λΆμμλ§ μ¬μ©λ μ μλ€. |
μ΅λͺ ν΄λμ€ (anonymous class) | ν΄λμ€μ μ μΈκ³Ό κ°μ²΄μ μμ±μ λμμ νλ μ΄λ¦μλ ν΄λμ€μ΄λ€. μ£Όλ‘ ν΄λμ€λ₯Ό μΌνμ©μΌλ‘ μ¬μ©ν λ μμ£Ό μ΄μ©λλ€. |
class Outer{
class InstanceInner { ... } // μΈμ€ν΄μ€ ν΄λμ€
static class StaticInner { ... } // μ€νν± ν΄λμ€
void method1(){
class LocalInner { ... } // μ§μ ν΄λμ€
}
}

μΈμ€ν΄μ€ ν΄λμ€
- ν΄λμ€μ λ©€λ² λ³μ μ μΈλΆμ μμΉνκ³ static ν€μλκ° μλ λ΄λΆ ν΄λμ€
- μΈλΆ ν΄λμ€μ λ©€λ²λ‘ μ·¨κΈλκΈ° λλ¬Έμ μΈλΆ ν΄λμ€μ κ°μ²΄ λ¨Όμ μμ±ν ν λ΄λΆ ν΄λμ€μ κ°μ²΄λ₯Ό μμ±μ΄ κ°λ₯νλ€
- μΈμ€ν΄μ€ ν΄λμ€ λ΄λΆμλ instance λ©€λ²λ§ μ μΈν μ μλ€. (static λ©€λ²λ μ μΈ λΆκ°)
- μ£Όλ‘ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈλλ€.
class PocketBall {
// μΈμ€ν΄μ€ λ³μ
int size = 100;
int price = 5000;
// μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€
class PocketMonster {
String name = "μ΄μν΄μ¨";
int level = 10;
// static int cost = 100; - μλ¬! μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μλ static λ³μλ₯Ό μ μΈν μ μλ€.
static final int cost = 100; // final staticμ μμμ΄λ―λ‘ νμ©
public void getPoketMember() {
// λ³λ€λ₯Έ μ‘°μΉμμ΄ μΈλΆ ν΄λμ€ λ§΄λ² μ κ·Ό κ°λ₯
System.out.println(size);
System.out.println(price);
// λ΄λΆ ν΄λμ€ λ©€λ²
System.out.println(name);
System.out.println(level);
System.out.println(cost);
}
}
}
public class Main {
public static void main(String[] args) {
PocketBall ball = new PocketBall(); // λ¨Όμ μΈλΆ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ν ν΄μ£Όκ³
PocketBall.PocketMonster poketmon = ball.new PocketMonster(); // μΈλΆν΄λμ€.λ΄λΆν΄λμ€ νμμΌλ‘ λ΄λΆν΄λμ€λ₯Ό μ΄κΈ°ν νμ¬ μ¬μ©ν μλ μλ€
poketmon.getPoketMember();
// μμ λ¨κ³λ₯Ό νμ€λ‘ νν
PocketBall.PocketMonster poketmon2 = new PocketBall().new PocketMonster();
}
}
μΈλΆ ν΄λμ€λ₯Ό μΈμ€ν΄μ€ννλ©΄ μΈλΆ ν΄λμ€μ μ½λκ° λ©λͺ¨λ¦¬μ μ¬λΌμ€κ² λκ³ μ΄ λ λ΄λΆ ν΄λμ€μ μ½λλ λ©λͺ¨λ¦¬μ μ¬λΌμ€κ² λλ€. μ΄λ κ² μ½λλ₯Ό λ©λͺ¨λ¦¬μ μ¬λ¦° μ΄νμμΌ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν μκ° μλ€.
λ€λ§ λ΄λΆ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μμ μ§μ μ¬μ©νλ κ²λ³΄λ€ ν΄λΉ(μΈλΆ) ν΄λμ€μμλ§ μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ―λ‘, μμ λ©μΈ μ½λμ κ°μ΄ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ€λ₯Έ ν΄λμ€μμ λ§λλ κ²½μ°λ λλ¬Όλ€.
μ΄λ¦μ΄ κ°μ μΈλΆ ν΄λμ€ λ©μλ νΈμΆ
λ§μΌ λ€μκ³Ό κ°μ΄ λ΄λΆ ν΄λμ€μμ μΈλΆ ν΄λμ€μ λμΌν λ©μλλͺ μ μ¬μ©ν λ μΈλΆ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ?
// μΈλΆ ν΄λμ€
public class Main {
public print(String txt) {
System.out.println(txt);
}
// λ΄λΆ ν΄λμ€
class Sub {
public print() {
}
}
}
ν΄λμ€κ° μμκ΄κ³μ μμλλ super ν€μλλ₯Ό ν΅ν΄ λΆλͺ¨ λ©μλλ₯Ό νΈμΆν μ μμλ€. νμ§λ§ μΈλΆ-λ΄λΆ ν΄λμ€ κ΄κ³λ μμ κ΄κ³κ° μλκΈ° λλ¬Έμ λ€λ₯Έ λ°©λ²μΌλ‘ μΈλΆ ν΄λμ€μ λ©€λ²λ₯Ό νΈμΆν΄μΌ νλ€.
μ΄λ μ κ·νλ thisλ₯Ό μ¬μ©νλ©΄ λ°κΉ₯ μΈμ€ν΄μ€μ λ©μλλ₯Ό νΈμΆνκ±°λ λ°κΉ₯ μΈμ€ν΄μ€μ μ°Έμ‘°λ₯Ό κ°μ Έμ¬ μ μλ€.
μ κ·νλ thisλ ν΄λμ€λͺ
.this ννλ‘ λ°κΉ₯ ν΄λμ€μ μ΄λ¦μ λͺ
μνλ μ©λ²μ λ§νλ€.
public class Main {
public void print(String txt) {
System.out.println(txt);
}
class Sub {
public void print() {
Main.this.print("μΈλΆ ν΄λμ€ λ©μλ νΈμΆ");
System.out.println("λ΄λΆ ν΄λμ€ λ©μλ νΈμΆ");
}
}
}
public static void main(String[] args) {
Main.Sub s = new Main().new Sub();
s.print();
/*
μΈλΆ ν΄λμ€ λ©μλ νΈμΆ
λ΄λΆ ν΄λμ€ λ©μλ νΈμΆ
*/
}
μ΄ λ€μμ λ°°μΈ static λ΄λΆ ν΄λμ€μμλ μ κ·νλ this λ¬Έλ²μ μ¬μ©ν μ μλ€.
μΈμ€ν΄μ€ ν΄λμ€ μ»΄νμΌ
- λ΄λΆ ν΄λμ€λ ν΄λμ€ μμ ν΄λμ€ ννμ΄κΈ° λλ¬Έμ μ»΄νμΌ ννκ° λ¨λ€λ₯΄λ€.
- μ»΄νμΌμ μμ±λλ ν΄λμ€ νμΌλͺ μ "μΈλΆν΄λμ€$λ΄λΆν΄λμ€.class" ννμ΄λ€.

μ€νν± ν΄λμ€
- static ν€μλκ° λΆμ λ΄λΆ ν΄λμ€
- λ¨, μΌλ°μ μΈ static νλ λ³μλ static λ©μλμ λκ°μ΄ μκ°νλ©΄ μλλ€.
- static ν΄λμ€ λ΄λΆμλ instance λ©€λ²μ static λ©€λ² λͺ¨λ μ μΈ ν μ μλ€.
- κ·Έλ¬λ μΌλ°μ μΈ static λ©μλμ λμΌνκ² μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μλ μ κ·Όμ΄ λΆκ°νκ³ , μ μ (static) λ©€λ²μλ§ μ κ·Όν μ μλ€.
class PocketBall {
int size = 100;
static int price = 5000;
// static λ΄λΆ ν΄λμ€
static class PocketMonster {
static String name = "μ΄μν΄μ¨";
int level = 10;
public static void getPoketMember() {
// μΈλΆ ν΄λμ€ μΈμ€ν΄μ€ λ§΄λ² μ κ·Ό λΆκ°λ₯
// System.out.println(size);
// μΈλΆ ν΄λμ€ μ€νν± λ©€λ² μ κ·Ό κ°λ₯
System.out.println(price);
// λ΄λΆ ν΄λμ€ λ©€λ²λ μ€νν± λ§΄λ²λ§ μ κ·Ό κ°λ₯
System.out.println(name);
// System.out.println(level);
}
}
}
public class Main {
public static void main(String[] args) {
// μ€νν± λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ μΈλΆ ν΄λμ€λ₯Ό λ¨Όμ μμ±νμ§ μμλ λλ€.
PocketBall.PocketMonster poketmon = new PocketBall.PocketMonster();
System.out.println(poketmon.level);
System.out.println(PocketBall.PocketMonster.name);
// ν΄λμ€.μ μ λ΄λΆν΄λμ€.μ μ λ©μλ()
PocketBall.PocketMonster.getPoketMember();
}
}
static ν΄λμ€μ λν μ€ν΄
κ°μ₯ λ§μ μ¬λλ€μ΄ μ€μνλ μ€ν΄κ° static ν΄λμ€κ° κ·Έ μΈμ static νλ λ³μλ static λ©μλμ κ°μ΄, 'static μ΄λκΉ λ©λͺ¨λ¦¬μ νλλ§ μ¬λΌκ°λ μΈμ€ν΄μ€'λ‘ μ°©κ° νλ€λ μ μ΄λ€.
μ°μ κ²°λ‘ λΆν° λ§νλ©΄ static ν΄λμ€λ, ν€μλκ° staticμ΄ λ€μ΄κ°μ λΏμ΄μ§, μ°λ¦¬κ° μλ static λ©€λ²μλ μ ν λ€λ₯Έ λ μμ΄λ€.
λ€μ μ½λλ₯Ό 보면 static λ³μμ λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€ κ·Έλ¦¬κ³ λ΄λΆ static ν΄λμ€κ° μλ€.
μ΄λ€μ κ°κ° λ©μΈ λ©μλμμ λ³μλ‘ λ°μ κ°μμ§ λ€λ₯Έμ§ λΉκ΅ν΄λ³΄λ©΄, static λ³μλ μ°λ¦¬μ μμλλ‘ λ©λͺ¨λ¦¬μμ νλ²λ§ μμ± λλκΉ λ°ν λλ λ°μ΄ν°λ κ°λ€.
νμ§λ§ λ΄λΆ static ν΄λμ€λ μΌλ° ν΄λμ€μ²λΌ μ΄κΈ°νλ₯Ό ν λλ§λ€ λ€λ₯Έ κ°μ²΄κ° λ§λ€μ΄μ§μ λ³Ό μ μλ€. (static μΈλ° λ§μ΄λ€)
public class Main {
// μ€νν± νλ λ³μ
static Integer num = new Integer(0);
// λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€
class InnerClass{
}
// λ΄λΆ μ€νν± ν΄λμ€
static class InnerStaticClass{
}
public static void main(String[] args) {
// μ€νν± νλ λ³μλ μ μΌν΄μ μλ‘ κ°λ€
Integer num1 = Main.num;
Integer num2 = Main.num;
System.out.println(num1 == num2); // true
// μμ±λ λ΄λΆ ν΄λμ€ μΈμ€ν΄μ€λ μλ‘ λ€λ₯΄λ€
Main.InnerClass inner1 = new Main().new InnerClass();
Main.InnerClass inner2 = new Main().new InnerClass();
System.out.println(inner1 == inner2); // false
// μμ±λ λ΄λΆ μ€νν± ν΄λμ€ μΈμ€ν΄μ€λ μλ‘ λ€λ₯΄λ€
Main.InnerStaticClass static1 = new InnerStaticClass();
Main.InnerStaticClass static2 = new InnerStaticClass();
System.out.println(static1 == static2); // false
}
}
볡μ‘νκ² μκ°ν νμμμ΄ static ν΄λμ€λ static μ΄λΌκ³ ν΄μ λ©λͺ¨λ¦¬μ νλ²λ§ λ‘λλλ κ°μ²΄ κ°λ μ΄ μλ κ²μ΄λ€.
μ¦, λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€ μ²λΌ μΈλΆ μΈμ€ν΄μ€λ₯Ό λ¨Όμ μ μΈνκ³ μ΄κΈ°νν΄μΌ νλ μ μ μμ νμ μμ΄, λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°λ‘ μμ±ν μ μλ€λ μ°¨μ΄μ μ΄ μ‘΄μ¬ ν λΏμ΄λ€.
λ΄λΆ ν΄λμ€λ static ν΄λμ€λ‘ μ μΈνμ
λ§μΌ λ΄λΆ ν΄λμ€λ₯Ό μ΄μ©νλλ°, λ΄λΆ ν΄λμ€μμ λ°κΉ₯ μΈλΆμ μΈμ€ν΄μ€λ₯Ό μ¬μ©ν μΌμ΄ μλ€λ©΄ static ν΄λμ€λ‘ μ μΈν΄μ£Όμ΄μΌ νλ€. (μ€μ λ‘ μΈν 리μ μ΄ κ°μ IDEμμλ κ²½κ³ λ₯Ό λμ΄λ€)

μλνλ©΄ staticμ΄ μλ λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€λ μΈλΆμ μ°κ²°μ΄ λμ΄ μμ΄ 'μΈλΆ μ°Έμ‘°'λ₯Ό κ°κ²λμ΄ λ©λͺ¨λ¦¬λ₯Ό λ λ¨Ήκ³ , λ리며, λν GC λμμμ μ μΈλλ μ¬λ¬ λ¬Έμ μ μ μΌμΌν€κΈ° λλ¬Έμ΄λ€.
μ΄μ λν μμΈν κ³ μ°°μ λ€μ ν¬μ€ν μ μ°Έκ³ νκΈΈ λ°λλ€.
[JAVA] β λ΄λΆ ν΄λμ€λ static μΌλ‘ μ μΈ μνλ©΄ ν°μΌ λλ€
Inner ν΄λμ€μ λ¬Έμ μ μΈν 리μ μ΄μ κ°μ IDEμμ λ΄λΆ ν΄λμ€λ₯Ό μ μΈνμ¬ μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΄ κ²½κ³ λ©μΈμ§κ° λ° κ²μ΄λ€. (λ΄λΆ ν΄λμ€κ° μΈλΆμ λ©€λ²λ₯Ό μ°Έμ‘°νμ¬ μ¬μ©νμ§ μμ κ²½μ°) λ©μΈμ§
inpa.tistory.com
static ν΄λμ€ μ»΄νμΌ
- μμ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ κ°λ€.

λ‘컬 ν΄λμ€
- λ©μλ λ΄λΆμ μμΉνλ ν΄λμ€ (μ§μ λ³μμ κ°μ μ±μ§μ μ§λ)
- μ§μ λ³μμ²λΌ ν΄λΉ λ©μλ λ΄λΆμμλ§ νμ μ μΌλ‘ μ¬μ©λλ€. (ν΄λΉ λ©μλ μ€ν μΈμλ ν΄λμ€ μ κ·Ό λ° μ¬μ© λΆκ°)
- μ κ·Όμ νμμ staticμ λΆμΌ μ μλ€.
λ©μλ λ΄λΆμμλ§ μ¬μ©λλ―λ‘ μ κ·Όμ μ νν νμκ° μκ³ , μλ λ©μλ λ΄μλ static λ©€λ²λ₯Ό μ μΈν μ μκΈ° λλ¬Έμ΄λ€.
class PocketBall {
int size = 100;
int price = 5000;
public void pocketMethod() {
int exp = 5000;
// λ©μλ λ΄μμ ν΄λμ€λ₯Ό μ μΈ
class PocketMonster {
String name = "μ΄μν΄μ¨";
int level = 10;
public void getPoketLevel() {
System.out.println(level); // μΈμ€ν΄μ€ λ³μ μΆλ ₯
System.out.println(exp); // λ©μλ μ§μ μμ μΆλ ₯
}
}
// λ©μλ λ΄μμ ν΄λμ€λ₯Ό μ μΈ
class PocketMonster2 {
String name = "리μλͺ½";
int level = 50;
}
new PocketMonster().getPoketLevel();
System.out.println("λ©μλ μ€ν μλ£");
}
}
λ©μλ λ΄μμ μ μ μ¬μ©νλ μ§μ λ³μ κ°λ κ³Ό κ°μ΄ μ§μ ν΄λμ€ μλ£νμ μ¬μ©νκ³ λ²λ¦¬λ κ²μΌλ‘ μ΄ν΄νλ©΄ λλ€.
λ©μλ λ΄μ λͺ¨λ λ΄μ©μ μ€ν νλ μ μμ μμ±λλ€κ° λ©μλ μ’ λ£ μ μ¬λΌμ§κ² λλ―λ‘, λΉμ°ν λ€λ₯Έ κ³³μμλ μ κ·Ό λ° μ¬μ© μμ²΄κ° λΆκ°λ₯νλ€.
λ©μλ λ΄μμ μΈμ€ν΄μ€λ₯Ό μμ±ν ν μ¬μ©νκ³ λ©μλ μ’ λ£μ ν¨κ» λ νΌλ°μ€κ° μ¬λΌμ§λ©΄μ ν λ©λͺ¨λ¦¬ μμμ μ€μ λ°μ΄ν°λ λμ€μ GC(κ°λΉμ§ 컬λ ν°)μ μν΄ μ§μμ§κ² λλ€.
λ‘컬 ν΄λμ€ μ§μ μμ μ κ·Ό
- λ©μλλ΄μ λ‘컬 ν΄λμ€μμ μ§μ λ³μμ μ κ·Όν΄μ κ°μ μ¬μ©νλ €κ³ ν λ λ°λμ final μμν λ μ§μ λ³μλ§ μ¬μ©μ΄ κ°λ₯νλ€.
- λ³μμ finalμ μλΆμ¬λ μ€νμ΄ λλ μ΄μ λ, JDK1.8λΆν° μ§μ ν΄λμ€μμ μ κ·Όνλ μ§μ λ³μ μμ final μ μλ΅ν μ μκΈ° λλ¬Έμ΄λ€. (μ»΄νμΌλ¬κ° μλμΌλ‘ λΆμ¬μ€)
- κ·Έλ¬λ μ§μ λ³μ(μμ)μ κ°μ΄ λ°λλ λ¬Έμ₯μ΄ μμΌλ©΄ μ΄λ μμκ° μλ λ³μμ΄λ, μ»΄νμΌ μλ¬κ° λ°μνλ€.

λ‘컬 ν΄λμ€ μ»΄νμΌ
- μ»΄νμΌμ μμ±λλ ν΄λμ€ νμΌλͺ : "μΈλΆν΄λμ€$1λ΄λΆ ν΄λμ€.class"
- μ§μ ν΄λμ€λ μ¬λ¬ λ©μλ λ΄μμ μμ±μ΄ κ°λ₯νλ κ°μ ν΄λμ€λͺ μ΄ μ€λ³΅λ μ μμ΄ μμ μ«μλ‘ κ΅¬λΆνλ€.

μ΅λͺ ν΄λμ€
- μ΅λͺ ν΄λμ€λ ν΄λμ€ μ΄λ¦μ΄ μ‘΄μ¬νμ§ μλ μ΄λ ν΄λμ€λ€. (μλ°μ€ν¬λ¦½νΈμ μ΅λͺ ν¨μλ‘ μκ°ν΄λ λλ€)
- λ¨ νλμ κ°μ²΄λ§μ μμ±νλ μΌνμ© ν΄λμ€
- ν΄λμ€μ μ μΈκ³Ό λμμ κ°μ²΄λ₯Ό μμ±
- μ΅λͺ ν΄λμ€λ μμ±μκ° μ‘΄μ¬νμ§ μλλ€.
- μ΅λͺ ν΄λμ€λ κΈ°μ‘΄μ μ‘΄μ¬νλ ν΄λμ€λ₯Ό λ©μλ λ΄μμ μΌνμ©μΌλ‘ ν΄λμ€ λ΄λΆ ꡬμ±μ μ μΈνμ¬ νμν λ©μλλ₯Ό μ¬μ μ νμ¬ μ¬μ©νλ κΈ°λ²μ΄λ€.
public class Main {
public static void main(String[] args) {
// Object ν΄λμ€λ₯Ό μΌνμ±μΌλ‘ μ΅λͺ
ν΄λμ€λ‘ μ μΈνμ¬ λ³μ o μ μ μ₯
Object o = new Object() {
@Override
public String toString() {
return "λ΄ λ§μλλ‘ toString λ°κΏλ³΄λ¦¬κΈ° ~";
}
};
// μ΅λͺ
ν΄λμ€μ κ°μ²΄μ μ€λ²λΌμ΄λ©ν λ©μλλ₯Ό μ¬μ©
String txt = o.toString();
System.out.println(txt); // λ΄ λ§μλλ‘ toString λ°κΏλ³΄λ¦¬κΈ° ~
}
}
[JAVA] β μ΅λͺ ν΄λμ€(Anonymous Class) κ°λ & λ¬Έλ² μ 리
μ΅λͺ ν΄λμ€ (Anonymous Class) μ΅λͺ ν΄λμ€λ λ΄λΆ ν΄λμ€(Inner class) μΌμ’ μΌλ‘ λ¨μ΄ κ·Έλλ‘ μ΄λ¦μ΄ μλ ν΄λμ€λ₯Ό λ§νλ€. μ΅λͺ , μ΄λ¦μ΄ μλ€λ κ²μ λ³λ‘ κΈ°μ΅λμ§ μμλ λλ€λ κ²μ΄λ©°, λμ€μ λ€
inpa.tistory.com
μ΅λͺ ν΄λμ€ μ»΄νμΌ
- μ»΄νμΌμ μμ±λλ ν΄λμ€ νμΌλͺ : "μΈλΆν΄λμ€$1.class"
- μ΅λͺ ν΄λμ€μ΄κΈ° λλ¬Έμ ν΄λμ€λͺ μ μκ³ μ€λ‘μ§ μ«μλ‘ κ΅¬λΆνλ€.

# μ°Έκ³ μλ£
https://www.youtube.com/watch?v=P1rDdH465Is
https://codevang.tistory.com/110
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.