Java์—์„œ์˜ Nested Class๋ฅผ ์•Œ์•„๋ณด๋ฉฐ, ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•ด ์™”์„์ง€ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์ž.

Nested Class

  • ํด๋ž˜์Šค ์•ˆ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค
  • Java์—์„œ๋Š” ๋‘˜๋กœ ๋‚˜๋‰œ๋‹ค.
    • Inner Class
      • non-static Nested Class
      • Local Class
      • Anonymous Class
    • static Nested Class

Inner Class

non-static Nested Class

public class OuterClass {
	...
    class InnerClass {
        ...
    }
}
 
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
  • InnerClass๋Š” static ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
  • InnerClass๋Š” OuterClass ์ธ์Šคํ„ด์Šค์™€ ํ•จ๊ป˜ OuterClass์˜ ๋‚ด๋ถ€์— ์กด์žฌํ•œ๋‹ค.
  • OuterClass์˜ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋ฉด์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—๋Š” ์ ‘๊ทผ ๋ถˆ๊ฐ€ == ๊ฐ•ํ•œ ์บก์Šํ™”
    • ์•”๋ฌต์ ์œผ๋กœ OuterClass ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— InnerClass ์ƒ์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ์™ธ๋ถ€ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    • ์ฆ‰, ์ธ์Šคํ„ด์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.
    • ์˜์กด์„ฑ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์ด ์žˆ๋‹ค.
    • ์ƒ๋‹นํžˆ ๊ดด๋ž„ํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.

Local Class

public class LocalClassExample {
 
    public void methodExample() {
 
        class LocalClass {
            public static final int MAX = 10;
            public static final String F = "female";
        }
    }
}
  • Block์— ์ •์˜๋œ ํด๋ž˜์Šค
    • Block: ์—ฌ๋Ÿฌ statements๋ฅผ ๊ฐ์‚ฌ๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ์ค‘๊ด„ํ˜ธ ์Œ
    • ex) method, for, if
  • LocalClass๋Š” static ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
    • final static์€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ž์‹ ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” block์˜ ๋ชจ๋“  block์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ฆ‰, method, LocalClassExample ๋“ฑ
    • ํ•˜์ง€๋งŒ non-static์œผ๋กœ ์ƒ์œ„ class๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์„ ๊ฒฝ์šฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

Anonymous Class```java

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { โ€ฆ } }


- ์ด๋ฆ„์ด ์—†๋Š” ์ง€์—ญ ํด๋ž˜์Šค์™€ ๊ฐ™๋‹ค.
- Swift์˜ Closure์™€ ๋น„์Šทํ•˜๊ฒŒ, ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.
- ์œ„์™€ ๊ฐ™์ด GUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ปดํฌ๋„ŒํŠธ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
- 

## static nested class

```java
class OuterClass {
    private final int age;

    static class StaticNestedClass {
        private final OuterClass outer;

        int getAge() {
            return this.age; // ๋ถˆ๊ฐ€๋Šฅ! - non-static ๊ฐ€๋Šฅ
            return this.outer.age; // ๊ฐ€๋Šฅ!
        }    
    }
}

OuterClass.InnerClass innerClass = new OuterClass.InnterClass();
  • static๊ณผ ํ•จ๊ป˜ ์„ ์–ธ๋œ๋‹ค.
  • static์ด๊ธฐ ๋•Œ๋ฌธ์— ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ static์˜ ์˜๋ฏธ๋Š” ์ •์  ๋ฉค๋ฒ„ ํ•จ์ˆ˜, ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ํ˜น์€ static class์˜ ์˜๋ฏธ๋„ ์•„๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ž๋™์ ์œผ๋กœ ์œ„ ๊ฐœ์ฒด์˜ reference๋ฅผ ๋ฐ›์ง€ ์•Š๊ฒ ๋‹ค์˜ ์˜๋ฏธ์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ๋กœ ์ƒ์œ„ ๊ฐœ์ฒด์˜ private ๋ณ€์ˆ˜์—๋Š” ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‚˜, ์ง์ ‘ ์ ‘๊ทผ์€ ์•ˆ๋œ๋‹ค.
  • ๋‹จ static ๋ณ€์ˆ˜๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.
  • static ์‚ฌ์šฉ ์•ˆํ–ˆ์„ ์‹œ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ์ž‘์—…์„ ํ•ด์คฌ๋˜ ๊ฒƒ์ด ์ „๋ถ€๋‹ค.
  • non-nested์™€ ๋‹ค๋ฅด๊ฒŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์„ฑ์‹œ ๋ฌธ๋ฒ•๋„ ํ›จ์”ฌ ๊น”๋”ํ•ด ์กŒ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ ์—์„œ Swift์™€ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์€ ์ด ํƒ€์ž…๋งŒ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

Nested Class์˜ ์šฉ๋„

  1. ์„œ๋กœ ์—ฐ๊ด€๋œ ํด๋ž˜์Šค๋“ค์„ ๊ทธ๋ฃน ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.
    • ํŒจํ‚ค์ง€๋„ ๊ฐ€๋Šฅํ•˜๊ธด ํ•˜๋‹ค.
    • ํ•˜์ง€๋งŒ ํด๋ž˜์Šค ์†์— ๋„ฃ๋Š” ๊ฒƒ์ด ๋” ๊ธด๋ฐ€ํ•จ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋‚ดํฌ ํด๋ž˜์Šค๋Š” ๋ฐ”๊นฅ ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋ฐ˜๋Œ€๋„ ๊ฐ€๋Šฅ

Reference