Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

익명 내부 클래스 활용 본문

Java/다양한 기능

익명 내부 클래스 활용

Seung__ 2021. 10. 26. 23:43

1. 지역 내부 클래스


  • 지역 변수와 같이 메서드 내부에서 정의하여 사용하는 클래스
  • 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐
  • 메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로
  • 지역 내부 클래스에서 사용하는 외부 메서드의 지역 변수나 매개 변수는 final로 선언.
    • 매개변수(i), 지역변수(num)를 지역 내부 클래스 메서드에서 값을 변경하려면 오류가 발생한다.
    • 이는 메서드(getRunnerble)과 Local Inner Class의 생성 주기가 다르기 때문이다.
    • 쉽게말해 getRunnerble()종료 후 Local Inner Class의 메서드(run)가 호출 될 여지가 있다.
    • 매개변수(i), 지역변수(num)는 stack메모리에 올라가며, 메서드(getRunnerble) 종료 시 사라진다.
    • 따라서 getRunnerble()이 종료되면 Stack에 있던 i, num은 메모리에서 사라진다.
    • 이 때 Local Inner Class의 run()을 실행하는데, i와 num 을 변경하려고 하면 변경할 대상이 없다.
    • 따라서 Local Inner Class에서 metod의 매개변수, 지역변수를 변경할 수 없다.
    • 그러므로 지역 내부 클래스에서 사용하는 외부 메서드의 지역변수, 매개변수는 final로 선언해야 한다.
    • final로 선언하면 Stack이 아니라 상수메모리에 올라가며 메서드 종료 후에도 사라지지 않는다.
    • final로 선언 안하면 컴파일 시 final이 붙음 ㅋㅋㅋ
class Outer2{

    int outNum = 100;
    static int sNum = 200;

    Runnable getRunnerble(final int i){ // 매개변수 i는 stack메모리에 올라감.메서드 종료되면 사라짐.

        final int num = 10; //stack에 올라감. 메서드 종료되면 사라짐.

        //Local Inner Class
        class MyRunnable implements Runnable{

            int localNum = 10;

            @Override
            public void run() {
                //i = 50; 
                //num = 20; 
  
                System.out.println("i = "+ i);
                System.out.println("num = " + num);
                System.out.println("localNum = " + localNum);

                System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
                System.out.println("sNum = " + sNum + "(외부 클래스 static 변수)");

            }
        }


        return new MyRunnable();
    }
}

public class AnonymousInnerTest {

    public static void main(String[] args) {

    }
}

 

 

 

2. 익명 클래스


  • 흠.. 위 코드르 ㄹ보면 MyRunnerble()은 내부에서 한 번만 사용한다.
  • 굳이 이름이 있어야 하나???
  • 이름이 없는 클래스
  • 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환
  • 인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 새엇ㅇ하거나
  • 지역 내부 클래스의 메서드 내부에서 생성하여 반환할 수 있음.
  • widget의 이벤트 핸들러에 활요오딤.
  • 위 코드랑 무슨차이?
    • 위 코드에서는 MyRunnerble클래스를 만들고 Runnerble을 구현한 뒤 MyRunnerble을 return함.
    • 익명클래스는 바로 Runnerble을 생성&구현해 버린다. 즉 중간에 MyRunnerble 클래스가 없어짐.

class Outer2{

    int outNum = 100;
    static int sNum = 200;

    Runnable getRunnerble(int i){ // 매개변수 i는 stack메모리에 올라감.메서드 종료되면 사라짐.

        int num = 10; //stack에 올라감. 메서드 종료되면 사라짐.

        //익명 클래스 예시 1
        return new Runnable(){

            int localNum = 10;

            @Override
            public void run() {

                System.out.println("i = "+ i);
                System.out.println("num = " + num);
                System.out.println("localNum = " + localNum);

                System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
                System.out.println("sNum = " + sNum + "(외부 클래스 static 변수)");

            }
        }; //여기까지

    }

    //익명 클래스2
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("runnerble class 2");
        }
    }; //여기까지
}

public class AnonymousInnerTest {

    public static void main(String[] args) {

        Outer2 out = new Outer2();
        Runnable runnerble = out.getRunnerble(100);
        runnerble.run();

        out.runnable.run();
    }
}
i = 100
num = 10
localNum = 10
outNum = 100(외부 클래스 인스턴스 변수)
sNum = 200(외부 클래스 static 변수)
runnerble class 2

 

 

3. GitHub : 211026 Local Inner Class, AnonymousClass


 

GitHub - bsh6463/various_functions

Contribute to bsh6463/various_functions development by creating an account on GitHub.

github.com

 

'Java > 다양한 기능' 카테고리의 다른 글

객체지향 프로그래밍 vs 람다식 구현  (0) 2021.10.27
Stream  (0) 2021.10.27
함수형 인터페이스, 람다식 구현 및 사용  (0) 2021.10.27
람다식  (0) 2021.10.27
내부 클래스 정의, 유형  (0) 2021.10.26
Comments