[Java] λ΄λΆ ν΄λμ€(Inner class)μ λν΄
by rlaehddnd0422λ΄λΆ ν΄λμ€λ 무μμΈκ°?
λ΄λΆ ν΄λμ€(Inner class)λ ν΄λμ€ λ΄λΆμ μ μΈλ λ λ€λ₯Έ ν΄λμ€λ₯Ό λ§ν©λλ€.
public class Outer {
private String OuterA;
private String OuterB;
public class Inner {
private String innerA;
private String innerB;
}
}
- μ΄λ ν΄λμ€μμλ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Όν μ μμ΅λλ€. (static inner classλ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Ό λΆκ°λ₯)
λ΄λΆ ν΄λμ€ μΈμ μ¬μ©ν κΉ?
- λ ν΄λμ€κ° κΈ΄λ°ν κ΄κ³μ μμ λ ν΄λμ€ λ΄μ ν΄λμ€λ₯Ό μ μΈνκ³€ ν©λλ€.
- νλμ ν΄λμ€ λλ λ©μλμμλ§ μ¬μ©λλ ν΄λμ€λ₯Ό μ¬μ©νκ³ μΆμ λ λ΄λΆ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
GUI μ ν리μΌμ΄μ μ μ΄λ²€νΈ μ²λ¦¬ μΈμλ μ μ¬μ©νμ§ μκΈ° λλ¬Έμ, μ°μ λ΄λΆ ν΄λμ€μ μ¬μ©λ²κ³Ό νΉμ§ μ λλ§ κ°λ³κ² μμλ³΄κ² μ΅λλ€.
λ΄λΆ ν΄λμ€μ μ₯μ
- μ κ·Ό μ μ΄μλ₯Ό νμ΄νΈνκ² μ‘μλ κ°μ ν¨ν€μ§, κ°μ ν΄λμ€ levelμ μκΈ° λλ¬Έμ λ ν΄λμ€μ λ©€λ²λ€ κ° μλ‘ μ½κ² μ κ·Όν μ μμ΅λλ€.
- κ°μ ν¨ν€μ§/ν΄λμ€μμ μ½μ μ μμ΄, μκ°μ μΌλ‘ κ°λ μ±μ΄ λκ³ μ μ§λ³΄μμ μμ΄μλ μ΄μ μ κ°μ§κ² λ©λλ€.
- μΈλΆμ μΌλ‘ λΆνμν ν΄λμ€λ₯Ό κ°μΆ€μΌλ‘, μ½λμ 볡μ‘μ±μ μ€μΌ μ μμ΅λλ€. (μΊ‘μν, μλν)
λ΄λΆμ μ μλλ€λ μ μ μ μΈνλ©΄ μΌλ°μ μΈ ν΄λμ€μ λ€λ₯Έ μ μ μμ΅λλ€. μ°λ¦¬κ° μ΄λ ν΄λμ€μ λ³μλ μμκ° νμνλ©΄ ν΄λμ€ λ©€λ²λ‘μ ν΄λμ€ λ΄μμ μ μΈνκ³ μ¬μ©ν κ²μ²λΌ, μ μΈ μ£Όμ²΄λ₯Ό λ³μμμ ν΄λμ€λ‘ λ°κΎΌκ²μ΄ λ΄λΆ ν΄λμ€λΌκ³ 보μλ©΄ λ©λλ€.
λ΄λΆ ν΄λμ€ μ’ λ₯
ν΄λμ€μ λ©€λ² λ³μλ μ μΈλλ μμΉ, μ κ·Ό μ μ΄μμ λ°λΌ μν κ³Ό μ΄λ¦μ΄ λ¬λΌμ§λ―μ΄, λ΄λΆ ν΄λμ€λ λκ°μ΅λλ€.
λ΄λΆ ν΄λμ€ μ’ λ₯ | νΉμ§ |
λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€ ( instance Class ) | μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈμμΉμ μ μΈλλ©°, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ² μ²λΌ λ€λ£¨μ΄μ§λλ€. - μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈλ©λλ€. |
λ΄λΆ μ€νν± ν΄λμ€ ( static class ) | μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈ μμΉμ μ μΈνλ©°, μΈλΆ ν΄λμ€μ static λ©€λ²μ²λΌ λ€λ£¨μ΄ μ§λλ€. - μ£Όλ‘ μΈλΆ ν΄λμ€μ static λ©€λ²μ κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈλ©λλ€. - λ€λ§ static μ΄λΌκ³ ν΄μ, new μμ±μ μ΄κΈ°νλ₯Ό λͺ»νλ κ²μ μλλ€. - μΌλ°μ μΈ static νλλ, static λ©μλμ λ¬λ¦¬ λ΄λΆ static ν΄λμ€λ κ°μ staticμ΄μ§λ§, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ΄λ μ§μ μμ±ν μ μμ΅λλ€. - μ¦, λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€μλ λ€λ₯΄κ² Inner static classμ μΈμ€ν΄μ€λ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€μ λ 립μ μΌλ‘ λ©λͺ¨λ¦¬μ μ‘΄μ¬ν©λλ€. |
λ΄λΆ λ‘컬 ν΄λμ€ ( local class ) | μΈλΆ ν΄λμ€μ λ©μλλ μ΄κΈ°ν λΈλ‘ μμ μ μΈνμ¬, μ μΈλ λΈλ‘ μμμλ§ μ¬μ© ν μ μμ΅λλ€. |
λ΄λΆ μ΅λͺ ν΄λμ€ ( anonymous class ) | ν΄λμ€μ μ μΈ, μΈμ€ν΄μ€μ μμ±μ λμμ νλ μ΄λ¦μλ ν΄λμ€ - μ£Όλ‘ ν΄λμ€λ₯Ό μΌνμ©μΌλ‘ μ¬μ©ν λ μμ£Ό μ΄μ©λ©λλ€. |
public class Outer {
class InstanceClass{} // λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€
static class StaticClass{} // λ΄λΆ μ€νν± ν΄λμ€
void method() {
class LocalClass{} // λ΄λΆ λ‘컬 ν΄λμ€
}
}
λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€ ( Inner Instace class )
- ν΄λμ€μ λ©€λ² λ³μ μ μΈλΆμ μμΉνκ³ , static ν€μλκ° μλ ν΄λμ€
- μΈλΆ ν΄λμ€μ λ©€λ²λ‘ μ·¨κΈλλ―λ‘, μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ¨Όμ μμ±νκ³ λ λ€, λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
- λ΄λΆ μΈμ€ν΄μ€ ν΄λμ€ λ΄λΆμλ static λ©€λ² μ μΈμ΄ λΆκ°λ₯ν©λλ€.
- νμ§λ§ μμμΈ static finalμ κ°λ₯νλ€λ μ
- μ£Όλ‘ μΈλΆ ν΄λμ€μ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ μ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈν©λλ€.
- ν΄λμ€ μμ ν΄λμ€ ννμ΄λ―λ‘ μ»΄νμΌ μ "μΈλΆν΄λμ€$λ΄λΆν΄λμ€.class" ννλ‘ μμ±λ©λλ€.
public class Bag {
private String name;
private Long price;
public Bag(String name, Long price) {
this.name = name;
this.price = price;
}
class Pouch {
private String pouchName;
private String color;
// static int k = 5; // static λ©€λ² μ¬μ© λΆκ°
static final int cost = 5000; // νμ§λ§ μμμΈ final staticμ μ¬μ© κ°λ₯
public void printMember() {
System.out.println("name = " + name); // μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Ό κ°λ₯ ( private μ¬λ κ°μ ν΄λμ€ λ΄μμ μ κ·Όνλ―λ‘ ok )
System.out.println("price = " + price); // μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Ό κ°λ₯ ( private μ¬λ κ°μ ν΄λμ€ λ΄μμ μ κ·Όνλ―λ‘ ok )
System.out.println("pouchName = " + pouchName); // λ΄λΆ ν΄λμ€μ λ©€λ²
System.out.println("color = " + color); // λ΄λΆ ν΄λμ€μ λ©€λ²
}
}
}
μΈλΆ ν΄λμ€κ° μΈμ€ν΄μ€ν βΆοΈ μΈλΆ ν΄λμ€κ° λ©λͺ¨λ¦¬μ μ μ¬ βΆοΈ λ΄λΆ ν΄λμ€μ μ½λλ λ©λͺ¨λ¦¬μ μ μ¬
public static void main(String[] args) {
Bag b = new Bag("bagPack", 500000L); // μΈλΆ ν΄λμ€ μΈμ€ν΄μ€ μμ± -> μΈλΆ ν΄λμ€κ° λ©λͺ¨λ¦¬μ μ μ¬ -> λ΄λΆ ν΄λμ€μ μ½λλ λ©λͺ¨λ¦¬μ μ μ¬
Bag.Pouch p = b.new Pouch("pouch1", "white"); // λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€ μμ± κ°λ₯
// μ λμ€μ ν μ€λ‘ ννν μ μμ΅λλ€ (κ°λ
μ±μ μ’μ§ μμ)
Bag.Pouch p2 = new Bag("backPack2", 300000L).new Pouch("pouch2", "red");
}
λ΄λΆ ν΄λμ€μ μ½λκ° λ©λͺ¨λ¦¬μ μ μ¬λ μ΄ν(μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λκ³ λ ν)μμΌ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμ΅λλ€.
νμ§λ§ λ΄λΆ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μμ μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄μ μ§μ μ¬μ©ν기보λ€, μΈλΆ ν΄λμ€μμ λ©€λ²μ²λΌ μ¬μ©νλ κ²μ΄ μΌλ°μ μ΄λ©° μμ κ°μ΄ λ΄λΆ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ§μ μ¬μ©νλ κ²½μ°λ λλ λλ€.
μΈλΆ ν΄λμ€μ λ©μλλͺ = λ΄λΆ ν΄λμ€μ λ©μλλͺ μΌ λ μΈλΆ ν΄λμ€μ λ©μλλ₯Ό νΈμΆνκΈ°
- μμ κ΄κ³μΌ λλ super ν€μλλ‘ κ°λ₯. But μΈ/λ΄λΆ ν΄λμ€ κ΄κ³λ μμκ΄κ³κ° X
public class Parent {
public void print() {
System.out.println("PARENT");
}
}
public class Child extends Parent{
public void print() {
super.print();
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Parent();
p.print();
Child c = new Child();
c.print();
}
}
μ€ν κ²°κ³Ό PARENT PARENT |
- μμ κ΄κ³μμλ λ©μλλͺ μ΄ κ°μ κ²½μ° 'super' ν€μλλ‘ λΆλͺ¨ λ©μλμ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€.
νμ§λ§ μΈλΆ-λ΄λΆ ν΄λμ€μ κ΄κ³λ μμ κ΄κ³κ° μλκΈ° λλ¬Έμ super ν€μλλ₯Ό μ΄μ©ν λΆλͺ¨ λ©μλ νΈμΆμ΄ λΆκ°λ₯ν©λλ€.
μΈλΆ/λ΄λΆ ν΄λμ€μμλ μ΄λ΄ λ μ κ·νλ thisλ₯Ό μ¬μ©νλ©΄ λ°κΉ₯ μΈμ€ν΄μ€μ λ©μλλ₯Ό νΈμΆνκ±°λ μ°Έμ‘°ν μ μμ΅λλ€.
μ κ·ν λ thisλ "ν΄λμ€λͺ .this" ννλ‘ λ°κΉ₯ ν΄λμ€μ μ΄λ¦μ λͺ μνλ μ©λ²
public class Outer1 {
public void print(String s) {
System.out.println("μΈλΆ ν΄λμ€μ print method μ€ν κ²°κ³Ό " + s);
}
class Inner1 {
public void print(String s) {
// System.out.println("λ΄λΆ ν΄λμ€μ print method μ€ν κ²°κ³Ό " + s);
Outer1.this.print(s);
}
}
}
λ΄λΆ λ‘컬 ν΄λμ€ ( Inner local class )
- λ©μλ λ΄λΆμ μμΉνλ ν΄λμ€λ‘ μ§μ λ³μμ λ§μ°¬κ°μ§λ‘ λ©μλ λ΄λΆ λΈλ‘μμλ§ νμ μ μΌλ‘ μ¬μ©λ©λλ€.
- λ§μ°¬κ°μ§λ‘ static inner class κ° μλκΈ° λλ¬Έμ static λ©€λ²λ μ¬μ©ν μ μμ§λ§, μμ static finalμ μ¬μ©ν μ μμ΅λλ€.
- λ©μλκ° μ€νλ λ μ¬μ©λκ³ μ€νμ λ§μΉλ©΄ μ¬λΌμ§λ μ§μ λ³μμ²λΌ μ§μ ν΄λμ€ μλ£νμ μ¬μ©νκ³ λ²λ¦¬λ λλμ΄λΌκ³ 보μλ©΄ λ©λλ€.
- λ΄λΆ μ§μ ν΄λμ€λ μ»΄νμΌ μ "μΈλΆν΄λμ€$1λ΄λΆν΄λμ€.class"λ‘ μμ±λ©λλ€.
public class Bag {
private String name;
public Bag(String name) {
this.name = name;
}
public void method() {
class Pouch {
private String color = "RED";
// static int k = 5; // static λ©€λ² μ¬μ© λΆκ°
static final int cost = 5000; // νμ§λ§ μμμΈ final staticμ μ¬μ© κ°λ₯
public void printMember() {
System.out.println("name = " + name); // μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Ό κ°λ₯ ( private μ¬λ κ°μ ν΄λμ€ λ΄μμ μ κ·Όνλ―λ‘ ok )
System.out.println("color = " + color); // λ΄λΆ ν΄λμ€μ λ©€λ²
}
}
new Pouch().printMember();
}
}
public class Main {
public static void main(String[] args) {
Bag b = new Bag("BAG1");
b.method();
}
}
μ€ν κ²°κ³Ό name = BAG1 color = RED |
- λ΄λΆ μ§μ ν΄λμ€λ μ§μ λ³μμ λ§μ°¬κ°μ§λ‘ Stack μμμ μ μ₯λμλ€κ° λ©μλκ° μ’ λ£λλ©΄ μ¬λΌμ§λ―λ‘ λ€λ₯Έ κ³³μμ μ κ·Ό λ° μ¬μ©μμ²΄κ° λΆκ°λ₯ν©λλ€. μ€μ§ μΈλΆ ν΄λμ€ μΈμ€ν΄μ€μ λ©μλ νΈμΆμ ν΅ν΄μλ§ μ κ·Ό/μ€ν κ°λ₯.
+Tip) λ΄λΆ λ‘컬 ν΄λμ€μμλ κ°μ λΈλ λ΄μ μ§μ λ³μμ μ κ·Όν΄μ κ°μ μ¬μ©νλ €λ©΄ final ν€μλκ° λΆμ΄μμ΄μΌ ν©λλ€.
public void method() {
int k = 1;
k = 4;
class Pouch {
private String color = "RED";
// static int k = 5; // static λ©€λ² μ¬μ© λΆκ°
static final int cost = 5000; // νμ§λ§ μμμΈ final staticμ μ¬μ© κ°λ₯
public void printMember() {
System.out.println("name = " + name); // μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Ό κ°λ₯ ( private μ¬λ κ°μ ν΄λμ€ λ΄μμ μ κ·Όνλ―λ‘ ok )
System.out.println("color = " + color); // λ΄λΆ ν΄λμ€μ λ©€λ²
System.out.println(k); // μ»΄νμΌ μλ¬
}
}
new Pouch().printMember();
}
- κ°μ λ³κ²½νκ² λλ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ κ²μ νμΈν μ μμ΅λλ€.
JDK 1.8 ver μ΄νλ‘λ μ§μ ν΄λμ€μμ μ κ·Όνλ μ§μ λ³μ μμ μ»΄νμΌλ¬κ° μλμΌλ‘ final ν€μλλ₯Ό λΆμ¬μ£Όλ―λ‘ μλμ κ°μ΄ final ν€μλλ₯Ό μλ΅ν μ μμ΅λλ€.
public void method() {
int k = 1; // μ»΄νμΌλ¬κ° μλμΌλ‘ finalμ λΆμ¬μ€λλ€.
class Pouch {
private String color = "RED";
// static int k = 5; // static λ©€λ² μ¬μ© λΆκ°
static final int cost = 5000; // νμ§λ§ μμμΈ final staticμ μ¬μ© κ°λ₯
public void printMember() {
System.out.println("name = " + name); // μΈλΆ ν΄λμ€μ λ©€λ²μ μ κ·Ό κ°λ₯ ( private μ¬λ κ°μ ν΄λμ€ λ΄μμ μ κ·Όνλ―λ‘ ok )
System.out.println("color = " + color); // λ΄λΆ ν΄λμ€μ λ©€λ²
System.out.println(k);
}
}
new Pouch().printMember();
}
μ€ν κ²°κ³Ό name = BAG1 color = RED 1 |
λ΄λΆ μ€νν± ν΄λμ€ ( Inner static class )
- static ν€μλκ° λΆμ λ΄λΆ ν΄λμ€λ‘, μΌλ°μ μΈ ν΄λμ€λ staticμ΄ λΆκ°λ₯νμ§λ§ λ΄λΆ ν΄λμ€λ static μ μΈμ΄ κ°λ₯
- μΌλ°μ μΈ static νλμ, static λ©μλμ λ¬λ¦¬ static class λ΄λΆμλ instance λ©€λ²μ static λ©€λ² λͺ¨λ μ μΈν μ μμ΅λλ€.
- νμ§λ§ μΌλ°μ μΈ static λ©μλκ° instance λ©€λ²μ μ κ·Όν μ μλ―μ΄, λ΄λΆ static ν΄λμ€λν μΈλΆ ν΄λμ€μ instance λ©€λ²μλ μ κ·Όμ΄ λΆκ°λ₯νκ³ , μΈλΆ ν΄λμ€μ static λ©€λ²μλ§ μ κ·Όμ΄ κ°λ₯ν©λλ€.
- static -> static (O)
- static -> instance (X)
- instance -> instance (O)
- instance -> static (O)
- μ»΄νμΌ μ μΈμ€ν΄μ€ λ΄λΆ ν΄λμ€μ λμΌνκ² "μΈλΆν΄λμ€$λ΄λΆν΄λμ€.class"λ‘ μμ±λ©λλ€.
public class Outer {
int a = 1; // instane λ©€λ²
static int a2 = 3; // static λ©€λ²
static int a3 = new Inner().b; // static λ©€λ²λΌλ¦¬λ μ κ·Ό κ°λ₯
void print() { // instance λ©€λ² -> static λ©€λ² μ κ·Ό κ°λ₯
a3 = 4;
System.out.println(a3);
}
static class Inner {
int b = 1; // instance λ©€λ²
static void print() {
// System.out.println(b); // static λ©€λ² -> instance λ©€λ² μ κ·Ό λΆκ°λ₯
// System.out.println(a); // static λ©€λ² -> instance λ©€λ² μ κ·Ό λΆκ°λ₯
System.out.println(a2); // static λ©€λ² -> static λ©€λ² μ κ·Ό κ°λ₯
}
}
}
μ΅λͺ ν΄λμ€ ( Anonymous class )
- μ΅λͺ ν΄λμ€λ μ΄λ¦μ΄ μ‘΄μ¬νμ§ μλ μ΄λ ν΄λμ€.
- ν΄λμ€μ μ μΈ, μΈμ€ν΄μ€μ μμ±μ΄ λμμ μ΄λ£¨μ΄μ§λ μΌνμ© ν΄λμ€μ λλ€.
- μμ±μκ° μ‘΄μ¬νμ§ X
- κΈ°μ‘΄μ μ‘΄μ¬νλ ν΄λμ€λ₯Ό λ©μλ λ΄μμ μΌνμ©μΌλ‘ λ΄λΆ ꡬμ±μ μ μΈνμ¬ νμν λ©μλλ₯Ό μ¬μ μνμ¬ μ¬μ©νλ κΈ°λ²
- μ»΄νμΌ μ "μΈλΆν΄λμ€$1.class", "μΈλΆν΄λμ€$2.class" λ‘ μ΄λ¦μ΄ μκΈ° λλ¬Έμ μλΌλΉμ μ«μλ§ νκΈ°νμ¬ κ΅¬λΆν©λλ€.
public class Main {
public static void main(String[] args) {
Object o = new Object(){
@Override
public String toString() {
return "HI!";
}
};
System.out.println(o.toString());
}
}
> κΈ°μ‘΄ μλ°μ μλ ν΄λμ€μΈ Objectμ toString λ©μλλ₯Ό μ€λ²λΌμ΄λ©νμ¬ μΌνμ±μΌλ‘ μ¬μ©
public interface Printable {
void print();
}
public class Main {
public static void main(String[] args) {
Printable a = new Printable() {
@Override
public void print() {
System.out.println("HI");
}
};
a.print();
}
}
> μμ κ°μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μΌνμ©μΌλ‘ μ¬μ©νλ κ²λ κ°λ₯ν©λλ€.
<μ°Έκ³ μλ£>
'π Backend > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] 컬λ μ νλ μμν¬μ Collection Interfaceμ λν΄ (0) | 2023.10.04 |
---|---|
[Java] λ΄λΆ ν΄λμ€μ staticμ΄ κΆμ₯λλ μ΄μ μ λν΄ (0) | 2023.10.03 |
[Java] μΈν°νμ΄μ€λ₯Ό μ΄μ©ν λ€νμ±κ³Ό νμ© (1) | 2023.10.02 |
[Java] μΈν°νμ΄μ€μ μ©λ(usage)μ λν΄ (0) | 2023.10.02 |
[Java] λ€νμ±(Polymorphism)μ λν΄ (0) | 2023.09.27 |
λΈλ‘κ·Έμ μ 보
Study Repository
rlaehddnd0422