[내부 클래스의 4가지 형태]

hamonjamon·2022년 7월 31일
0
  • 내부 클래스란 클라스 안에 선언된 클래스이다.
  • 어느 위치에 선언하느냐에 따라 4가지 형태가 존재하다.

중첩 클래스, 인스턴스 클래스

  • 인스턴스 변수, 즉 필드를 선언하는 위치에 선언되는 경우, 보통 중첩 클래스 혹은 인스턴스 클래스라고 한다.
public class Main {
    // 클래스 안에 인스턴스 변수(필드)를 선언하는 위치에 선언된 경우
    // 중첩 클래스, 인스턴스 클래스
    class Cal {
        int value = 0;

        public void plus() {
            value++;
        }
    }

    public static void main(String[] args) {
        // 내부에 있는 Cal 객체를 생성하기 위해 밖에 Main 객체를 생성하고, 
        // Main.Cal cal = main.new Cal();와 같은 방법으로 Cal 객체를 생성한 뒤 사용한다.
        Main main = new Main();
        Main.Cal cal = main.new Cal();
        cal.plus();
        System.out.println(cal.value);
    }
}

static 클래스

  • 필드 선언 시 static 키워드를 사용하는 경우에 해당하며, 정적 중첩 클래스, static 클래스라고 한다.
public class Main {
    static class Cal {
        int value = 0;

        public void plus() {
            value++;
        }
    }

    public static void main(String[] args) {
        // 이 경우 Main 객체 생셩할 필요없이 Main.Cal()로 객체를 생성하여 사용한다.  
        Main.Cal cal = new Main.Cal();
        cal.plus();
        System.out.println(cal.value);
    }
}

지역 중첩 클래스, 지역 클래스

  • 메서드 내부에 클래스를 선언한 경우에 해당한다.
public class Main {
    public void exec() {
        class Cal {
            int value = 0;

            public void plus() {
                value++;
            }
        }
        // 메서드 내에서 해당 클래스를 생성하여 사용한다. 
        Cal cal = new Cal();
        cal.plus();
        System.out.println(cal.value);
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.exec();
    }
}

익명 클래스

  • 생성자 다음에 중괄호 열고 닫고가 나오면 해당 생성자 이름에 해당하는 클래스를 상속받는 이름없는 개체를 만든다는 것을 의미한다.

  • 익명 클래스를 만드는 이유는 Action을 상속받는 클래스를 만들 필요가 없는 경우이다.

public abstract class Action {
    public abstract void exec();
}
public class Main {
    public static void main(String[] args) {
        Action action = new Action() {
            // Action을 상속받은 클래스가 굳이 필요없을 때(한 번만 쓰고 마는 경우)
            // 이처럼 익명 클래스를 사용한다.

            // 해당 괄호 내, 메서드를 구현하거나 추가하여 구현한다.
            @Override
            public void exec() {
                System.out.println("exec 수행");
            }
        };
        action.exec();
    }
}

0개의 댓글