# [Java] λ‚΄λΆ€ 클래슀(Inner class)에 λŒ€ν•΄
Study Repository

[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λŠ” μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό λΆˆκ°€λŠ₯)

λ‚΄λΆ€ 클래슀 μ–Έμ œ μ‚¬μš©ν• κΉŒ?

  1. 두 ν΄λž˜μŠ€κ°€ κΈ΄λ°€ν•œ 관계에 μžˆμ„ λ•Œ 클래슀 내에 클래슀λ₯Ό μ„ μ–Έν•˜κ³€ ν•©λ‹ˆλ‹€. 
  2. ν•˜λ‚˜μ˜  클래슀 λ˜λŠ” λ©”μ†Œλ“œμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜κ³  싢을 λ•Œ λ‚΄λΆ€ 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

GUI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 이벀트 처리 μ™Έμ—λŠ” 잘 μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, μš°μ„  λ‚΄λΆ€ 클래슀의 μ‚¬μš©λ²•κ³Ό νŠΉμ§• μ •λ„λ§Œ κ°€λ³κ²Œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 


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

  1. μ ‘κ·Ό μ œμ–΄μžλ₯Ό νƒ€μ΄νŠΈν•˜κ²Œ μž‘μ•„λ„ 같은 νŒ¨ν‚€μ§€, 같은 클래슀 level에 있기 λ•Œλ¬Έμ— 두 클래슀의 멀버듀 κ°„ μ„œλ‘œ μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    1. 같은 νŒ¨ν‚€μ§€/ν΄λž˜μŠ€μ—μ„œ 읽을 수 μžˆμ–΄, μ‹œκ°μ μœΌλ‘œ 가독성이 λ†’κ³  μœ μ§€λ³΄μˆ˜μ— μžˆμ–΄μ„œλ„ 이점을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
  2. μ™ΈλΆ€μ μœΌλ‘œ λΆˆν•„μš”ν•œ 클래슀λ₯Ό 감좀으둜, μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. (μΊ‘μŠν™”, 은닉화)

 

내뢀에 μ •μ˜λœλ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄ 일반적인 ν΄λž˜μŠ€μ™€ λ‹€λ₯Έ 점은 μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ μ–΄λŠ ν΄λž˜μŠ€μ— λ³€μˆ˜λ‚˜ μƒμˆ˜κ°€ ν•„μš”ν•˜λ©΄ 클래슀 λ©€λ²„λ‘œμ„œ 클래슀 λ‚΄μ—μ„œ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•œ κ²ƒμ²˜λŸΌ, μ„ μ–Έ 주체λ₯Ό λ³€μˆ˜μ—μ„œ 클래슀둜 바꾼것이 λ‚΄λΆ€ 클래슀라고 λ³΄μ‹œλ©΄ λ©λ‹ˆλ‹€.

 


λ‚΄λΆ€ 클래슀 μ’…λ₯˜

클래슀의 멀버 λ³€μˆ˜λ„ μ„ μ–Έλ˜λŠ” μœ„μΉ˜, μ ‘κ·Ό μ œμ–΄μžμ— 따라 μ—­ν• κ³Ό 이름이 달라지듯이, λ‚΄λΆ€ ν΄λž˜μŠ€λ„ λ˜‘κ°™μŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ 클래슀 μ’…λ₯˜ νŠΉμ§•
λ‚΄λΆ€ μΈμŠ€ν„΄μŠ€ 클래슀 ( 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();
    }
}

> μœ„μ™€ 같이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 일회용으둜 μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯ν•©λ‹ˆλ‹€.


<참고 자료>

 

 

λ‚΄λΆ€ 클래슀 (Inner Class)

[ λ‚΄λΆ€ ν΄λž˜μŠ€λž€? ] 클래슀 λ˜λŠ” λ©”μ†Œλ“œ 내뢀에 μƒμ„±λœ 클래슀 λ‚΄λΆ€ 클래슀λ₯Ό ν¬ν•¨ν•œ 클래슀λ₯Ό μ™ΈλΆ€ 클래슀(Outer Class)라고 함 ν•˜λ‚˜μ˜ 클래슀 λ˜λŠ” λ©”μ†Œλ“œμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€κ°€ ν•„μš”ν•  λ•Œ 사

codevang.tistory.com

 

β˜• λ‚΄λΆ€ 클래슀(Inner Class) μž₯점 & μ’…λ₯˜ 총정리

λ‚΄λΆ€ 클래슀 (Inner Class) λ‚΄λΆ€ 클래슀(inner class)λž€ ν•˜λ‚˜μ˜ 클래슀 내뢀에 μ„ μ–Έλœ 또 λ‹€λ₯Έ 클래슀λ₯Ό μ˜λ―Έν•œλ‹€. 보톡 μ‚¬μš©μž 클래슀 μžλ£Œν˜•μ΄ ν•„μš”ν•˜λ©΄, 메인 클래슀 외뢀에 μ„ μ–Έν•˜κ±°λ‚˜, λ”°λ‘œ 독립적

inpa.tistory.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°