λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
BackEnd🌱/Java

[Java] λ‚΄λΆ€ 클래슀(inner class) 와 읡λͺ… 클래슀(anonymous class)

by μ•ˆμ£Όν˜• 2022. 5. 18.

μ„œλ‘ 

λžŒλ‹€μ‹μ— λŒ€ν•΄μ„œ ν•™μŠ΅ν•˜λ‹€κ°€ 읡λͺ… κ°μ²΄λΌλŠ” μš©μ–΄κ°€ 자주 λ‚˜μ™”κ³ , 읡λͺ… 객체λ₯Ό ν•™μŠ΅ν•˜λ‹€ λ³΄λ‹ˆ μ΅œμ’…μ μœΌλ‘œ inner class에 λ„λ‹¬ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ 클래슀(inner class)λŠ” 사싀 클래슀 내에 μ„ μ–Έλœλ‹€λŠ” 점을 μ œμ™Έν•˜κ³ λŠ” 일반적인 ν΄λž˜μŠ€μ™€ λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄λΆ€ ν΄λž˜μŠ€μ—λŠ” μΈμŠ€ν„΄μŠ€ 클래슀, μŠ€νƒœν‹± 클래슀, 지역 클래슀, 읡λͺ… 클래슀의 μ’…λ₯˜λ‘œ λ‚˜λˆŒ 수 μžˆλŠ”λ° ν•œλ²ˆ μžμ„Έν•˜κ²Œ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

λͺ©μ°¨

1. λ‚΄λΆ€ ν΄λž˜μŠ€λž€?
2. λ‚΄λΆ€ 클래슀의 μ’…λ₯˜μ™€ νŠΉμ§•
3. λ‚΄λΆ€ 클래슀의 μ„ μ–Έ
4. λ‚΄λΆ€ 클래슀의 μ œμ–΄μ™€ μ ‘κ·Όμ„±
5. 읡λͺ… 클래슀(anonymous class)

 

1. λ‚΄λΆ€ ν΄λž˜μŠ€λž€?

λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 클래슀 내에 μ„ μ–Έλœ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. ν•œ 클래슀λ₯Ό λ‹€λ₯Έ 클래슀의 λ‚΄λΆ€ 클래슀둜 μ„ μ–Έν•˜λ©΄ 두 클래슀의 멀버듀 간에 μ„œλ‘œ μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€λŠ” μž₯점과 μ™ΈλΆ€μ—λŠ” λΆˆν•„μš”ν•œ 클래슀λ₯Ό 감좀으둜써 μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€λŠ” μž₯점을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ 클래슀의 μž₯점

  1. λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ μ™ΈλΆ€ 클래슀의 멀버듀을 μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.
  2. μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€(μΊ‘μŠν™”).

ν˜„μž¬ A와 B λ‘κ°œμ˜ 독립적인 클래슀λ₯Ό 가지고 μžˆλŠ” μ™Όμͺ½ 이미지λ₯Ό 였λ₯Έμͺ½κ³Ό 같이 λ°”κΎΈλ©΄ BλŠ” A의 λ‚΄λΆ€ 클래슀(inner class)κ°€ 되고 AλŠ” Bλ₯Ό 감싸고 μžˆλŠ” μ™ΈλΆ€ 클래슀(outer class)κ°€ λ©λ‹ˆλ‹€.

μ΄λ•Œ λ‚΄λΆ€ 클래슀인 BλŠ” μ™ΈλΆ€ 클래슀인 Aλ₯Ό μ œμ™Έν•˜κ³ λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 잘 μ‚¬μš©λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

 

2. λ‚΄λΆ€ 클래슀의 μ’…λ₯˜μ™€ νŠΉμ§•

λ‚΄λΆ€ 클래슀의 μ’…λ₯˜λŠ” λ³€μˆ˜μ˜ μ„ μ–Έ μœ„μΉ˜μ— λ”°λ₯Έ μ’…λ₯˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” 마치 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것과 같은 μœ„μΉ˜μ— μ„ μ–Έν•  수 있으며, λ³€μˆ˜μ˜ μ„ μ–Έ μœ„μΉ˜μ— 따라 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, 클래슀 λ³€μˆ˜(static λ³€μˆ˜), μ§€μ—­λ³€μˆ˜λ‘œ κ΅¬λΆ„λ˜λŠ” 것과 같이 λ‚΄λΆ€ ν΄λž˜μŠ€λ„ μ„ μ–Έ μœ„μΉ˜μ— 따라 λ‹€μŒκ³Ό 같이 κ΅¬λΆ„λ˜μ–΄μ§‘λ‹ˆλ‹€.

λ‚΄λΆ€ 클래슀 특 징
μΈμŠ€ν„΄μŠ€ 클래슀(instance class) μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έν•˜λ©°, μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ©€λ²„μ²˜λŸΌ 닀루어진닀.
주둜 μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ©€λ²„λ“€κ³Ό κ΄€λ ¨λœ μž‘μ—…μ— μ‚¬μš©λ  λͺ©μ μœΌλ‘œ μ„ μ–Έλœλ‹€.
μŠ€νƒœν‹± 클래슀(static class) μ™ΈλΆ€ 클래슀의 λ©€λ²„λ³€μˆ˜ μ„ μ–Έμœ„μΉ˜μ— μ„ μ–Έν•˜λ©°, μ™ΈλΆ€ 클래슀의 staticλ©€λ²„μ²˜λŸΌ 닀루어진닀.
주둜 μ™ΈλΆ€ 클래슀의 static멀버, 특히 staticλ©”μ„œλ“œμ—μ„œ μ‚¬μš©λ  λͺ©μ μœΌλ‘œ μ„ μ–Έλœλ‹€.
지역 클래슀(local class) μ™ΈλΆ€ 클래슀의 λ©”μ„œλ“œλ‚˜ μ΄ˆκΈ°ν™”λΈ”λŸ­ μ•ˆμ— μ„ μ–Έν•˜λ©°, μ„ μ–Έλœ μ˜μ—­ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ  수 μžˆλ‹€.
읡λͺ… 클래슀(anonymous class) 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜λŠ” μ΄λ¦„μ—†λŠ” 클래슀(일회용)

 

3. λ‚΄λΆ€ 클래슀의 μ„ μ–Έ

μœ„ 였λ₯Έμͺ½ μ½”λ“œμ—λŠ” μ™ΈλΆ€ 클래슀(Outer)에 3개의 μ„œλ‘œ λ‹€λ₯Έ μ’…λ₯˜μ˜ λ‚΄λΆ€ ν΄λž˜μŠ€κ°€ μ„ μ–Έλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ–‘μͺ½μ˜ μ½”λ“œλ₯Ό 비ꡐ해 보면 λ‚΄λΆ€ 클래슀의 μ„ μ–Έ μœ„μΉ˜κ°€ λ³€μˆ˜μ˜ μ„ μ–Έ μœ„μΉ˜μ™€ λ™μΌν•œ 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ³€μˆ˜κ°€ μ„ μ–Έλœ μœ„μΉ˜μ— 따라 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, 클래슀 λ³€μˆ˜(staticλ³€μˆ˜), μ§€μ—­λ³€μˆ˜λ‘œ λ‚˜λ‰˜λ“―μ΄ λ‚΄λΆ€ ν΄λž˜μŠ€λ„ 이와 λ§ˆμ°¬κ°€μ§€λ‘œ μ„ μ–Έλœ μœ„μΉ˜μ— 따라 λ‚˜λ‰©λ‹ˆλ‹€. 그리고, 각 λ‚΄λΆ€ 클래슀의 μ„ μ–Έ μœ„μΉ˜μ— 따라 같은 μ„ μ–Έ μœ„μΉ˜μ˜ λ³€μˆ˜μ™€ λ™μΌν•œ 유효 λ²”μœ„(scope)와 μ ‘κ·Όμ„±(accessibility)을 κ°–μŠ΅λ‹ˆλ‹€. 

 

4. λ‚΄λΆ€ 클래슀의 μ œμ–΄μžμ™€ μ ‘κ·Όμ„±

μœ„ μ½”λ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ 클래슀(instance class)와 μŠ€νƒœν‹± 클래슀(static inner)λŠ” μ™ΈλΆ€ 클래슀(Outer)의 멀버 λ³€μˆ˜(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€ 클래슀 λ³€μˆ˜)와 같은 μœ„μΉ˜μ— μ„ μ–Έλ˜λ©°, λ˜ν•œ 멀버 λ³€μˆ˜μ™€ 같은 μ„±μ§ˆμ„ κ°–μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ‚΄λΆ€ ν΄λž˜μŠ€κ°€ μ™ΈλΆ€ 클래슀의 멀버와 같이 κ°„μ£Όλ˜κ³ , μΈμŠ€ν„΄μŠ€ 멀버와 static멀버 κ°„μ˜ κ·œμΉ™μ΄ λ‚΄λΆ€ ν΄λž˜μŠ€μ—λ„ λ˜‘κ°™μ΄ μ μš©λ©λ‹ˆλ‹€.

그리고 λ‚΄λΆ€ ν΄λž˜μŠ€λ„ 클래슀이기 λ•Œλ¬Έμ— abstractλ‚˜ finalκ³Ό 같은 μ œμ–΄μžλ₯Ό μ‚¬μš©ν•  수 μžˆμ„ 뿐만 μ•„λ‹ˆλΌ, 멀버 λ³€μˆ˜λ“€μ²˜λŸΌ private, protected와 μ ‘κ·Όμ œμ–΄μžλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

예제 1)

class InnerEx1 { 
      class InstanceInner { 
            int iv = 100; 
//          static int cv = 100;            // μ—λŸ¬! staticλ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μ—†λ‹€. 
            final static int CONST = 100;   // final static은 μƒμˆ˜μ΄λ―€λ‘œ ν—ˆμš©ν•œλ‹€. 
      } 

      static class StaticInner { 
            int iv = 200; 
            static int cv = 200;       // static클래슀만 static멀버λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. 
      } 

      void myMethod() { 
            class LocalInner { 
                  int iv = 300; 
//                static int cv = 300;          // μ—λŸ¬! staticλ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μ—†λ‹€. 
                  final static int CONST = 300; // final static은 μƒμˆ˜μ΄λ―€λ‘œ ν—ˆμš© 
            } 
      } 

      public static void main(String args[]) { 
            System.out.println(InstanceInner.CONST); 	//100
            System.out.println(StaticInner.cv); 	//200
      } 
}

μœ„ μ½”λ“œλ₯Ό 보면 λ‚΄λΆ€ 클래슀 μ€‘μ—μ„œ μŠ€νƒœν‹± 클래슀(static inner)만 static 멀버λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ“œλ¬Έ κ²½μš°μ§€λ§Œ λ‚΄λΆ€ ν΄λž˜μŠ€μ— staticλ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ•Ό ν•œλ‹€λ©΄ μŠ€νƒœν‹± 클래슀(static class)둜 μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€λ§Œ finalκ³Ό static이 λ™μ‹œμ— 뢙은 μƒμˆ˜(constant)λŠ” λͺ¨λ“  λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ μ •μ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

예제 2)

class InnerEx2 {
	class InstanceInner {}
	static class StaticInner {}

	// μΈμŠ€ν„΄μŠ€λ©€λ²„ κ°„μ—λŠ” μ„œλ‘œ 직접 접근이 κ°€λŠ₯ν•˜λ‹€.
	InstanceInner iv = new InstanceInner();
	// static 멀버 κ°„μ—λŠ” μ„œλ‘œ 직접 접근이 κ°€λŠ₯ν•˜λ‹€.
	static StaticInner cv = new StaticInner();

	static void staticMethod() {
        // staticλ©€λ²„λŠ” μΈμŠ€ν„΄μŠ€λ©€λ²„μ— 직접 μ ‘κ·Όν•  수 μ—†λ‹€.
//		InstanceInner obj1 = new InstanceInner();	
		StaticInner obj2 = new StaticInner();

        //	ꡳ이 μ ‘κ·Όν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 객체λ₯Ό 생성해야 ν•œλ‹€.
        //	μΈμŠ€ν„΄μŠ€ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀λ₯Ό λ¨Όμ € μƒμ„±ν•΄μ•Όλ§Œ 생성할 수 μžˆλ‹€.
		InnerEx2 outer = new InnerEx2();
		InstanceInner obj1 = outer.new InstanceInner();
	}

	void instanceMethod() {
        // μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ©€λ²„μ™€ static멀버 λͺ¨λ‘ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€.
		InstanceInner obj1 = new InstanceInner();
		StaticInner obj2 = new StaticInner();
		// λ©”μ„œλ“œ 내에 μ§€μ—­μ μœΌλ‘œ μ„ μ–Έλœ λ‚΄λΆ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†λ‹€.
//		LocalInner lv = new LocalInner();
	}

	void myMethod() {
		class LocalInner {}
		LocalInner lv = new LocalInner();
	}
}

μœ„ μ½”λ“œλ₯Ό μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • μΈμŠ€ν„΄μŠ€ λ©€λ²„λŠ” 같은 ν΄λž˜μŠ€μ— μžˆλŠ” μΈμŠ€ν„΄μŠ€ 멀버와 static 멀버 λͺ¨λ‘ 직접 호좜이 κ°€λŠ₯ν•˜μ§€λ§Œ, static λ©€λ²„λŠ” μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό 직접 ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • λ˜ν•œ μΈμŠ€ν„΄μŠ€ ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό 객체 생성 없이 λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μŠ€νƒœν‹± ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό 객체생성 없이 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • λ§ˆμ°¬κ°€μ§€λ‘œ μΈμŠ€ν„΄μŠ€ ν΄λž˜μŠ€λŠ” μŠ€νƒœν‹± 클래슀의 멀버듀을 객체 생성 없이 μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μŠ€νƒœν‹± ν΄λž˜μŠ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 클래슀의 멀버듀을 객체생성 없이 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

예제 3)

class InnerEx3 {
	private int outerIv = 0;
	static int outerCv = 0;

	class InstanceInner {
		int iiv  = outerIv;  // μ™ΈλΆ€ 클래슀의 private멀버도 μ ‘κ·Όκ°€λŠ₯ν•˜λ‹€.
		int iiv2 = outerCv;
	}

	static class StaticInner {
// μŠ€νƒœν‹± ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€λ©€λ²„μ— μ ‘κ·Όν•  수 μ—†λ‹€.
//		int siv = outerIv;
		static int scv = outerCv;
	}

	void myMethod() {
		int lv = 0;
		final int LV = 0;  // JDK1.8λΆ€ν„° final μƒλž΅ κ°€λŠ₯
	
		class LocalInner {
			int liv = outerIv;
			int liv2 = outerCv;
//	μ™ΈλΆ€ 클래슀의 μ§€μ—­λ³€μˆ˜λŠ” final이 뢙은 λ³€μˆ˜(μƒμˆ˜)만 μ ‘κ·Όκ°€λŠ₯ν•˜λ‹€.
//			int liv3 = lv;	// μ—λŸ¬!!!(JDK1.8λΆ€ν„° μ—λŸ¬ μ•„λ‹˜)
			int liv4 = LV;	// OK
		}
	}
}

λ‚΄λΆ€ ν΄λž˜μŠ€μ—μ„œ μ™ΈλΆ€ 클래슀의 λ³€μˆ˜λ“€μ— λŒ€ν•œ 접근성을 보여 μ£ΌλŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. μΈμŠ€ν„΄μŠ€ 클래슀(instance class)λŠ” μ™ΈλΆ€ 클래슀(InnerEx3)의 μΈμŠ€ν„΄μŠ€ 멀버이기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ outerIv와 static λ³€μˆ˜ outerCvλ₯Ό λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹¬μ§€μ–΄λŠ” outerIv의 μ ‘κ·Ό μ œμ–΄μžκ°€ private일지라도 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

μŠ€νƒœν‹± 클래슀(static inner)λŠ” μ™ΈλΆ€ 클래슀(InnerEx3)의 static멀버이기 λ•Œλ¬Έμ— μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버인 outerIv와 instanceInnerλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 단지 static 멀버인 iouterCvλ§Œμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

지역 클래슀(LocalInner)λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ 멀버와 static 멀버λ₯Ό λͺ¨λ‘ μ‚¬μš©ν•  수 있으며, 지역 ν΄λž˜μŠ€κ°€ ν¬ν•¨λœ λ©”μ„œλ“œμ— μ •μ˜λœ μ§€μ—­λ³€μˆ˜λ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 단 final이 뢙은 지역 λ³€μˆ˜λ§Œ 접근이 κ°€λŠ₯ν•œλ°, κ·Έ μ΄μœ λŠ” λ©”μ„œλ“œκ°€ μˆ˜ν–‰μ„ λ§ˆμ³μ„œ μ§€μ—­λ³€μˆ˜κ°€ μ†Œλ©Έλœ μ‹œμ μ—λ„, 지역 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μ†Œλ©Έλœ μ§€μ—­λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ €λŠ” κ²½μš°κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

JDK1.8λΆ€ν„° 지역 ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Όν•˜λŠ” 지역 λ³€μˆ˜ μ•žμ— final을 μƒλž΅ν•  수 있게 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ final을 λΆ™μ—¬μ£Όλ©°, final이기 λ•Œλ¬Έμ— ν•΄λ‹Ή λ³€μˆ˜μ˜ 값이 λ°”λ€ŒλŠ” λ¬Έμž₯이 있으면 컴파일 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

5. 읡λͺ… 클래슀(anonymous class)

이제 μ € 처음 μ•Œκ³  μ‹Άμ—ˆλ˜ 읡λͺ… ν΄λž˜μŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

읡λͺ… ν΄λž˜μŠ€λŠ” νŠΉμ΄ν•˜κ²Œλ„ λ‹€λ₯Έ λ‚΄λΆ€ ν΄λž˜μŠ€λ“€κ³ΌλŠ” 달리 이름이 μ—†μŠ΅λ‹ˆλ‹€. 즉, 클래슀의 μ„ μ–Έκ³Ό 객체의 생성을 λ™μ‹œμ— ν•˜κΈ° λ•Œλ¬Έμ— 단 ν•œ 번만 μ‚¬μš©λ  수 있고 였직 단 ν•˜λ‚˜μ˜ κ°μ²΄λ§Œμ„ 생성할 수 μžˆλŠ” 일회용 ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

이름이 μ—†κΈ° λ•Œλ¬Έμ— μƒμ„±μžλ„ κ°€μ§ˆ 수 μ—†μœΌλ©°, 쑰상 클래슀의 μ΄λ¦„μ΄λ‚˜ κ΅¬ν˜„ν•˜κ³ μž ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ 이름을 μ‚¬μš©ν•΄μ„œ μ •μ˜ν•˜κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ 클래슀둜 μƒμ†λ°›λŠ” λ™μ‹œμ— μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ λ‘˜ μ΄μƒμ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 

μ˜€λ‘œμ§€ 단 ν•˜λ‚˜μ˜ 클래슀λ₯Ό μƒμ†λ°›κ±°λ‚˜ 단 ν•˜λ‚˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class InnerEx6 {
	Object iv = new Object(){ void method(){} };		// 읡λͺ…ν΄λž˜μŠ€
	static Object cv = new Object(){ void method(){} };	// 읡λͺ…ν΄λž˜μŠ€

	void myMethod() {
		Object lv = new Object(){ void method(){} };	// 읡λͺ…ν΄λž˜μŠ€
	}
}

μœ„μ˜ μ˜ˆμ œλŠ” λ‹¨μˆœνžˆ 읡λͺ… 클래슀의 μ‚¬μš© 예λ₯Ό 보여 μ€€ κ²ƒμž…λ‹ˆλ‹€. 이제 이 예제λ₯Ό μ»΄νŒŒμΌν•˜λ©΄ λ‹€μŒκ³Ό 같이 4개의 클래슀 파일이 μƒμ„±λ©λ‹ˆλ‹€.

읡λͺ… ν΄λž˜μŠ€λŠ” 이름이 μ—†κΈ° λ•Œλ¬Έμ— 'μ™ΈλΆ€ 클래슀λͺ…$숫자.class'의 ν˜•μ‹μœΌλ‘œ 클래슀 파일λͺ…이 κ²°μ •λ©λ‹ˆλ‹€.

 

class Child extends Parent {
}

ParentλΌλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ™€, 이λ₯Ό 상속받은 ChildλΌλŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

Parent field = new Child();

 

이λ₯Ό μœ„μ™€ 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ μžμ‹ ν΄λž˜μŠ€κ°€ μž¬μ‚¬μš©λ˜μ§€ μ•Šκ³ , μ˜€λ‘œμ§€ μ΄ˆκΈ°κ°’μœΌλ‘œλ§Œ μ‚¬μš©ν•˜λŠ” 경우 μ΅λͺ… μžμ‹ 객체λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 쒋은 λ°©λ²•μž…λ‹ˆλ‹€.

읡λͺ… μžμ‹ 객체 생성 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Parent field = new Parent() {
  int childField;
  void childMethod() {}

  @Override
  void parentMethod() {
    childField = 3;
    childMethod();
  }
}

즉, child 같은 μ™„μ „ν•œ 클래슀λ₯Ό μƒμ„±ν•˜λŠ” 것 λŒ€μ‹  처음 μ§€μ •ν•œ κ°’μœΌλ‘œλ§Œ μ‚¬μš©ν•  읡λͺ… 객체λ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. 

  • μ™ΈλΆ€μ—μ„œλŠ” 이 읡λͺ… 객체의 ν•„λ“œμ™€ λ©”μ„œλ“œμ— μ ‘κ·Όν•  수 μ—†λ‹€.
  • μœ„μ˜ 예제 μ½”λ“œμ˜ 경우, childMethod()λŠ” ν•΄λ‹Ή μžμ‹ 객체 λ‚΄λΆ€μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€.
  • parentMethod()λŠ” μ ‘κ·Ό κ°€λŠ₯ν•˜κ³  override ν•œ κ²°κ³Όκ°€ λ°˜μ˜λœλ‹€.
  • Parentκ°€ class일 μˆ˜λ„ Interface일 μˆ˜λ„ μžˆλ‹€.

λ§€κ°œλ³€μˆ˜λ‘œ λΆ€λͺ¨ 클래슀λ₯Ό λ°›μ•„μ˜€λŠ” κ²½μš°λ„ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class A {
  void method1(Parent p) {}

  void method2(int param){
    int var2 =3;
    
    //method1() 호좜
    method1(
      new Parent(){
        @Override
        void parentMethod() {}
      }
    )
  }
}

 

읡λͺ… 객체의 둜컬 λ³€μˆ˜ μ‚¬μš©

  • 읡λͺ… 객체 λ‚΄λΆ€μ—μ„œλŠ” μ™ΈλΆ€ 클래슀의 ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μ œν•œ 없이 μ‚¬μš©ν•  수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ λ©”μ„œλ“œμ˜ 맀개 λ³€μˆ˜(param)λ‚˜ 둜컬 λ³€μˆ˜(var2)λ₯Ό 읡λͺ… κ°μ²΄μ—μ„œ μ‚¬μš©ν•  λ•Œ λ¬Έμ œκ°€ 생길 수 μžˆλ‹€.
  • λ©”μ„œλ“œ λ‚΄μ—μ„œ μƒμ„±λœ 읡λͺ… κ°μ²΄λŠ” λ©”μ„œλ“œ 싀행이 λλ‚˜λ„ νž™ λ©”λͺ¨λ¦¬μ— μ‘΄μž¬ν•΄μ„œ 계속 μ‚¬μš©ν•  수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ 맀개 λ³€μˆ˜λ‚˜ 둜컬 λ³€μˆ˜λŠ” λ©”μ„œλ“œ 싀행이 λλ‚˜λ©΄ μŠ€νƒ λ©”λͺ¨λ¦¬μ—μ„œ 사라지기 λ•Œλ¬Έμ— 읡λͺ… κ°μ²΄μ—μ„œ μ‚¬μš©ν•  수 μ—†κ²Œ λ˜λ―€λ‘œ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.
  • μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ Java 8 μ΄ν›„λΆ€ν„°λŠ”, 읡λͺ… 객체 λ‚΄λΆ€μ—μ„œ λ©”μ„œλ“œ 맀개 λ³€μˆ˜λ‚˜ 둜컬 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  경우, μžλ™μœΌλ‘œ 이 λ³€μˆ˜λ“€μ€ final νŠΉμ„±μ„ κ°€μ§€κ²Œ λœλ‹€.

λŒ“κΈ€