혼자 κ³΅λΆ€ν•˜λŠ” μžλ°” 9단원 정리

2022-11-11
  • java
쑰회수 회

μžλ°” 쀑간고사가 끝났닀. κ·Έ λ’€μ—λŠ” μ‘μš© ν”„λ‘œκ·Έλž˜λ°μ„ 배우고 μžˆλ‹€. ν•˜μ§€λ§Œ β€˜ν˜Όμž κ³΅λΆ€ν•˜λŠ” μžλ°”β€™ μ±… λ‚΄μš©μ΄ 아직 λ‚¨μ•˜κΈ° λ•Œλ¬Έμ— 그것을 μ •λ¦¬ν•˜κ³  μžˆλ‹€. μ΄λ²ˆμ—λŠ” 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

Profile picture

κΉ€μ„±ν˜„(Kim Sung Hyun)

μ„œκ°•λŒ€ν•™κ΅μ—μ„œ 기계곡학과 컴퓨터곡학을 λ³΅μˆ˜μ „κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν”νžˆ `λ§ˆλ…€`λΌλŠ” λ‹‰λ„€μž„μ„ μ”λ‹ˆλ‹€. μ–΄λ–€ λŒ€λ‹¨ν•œ λœ»μ„ ν’ˆκ³  μ‚¬λŠ” μ‚¬λžŒμ€ μ•„λ‹™λ‹ˆλ‹€. κ·Έμ € 멋진 μ‚¬λžŒλ“€μ΄ λ‚΄λŠ” 빛을 따라가닀 λ³΄λ‹ˆ μ—¬κΈ°κΉŒμ§€ μ™”κ³ , μ•žμœΌλ‘œλ„ κ·Έλ ‡κ²Œ μ‚΄ 수 μžˆμ—ˆμœΌλ©΄ μ’‹κ² λ‹€κ³  μƒκ°ν•˜λŠ” μ‚¬λžŒμž…λ‹ˆλ‹€. 이곳에 μ°Ύμ•„μ˜€μ‹  당신과도 ν•¨κ»˜ν•  수 μžˆμ–΄ μ˜κ΄‘μž…λ‹ˆλ‹€.