μλ° μ€κ°κ³ μ¬κ° λλ¬λ€. κ·Έ λ€μλ μμ© νλ‘κ·Έλλ°μ λ°°μ°κ³ μλ€. νμ§λ§ βνΌμ 곡λΆνλ μλ°β μ± λ΄μ©μ΄ μμ§ λ¨μκΈ° λλ¬Έμ κ·Έκ²μ μ 리νκ³ μλ€. μ΄λ²μλ 9λ¨μ μ€μ²© ν΄λμ€μ μ€μ²© μΈν°νμ΄μ€μ λν΄ μ 리νλ€.
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ ν΄λμ€λ€μ μλ‘ μνΈμμ©νλ€. μ΄λ μ΄λ€ ν΄λμ€λ νΉμ ν΄λμ€μλ§ κ΄κ³λ₯Ό λ§Ίκ² λλλ° μ΄ κ²½μ° ν΄λμ€ λ΄λΆμ ν΄λμ€λ₯Ό μ μΈν μ μλ€.
1. μ€μ²© ν΄λμ€
μ€μ²© ν΄λμ€λ λ§ κ·Έλλ‘ ν΄λμ€ λ΄λΆμ μ μΈν ν΄λμ€μ΄λ€. μ΄λ¬λ©΄ μΈλΆμλ λΆνμν κ΄κ³ ν΄λμ€λ₯Ό κ°μΆ μ μλ€.
class Outer {
class Inner {
//λ΄λΆ ν΄λμ€
}
}
μ΄λ ν΄λμ€μ λ©€λ²λ‘ μ μΈλλ μ€μ²© ν΄λμ€λ λ©€λ² ν΄λμ€, μμ±μλ λ©μλ λ΄λΆμμ μ μΈλλ μ€μ²© ν΄λμ€λ₯Ό λ‘컬 ν΄λμ€λΌ νλ€. λ‘컬 ν΄λμ€λ λ©μλ μ€νμμλ§ μ¬μ©λκ³ λ©μλ μ’ λ£μ μ¬λΌμ§λ€.
//static μ κ·Όμ κ΄ν λ΄μ© todo
μ€μ²© ν΄λμ€λ μ»΄νμΌμ λ°μ΄νΈμ½λ νμΌ .classνμΌμ΄ μμ±λλ€.
1.1 μΈμ€ν΄μ€ λ©€λ² ν΄λμ€
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ static ν€μλ μμ΄ μ€μ²© μ μΈλ ν΄λμ€μ΄λ€. μ΄ ν΄λμ€μλ μ μ νλμ λ©μλλ μ μΈν μ μλ€.
class A{
// B ν΄λμ€κ° μΈμ€ν΄μ€ λ©€λ² ν΄λμ€
class B{
B(){
System.out.println("B");
}
int a;
void print(){
System.out.println("in classB");
}
static int c; //μλ¬. μ μ νλλ μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ μ μΈ λΆκ°λ₯
}
}
A ν΄λμ€ μΈλΆμμ B ν΄λμ€λ₯Ό μ¬μ©νλ €λ©΄ A ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌ νλ€.
A a=new A();
A.B b=a.new B();
A ν΄λμ€ λ΄λΆμμλ A κ°μ²΄ μμ΄ B κ°μ²΄λ₯Ό μμ±ν μ μλ€. λ¨ Bν΄λμ€λ A ν΄λμ€ λ΄λΆμ ν΄λμ€μ΄λ―λ‘ A ν΄λμ€ λ΄λΆμμλ§ μ¬μ©νλ κ² μΌλ°μ μ΄λ€.
λ§μ½ μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ static νλλ₯Ό μ μΈνλ €κ³ μλν μ βThe field [λ³μλͺ ] cannot be declared static in a non-static inner type, unless initialized with a constant expressionβ μ΄λΌλ μ€λ₯κ° λ¬λ€.
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ μ μ λ©€λ²κ° μ μΈ λΆκ°λ₯ν μ΄μ λ μμ μ΄μ κ° μκ³ λͺ¨νΈν΄μ§ μ μλ κ°λ₯μ±μ΄ μκΈ° λλ¬Έμ΄λ€.
λ¨Όμ ν΄λμ€μ μ μ λ©€λ²κ° μλ μ΄μ λ μΈμ€ν΄μ€ μμ± μμ΄ ν΄λμ€ μ체μ μν μ΄λ€ λ°μ΄ν°λ₯Ό μ μνκΈ° μν¨μΈλ° μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ μ μ΄μ μμ μΈμ€ν΄μ€κ° μκΈ° λλ¬Έμ λ©€λ² ν΄λμ€ μ체μ μν λ°μ΄ν°λ₯Ό μ μν μ΄μ κ° μλ€.
λν μ μ λ©€λ²λ ν΄λμ€ μ체μ κ·μλμ΄μ λͺ¨λ ν΄λμ€ μΈμ€ν΄μ€μ λν΄μ 곡μ λμ§λ§ μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ μμ μΈμ€ν΄μ€μ κ·μλκΈ° λλ¬Έμ μ μ λ©€λ²κ° μμΌλ©΄ λͺ¨νΈν΄μ§ μ μλ€.
class A{
class B{
static int BMember;
}
}
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ μ μ λ©€λ²κ° μμ μ μλ€κ³ κ°μ νκ³ μμ κ°μ μ½λκ° μλ€κ³ νμ. κ·Έλ¦¬κ³ A ν΄λμ€μ μΈμ€ν΄μ€ 2κ°λ₯Ό λ§λ€κ³ BMemberμ κ°μ κ°κ° λ°κΎΈμλ€.
A a1=new A();
A a2=new A();
a1.B.BMember=1;
a2.B.BMember=2;
μ΄λ κ² νλ©΄ BMemberμ κ°μ 무μμ΄ λμ΄μΌ νλκ°? κ°μ B ν΄λμ€μ΄λ―λ‘ λμ€μ λμ ν 2κ° λμ΄μΌ νλκ° μλλ©΄ a1μ Bμ a2μ Bλ μλ‘ λ€λ₯Έ ν΄λμ€μ΄λ―λ‘ 1κ³Ό 2κ° λμ΄μΌ νλκ°?
κ°μ Bν΄λμ€λΌκ³ κ°μ νλ©΄ a1κ³Ό a2λ λ€λ₯Έ μΈμ€ν΄μ€μΈλ° κ°μ μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ₯Ό κ°κΈ° λλ¬Έμ μ΄μνκ³ a1,a2μ Bκ° λ€λ₯Έ Bν΄λμ€λΌκ³ κ°μ νλ©΄ BMemberλ μ μ λ©€λ²μΈλ° a1.B.BMemberμ a2.B.BMemberκ° λ€λ₯Έ κ°μ κ°λμ§κ° μ΄μνλ€.
μ΄λ° λͺ¨νΈν¨μ΄ μκΈΈ μ μκΈ° λλ¬Έμ μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ μ μ λ©€λ²λ₯Ό μ μΈν μ μλ€.
1.2 μ μ λ©€λ² ν΄λμ€
μ μ λ©€λ² ν΄λμ€λ static ν€μλκ° λΆμ΄μ μ μΈλ ν΄λμ€μ΄λ€. μ΄ ν΄λμ€μλ λͺ¨λ μ’ λ₯μ νλμ λͺ¨λ μ’ λ₯ λ©μλλ₯Ό μ μΈν μ μλ€.
class A{
A(){
System.out.println("A");
}
static class C{
C(){
System.out.println("C");
}
int a;
static int b;
void print(){
System.out.println("in classC");
}
}
}
μ μ λ©€λ² ν΄λμ€μ κ°μ²΄ μμ±μ μμ ν΄λμ€μ κ°μ²΄ μμ± μμ΄λ κ°λ₯νλ€.
A.C c = new A.C();
c.print();
1.3 λ‘컬 ν΄λμ€
λ‘컬 ν΄λμ€λ λ©μλ λ΄λΆμ μ μΈλ ν΄λμ€μ΄λ€. λ‘컬 ν΄λμ€λ λ©μλ λ΄λΆμμλ§ μ¬μ©ν μ μμΌλ©° λ©μλκ° μ’ λ£λλ©΄ λ©λͺ¨λ¦¬μμ μ¬λΌμ§λ€. λ°λΌμ μ κ·Ό μ νμλ staticμ λΆμΌ μ μλ€. μ΄μ°¨νΌ λ©μλ λ΄μμλ§ μ¬μ©λκΈ° λλ¬Έμ΄λ€. κ°μ μ΄μ λ‘ μΈμ€ν΄μ€ νλμ λ©μλλ§ μ μΈν μ μκ³ μ μ λ©€λ²λ μ μΈν μ μλ€.
class A{
// B ν΄λμ€κ° μΈμ€ν΄μ€ λ©€λ² ν΄λμ€
A(){
System.out.println("A");
}
void method(){
// λ‘컬 ν΄λμ€
class D{
D(){
System.out.println("D");
}
int a;
void print(){
System.out.println("in classD");
}
}
D d = new D();
d.print();
}
}
λ‘컬 ν΄λμ€λ μμ ν΄λμ€μ λ©μλ λ΄μμ μ¬μ©λλ€. νΉμ λ©μλλ₯Ό μ μΈνλ©΄ κ·Έ ν΄λμ€κ° μ¬μ©λλ κ²μ΄λ€.
A a = new A();
// method λ΄λΆμμ D ν΄λμ€ μ¬μ©
a.method();
1.4 μ€μ²© ν΄λμ€ μ κ·Ό μ ν
1.4.1 λ°κΉ₯ ν΄λμ€μμ λ©€λ² ν΄λμ€ μ κ·Ό
λ°κΉ₯ ν΄λμ€μμ λ©€λ² ν΄λμ€λ₯Ό μ¬μ©ν λλ λͺ κ°μ§ μ νμ΄ μλ€. μμμ μΌλ‘ μκ°ν΄ 보면 λΉμ°ν μ νμ΄ λλΆλΆμ΄λ€.
- μΈμ€ν΄μ€ λ©€λ² ν΄λμ€ κ°μ²΄λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ νλμ λ©μλμμλ§ μμ±ν μ μλ€.
- μ μ λ©€λ² ν΄λμ€ κ°μ²΄λ λ°κΉ₯ ν΄λμ€μ λͺ¨λ νλμ λ©μλμμ μμ±ν μ μλ€.
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ λ§ κ·Έλλ‘ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μ μμλ κ²μ΄λ―λ‘ μΈμ€ν΄μ€κ° μμ΄μΌλ§ μΈ μ μλ€. λ°λΌμ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ νλμ λ©μλμμλ§ μμ±ν μ μλ κ²μ΄ λΉμ°νλ€.
λ°λ©΄ μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€ κ·Έ μ체μ μν κ²μ΄λ―λ‘ λ°κΉ₯ ν΄λμ€μ λͺ¨λ κ³³μμ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
1.4.2 λ©€λ² ν΄λμ€μμ λ°κΉ₯ ν΄λμ€ μ κ·Ό
- μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μμ λ°κΉ₯ ν΄λμ€μ λͺ¨λ νλμ λ©μλμ μ κ·Όν μ μλ€.
- μ μ λ©€λ² ν΄λμ€μμλ λ°κΉ₯ ν΄λμ€μ μ μ νλ, μ μ λ©μλμλ§ μ κ·Όν μ μλ€.
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€λ κ° μΈμ€ν΄μ€λ³λ‘ μμΌλ―λ‘ ν΄λμ€ μ체μ μμλ μ μ λ©€λ²μλ λΉμ°ν μ κ·Όν μ μλ€.
λ°λ©΄ μ μ λ©€λ² ν΄λμ€λ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€μλ κ΄κ³κ° μμΌλ―λ‘ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ νλμ λ©μλμλ μ κ·Όν μ μλ€.
class A{
// B ν΄λμ€κ° μΈμ€ν΄μ€ λ©€λ² ν΄λμ€
int field1;
static int field2;
void method1(){
System.out.println("A instance method1()");
}
static void method2(){
System.out.println("A static method2()");
}
class B{
void method(){
field1 = 10;
field2 = 10;
method1();
method2();
}
}
static class C{
void method(){
// μ μ λ©€λ²μλ§ μ κ·Ό κ°λ₯
// field1 = 10;
field2 = 10;
// method1();
method2();
}
}
}
1.4.3 λ‘컬 ν΄λμ€μμ λ°κΉ₯ ν΄λμ€ λ©€λ² μ κ·Ό
λ©μλμ λ§€κ°λ³μ νΉμ λ‘컬 λ³μλ₯Ό λ‘컬 ν΄λμ€μμ μ¬μ©ν λκ° μμ μ μλ€. λ‘컬 ν΄λμ€λ λ©μλ λ΄μμλ§ μ‘΄μ¬νλ―λ‘ λ©μλκ° μ’ λ£λ μ λ‘컬 ν΄λμ€λ μ¬λΌμ§λ κ² μΌλ°μ μ΄λ€. κ·Έλ¬λ μ€λ λμ κ²½μ° λ©μλκ° μ’ λ£λμ΄λ λ‘컬 μ€λ λ κ°μ²΄κ° μ€ν μνλ‘ μ‘΄μ¬ν μ μλ€.
μ΄λ° λΆλΆμ λ§κΈ° μν΄ μλ°λ μ»΄νμΌ μ λ‘컬 ν΄λμ€μμ μ¬μ©νλ λ§€κ°λ³μμ λ‘컬 λ³μλ₯Ό finalλ‘ μ μΈνλ€. μ¦ λ‘컬 ν΄λμ€ λ΄μμ λ§€κ° λ³μλ λ‘컬 λ³μλ₯Ό λ³κ²½ν μ μλ€. λ§μ½ finalλ‘ μ μΈλμ΄ μμ§ μλλΌλ μλμΌλ‘ finalλ‘ μ μΈλλ€.
λ§μ½ μ΄λ₯Ό μ΄κΈ°κ³ λ‘컬 ν΄λμ€ λ΄μμ λ§€κ° λ³μλ λ‘컬 λ³μλ₯Ό λ³κ²½νλ €κ³ νλ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ€. βLocal variable [λ³μλͺ ] defined in an enclosing scope must be final or effectively finalβ μ΄λΌλ μλ¬λ‘, ν΄λΉ λ³μλ finalμ΄κ±°λ finalκ³Ό κ°μ ν¨κ³Όλ₯Ό κ°μ ΈμΌ νλ€λ λ»μ΄λ€. μ¦ λ‘컬 ν΄λμ€ λ΄μμ λ§€κ° λ³μλ λ‘컬 λ³μλ₯Ό λ³κ²½νμ§ λ§λΌλ λ»μ΄λ€.
1.4.4 μ€μ²© ν΄λμ€μμ λ°κΉ₯ ν΄λμ€ μ°Έμ‘°νκΈ°
ν΄λμ€ λ΄λΆμμ this
λ κ°μ²΄ μ€μ€λ‘λ₯Ό μ°Έμ‘°νλ€. νμ§λ§ μ€μ²© ν΄λμ€μμ λ°κΉ₯ ν΄λμ€μ μ°Έμ‘°κ° νμν λκ° μλ€. λ°κΉ₯ ν΄λμ€μ λ©μλλ₯Ό μ¬μ©νλ λ±μ΄λ€. κ·Έλ΄ λλ λ°κΉ₯ ν΄λμ€μ μ΄λ¦μ this μμ λΆμ¬ μ£Όλ©΄ λλ€.
class A{
String field="Outter field";
void method(){
System.out.println("Outter class");
}
class B{
String field="Inner field";
void method(){
System.out.println("Inner class");
}
void print (){
System.out.println(this.field);
this.method();
System.out.println(A.this.field);
A.this.method();
}
}
}
κ·Έλ¦¬κ³ λ€μκ³Ό κ°μ μ½λλ₯Ό λ©μΈ ν¨μμμ μ€νν΄ λ³Έλ€.
A a = new A();
A.B b = a.new B();
b.print();
κ²°κ³Όλ λ€μκ³Ό κ°λ€.
Inner field
Inner class
Outter field
Outter class
2. μ€μ²© μΈν°νμ΄μ€
μ€μ²© μΈν°νμ΄μ€λ ν΄λμ€ λ©€λ²λ‘ μ μΈλ μΈν°νμ΄μ€μ΄λ€. μΈμ€ν΄μ€ λ©€λ² μΈν°νμ΄μ€μ μ μ λ©€λ² μΈν°νμ΄μ€ λͺ¨λ κ°λ₯νλ€. μ κ·Ό κ°μ κ²½μ° μ€μ²© ν΄λμ€μ λμΌνλ€.
μ£Όλ‘ UI νλ‘κ·Έλλ°μμ μ΄λ²€νΈ μ²λ¦¬ λͺ©μ μΌλ‘ λ§μ΄ μ°μΈλ€.
3. μ΅λͺ κ°μ²΄
μ΅λͺ κ°μ²΄λ μ΄λ¦μ΄ μλ κ°μ²΄μ΄λ€. μ΅λͺ κ°μ²΄λ μ΄λ€ ν΄λμ€λ₯Ό μμνκ±°λ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€. μΌλ°μ μΈ κ²½μ° λͺ μμ μΌλ‘ ν΄λμ€ μ΄λ¦μ μ£Όκ³ μ μΈνλ€. νμ§λ§ μ΅λͺ κ°μ²΄λ λΆλͺ¨ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό μμνκ±°λ ꡬννλ μ΅λͺ ν΄λμ€λ₯Ό μ μΈνκ³ , κ·Έ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ λμμ νλ€. λ°λΌμ μ΅λͺ κ°μ²΄λ ν΄λμ€ μ΄λ¦μ΄ μμΌλ©° λΆλͺ¨ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€.
3.1 μ΅λͺ μμ κ°μ²΄
μΌλ°μ μΌλ‘ νΉμ ν΄λμ€μ μμ κ°μ²΄λ₯Ό μμ±ν λ λ€μκ³Ό κ°μ΄ νλ€. λ¨Όμ λΆλͺ¨ ν΄λμ€μ κ·Έκ²μ μμν μμ ν΄λμ€λ₯Ό μ μΈνλ€.
class Parent{
Parent(){
System.out.println("Parent Constructor");
}
}
class Child extends Parent{
Child(){
System.out.println("Child Constructor");
}
}
κ·Έλ¦¬κ³ λ€μκ³Ό κ°μ΄ μμ κ°μ²΄λ₯Ό μμ±νλ€.
Parent a=new Child();
νμ§λ§ μμ ν΄λμ€κ° μ¬μ¬μ©λμ§ μκ³ νΉμ μμΉμμ ν λ²λ§ μ¬μ©λλ κ²½μ°μλ κ°λ¨ν μ΅λͺ κ°μ²΄λ₯Ό μ¬μ©ν μ μλ€. λ€μκ³Ό κ°μ΄ μ΅λͺ κ°μ²΄λ₯Ό μμ±νλ€.
class Parent{
Parent(){
System.out.println("Parent Constructor");
}
void method(){
System.out.println("Parent method");
}
}
// μ΅λͺ
κ°μ²΄λ₯Ό μ μΈν΄ μ¬μ©νλ λΆλΆ
Parent a=new Parent(){
@Override
void method(){
System.out.println("Child method");
}
};
a.method();
λ³΄ν΅ μ΅λͺ κ°μ²΄ λ΄μμλ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μνλ€. κ·Έλ¦¬κ³ μ΅λͺ κ°μ²΄ λ΄μμλ μμ±μλ₯Ό μ μΈν μ μλ€. μ΅λͺ κ°μ²΄ μμ±μ λ£μ μΈμκ° λΆλͺ¨ ν΄λμ€ μμ±μμ λ£μ΄μ Έμ λΆλͺ¨ ν΄λμ€ μμ±μκ° νΈμΆλ λΏμ΄λ€.
μ΄λ° μ΅λͺ κ°μ²΄λ λ‘컬 λ³μλ₯Ό μ μΈν λμ μ΄κΈ°κ°, λ©μλμ μΈμλ‘ λκ²¨μ€ λ, λ©μλμ 리ν΄κ°μΌλ‘ μ¬μ©ν λ λ± μ¬λ§ν κ³³μ λͺ¨λ μ¬μ©ν μ μλ€.
μ΄λ μ£Όμν μ μ μ΅λͺ κ°μ²΄λ λΆλͺ¨ ν΄λμ€ νμ λ³μμ λμ λκΈ° λλ¬Έμ μ΅λͺ κ°μ²΄μ μλ‘κ² μ μλ νλ, λ©μλλ μ΅λͺ κ°μ²΄ μΈλΆμμ μ κ·Όν μ μλ€. μλλΌλ©΄ λΆλͺ¨ ν΄λμ€ νμ λ³μλ₯Ό μμ ν΄λμ€ νμ μΌλ‘ νλ³ννλ λ°©μμΌλ‘ μ¬μ©ν μλ μκ² μ§λ§ μ΅λͺ κ°μ²΄λ μ΄λ¦μ΄ μκΈ° λλ¬Έμ μμ ν΄λμ€ νμ λ³νλ λΆκ°λ₯νλ€.
Parent a=new Parent(){
@Override
void method(){
System.out.println("Child method");
}
// λΆλͺ¨ ν΄λμ€μ μλ λ©μλ
void method2(){
System.out.println("Child method, second");
}
};
a.method();
a.method2(); //μλ¬. μ΅λͺ
κ°μ²΄μ μλ‘ μ μλ λ©μλλ₯Ό μΈλΆμμ νΈμΆν μ μλ€.
3.2 μ΅λͺ ꡬν κ°μ²΄
μΈν°νμ΄μ€ νμ μ ꡬν κ°μ²΄λ₯Ό μμ±ν λλ μΌλ°μ μΌλ‘ μΈν°νμ΄μ€ μ μΈ -> μΈν°νμ΄μ€μ ꡬν ν΄λμ€ μ μΈ -> ꡬν κ°μ²΄ μμ±μ κ³Όμ μ κ±°μΉλ€. νμ§λ§ μ΄ κ³Όμ μ μλ΅νκ³ μΈν°νμ΄μ€λ₯Ό ꡬνν μ΅λͺ ꡬν κ°μ²΄λ₯Ό μμ±ν μλ μλ€.
μμλ‘ Person μΈν°νμ΄μ€λ₯Ό μ μΈνκ³ κ·Έ μ΅λͺ ꡬν κ°μ²΄λ₯Ό λ§λ€μ΄ 보μλ€. μ΄λ μ΅λͺ ꡬν κ°μ²΄λ μΈν°νμ΄μ€μ μ μΈλ λͺ¨λ μΆμ λ©μλλ₯Ό ꡬνν΄μΌ νλ€.
interface Person{
public void setName(String name);
public String getName();
}
// μ΅λͺ
ꡬν κ°μ²΄ μ μΈκ³Ό μ¬μ©
Person me=new Person(){
String name;
@Override
public void setName(String name){
this.name=name;
}
@Override
public String getName(){
return name;
}
};
me.setName("witch");
System.out.println(me.getName());
μ΄λ° λ°©μμΌλ‘ μ΅λͺ κ°μ²΄λ₯Ό νλ μ μΈ, λ‘컬 λ³μ μ μΈ, λ©μλμ μΈμλ‘ λ겨주기, λ©μλμ 리ν΄κ°μΌλ‘ μ¬μ©ν μ μλ€. μ΅λͺ ꡬν κ°μ²΄λ λ©μλ μΈμλ‘ λ€μ΄κ° μ μλ€!
3.3 μ΅λͺ κ°μ²΄μμ λ‘컬 λ³μ μ¬μ©
μ΅λͺ κ°μ²΄λ λ©μλ μ€νμ΄ μ’ λ£λλ©΄ λ³΄ν΅ μμ΄μ§λ€. νμ§λ§ μ΅λͺ μ€λ λ κ°μ²΄λ₯Ό μ¬μ©ν λλ μ΅λͺ κ°μ²΄κ° λ©μλ μ€νμ΄ μ’ λ£λμ΄λ κ³μ μ΄μμλ€.
μ΄λ λ©μλμ λ§€κ° λ³μλ λ‘컬 λ³μλ₯Ό μ΄λ¬ν μ΅λͺ κ°μ²΄ λ΄μμ μ¬μ©νλ©΄ λ¬Έμ κ° λ°μνλ€. λ§€κ°λ³μ, λ‘컬 λ³μλ λ©μλ μ€νμ΄ λλλ©΄ λ©λͺ¨λ¦¬μμ μ¬λΌμ§κΈ° λλ¬Έμ λ©μλκ° λλλ μ΅λͺ κ°μ²΄κ° μ΄μμλ κ²½μ° μ΄ λ³μλ€μ μ¬μ©ν μ μμ΄μ§λ€.
μλ°λ λ°λΌμ μ»΄νμΌμ μ΅λͺ κ°μ²΄μμ μ°λ λ§€κ° λ³μ, λ‘컬 λ³μλ₯Ό μ΅λͺ κ°μ²΄μ 볡μ¬ν΄λκ³ μ¬μ©νλ€. κ·Έλ¦¬κ³ λ§€κ° λ³μ, λ‘컬 λ³μκ° μμ λλ©΄ μ΅λͺ κ°μ²΄μ κ°κ³Ό μΌκ΄μ±μ΄ μ¬λΌμ§λ―λ‘ λ§€κ°λ³μ, λ‘컬 λ³μλ₯Ό finalλ‘ μ μΈνλλ‘ κ°μ νλ€. λ§μ½ κ·Έλ κ² νμ§ μμΌλ©΄ java8λΆν°λ finalμ μλμΌλ‘ λΆμ¬ μ€λ€.
λ€μκ³Ό κ°μ μ½λλ λ§€κ°λ³μλ λ‘컬 λ³μλ₯Ό λ³κ²½νμ§ μμΌλ―λ‘ μ μμ μΌλ‘ μλνλ€.
//μΈν°νμ΄μ€
interface Calculate{
public int sum_args();
public int sum_locals();
}
class Anonymous{
public void method(int arg1, int arg2){
int b1=3;
int b2=4;
// μ΅λͺ
ꡬν κ°μ²΄ μ¬μ©
Calculate calc=new Calculate() {
@Override
public int sum_args() {
return arg1+arg2;
}
@Override
public int sum_locals() {
return b1+b2;
}
};
// λ§€κ°λ³μ ν©
System.out.println(calc.sum_args());
// λ‘컬 λ³μ ν©
System.out.println(calc.sum_locals());
}
}
νμ§λ§ μ΅λͺ κ°μ²΄μμ μ¬μ©νλ λ‘컬 λ³μλ₯Ό λ³κ²½νλ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ€.
class Anonymous{
public void method(int arg1, int arg2){
int b1=3;
int b2=4;
/* μ΅λͺ
κ°μ²΄μμ μ¬μ©νλ λ§€κ°λ³μ νΉμ λ‘컬 λ³μλ₯Ό λ³κ²½νλ μλλ λͺ¨λ μλ¬ λ°μ
μλμΌλ‘ finalλ‘ μ·¨κΈλλ κ²λ€μ΄κΈ° λλ¬Έ
arg1=10;
arg2=20;
b1=30;
b2=40;
*/
Calculate calc=new Calculate() {
@Override
public int sum_args() {
return arg1+arg2;
}
@Override
public int sum_locals() {
return b1+b2;
}
};
// λ§€κ°λ³μ ν©
System.out.println(calc.sum_args());
// λ‘컬 λ³μ ν©
System.out.println(calc.sum_locals());
}
}
μ°Έκ³
μΈμ€ν΄μ€ λ©€λ² ν΄λμ€μ μ μ λ©€λ² λ³μκ° μμ μ μλ μ΄μ https://stackoverflow.com/questions/1953530/why-does-java-prohibit-static-fields-in-inner-classes