코딩하는 털보

OOP - 56 본문

IT Study/JAVA OOP

OOP - 56

이정인 2020. 12. 24. 11:25

객체 지향 프로그래밍

56. 내부 클래스

  • 내부 클래스란
    클래스 내부에 구현된 클래스 (중첩된 클래스)
    클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스
    주로 외부 클래스 생성자에서 내부 클래스를 생성

인스턴스 내부 클래스, 정적 내부 클래스

package innerclass;

class Outer {

    int outNum = 100;
    static int sNum =200;

    Runnable getRunnable(int i) { //Runnable 한 type의 객체를 반환하는 메서드

        int num = 100; //지역변수 i, num
        class MyRunnable implements Runnable { //지역 내부 클래스, 메서드 내에 구현되어 있음
            @Override
            public void run() {
                //num += 10; 메서드의 지역변수 변경할 수 없음.
                // i = 200;  지역 내부 클래스를 포함하는 메서드의 지역변수는 내부적으로 final이 된다..

                System.out.println(num);
                System.out.println(i);
                System.out.println(outNum);
                System.out.println(sNum);
            }
        }
        return new MyRunnable();
    }
}
public class LocalInnerClassTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Runnable runnable = outer.getRunnable(30);

        runnable.run(); //getRunnable 메서드는 이미 종료되어 지역변수는 없어져있다.
                        //지역 내부 클래스의 메서드(run)은 언제든지 호출될 수 있다.
                        //그렇기 때문에 지역 내부 클래스를 포함하는 메서드의 지역변수는 상수(final)가 된다.
    }
}

지역 내부 클래스

package innerclass;

class Outer {

    int outNum = 100;
    static int sNum =200;

    Runnable getRunnable(int i) { //Runnable 한 type의 객체를 반환하는 메서드

        int num = 100; //지역변수 i, num
        class MyRunnable implements Runnable { //지역 내부 클래스, 메서드 내에 구현되어 있음
            @Override
            public void run() {
                //num += 10; 메서드의 지역변수 변경할 수 없음.
                // i = 200;  지역 내부 클래스를 포함하는 메서드의 지역변수는 내부적으로 final이 된다..

                System.out.println(num);
                System.out.println(i);
                System.out.println(outNum);
                System.out.println(sNum);
            }
        }
        return new MyRunnable();
    }
}
public class LocalInnerClassTest {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Runnable runnable = outer.getRunnable(30);

        runnable.run(); //getRunnable 메서드는 이미 종료되어 지역변수는 없어져있다.
                        //지역 내부 클래스의 메서드(run)은 언제든지 호출될 수 있다.
                        //그렇기 때문에 지역 내부 클래스를 포함하는 메서드의 지역변수는 상수(final)가 된다.
    }
}

익명 내부 클래스(가장 많이 사용)

package innerclass;

class Outer2 {

    int outNum = 100;
    static int sNum =200;

    Runnable getRunnable(int i) { //Runnable 한 type의 객체를 반환하는 메서드

        int num = 100; //지역변수 i, num
        return new Runnable() { //익명 내부 클래스, 메서드 내부

            @Override
            public void run() {
                //num += 10; 메서드의 지역변수 변경할 수 없음.
                // i = 200;  지역 내부 클래스를 포함하는 메서드의 지역변수는 내부적으로 final이 된다..

                System.out.println(num);
                System.out.println(i);
                System.out.println(outNum);
                System.out.println(sNum);
            }
        }; //익명 내부 클래스 구현 끝 세미콜론
    }

    Runnable runner = new Runnable() {  //익명 내부 클래스2, 메서드 외부
                                        //하나의 인터페이스나 추상클래스에 대해서 상속 또는 구현하는 별개의 클래스를 생성하지 않아도 
                                        //바로 이름 없이 생성할 수 있다.
        @Override
        public void run() {
            System.out.println("test");
        }
    };
}

public class AnonymousInnerClassTest {
    public static void main(String[] args) {
        Outer2 outer = new Outer2();
        Runnable runnable = outer.getRunnable(30);

        runnable.run(); 
        outer.runner.run();
    }
}
Comments