티스토리 뷰

Goal 

 - 내부 클래스에 대해 알아본다

 - 내부 클래스를 코드로 구현해본다.

1. 내부 클래스란?

 - 클래스 내부에 구현한 클래스 (중첩된 클래스)

 - 클래스 내부에서 사용하기 위해 선언하고 구현하는 클래스

 - 주로 외부 클래스 생성자에서 내부 클래스를 생성

 

2. 내부 클래스 구현

2-1 인스턴스 내부 클래스 & 정적 내부 클래스

 - 클래스를 인스턴스 또는 static으로 사용하는 방식 

 

class OutClass{
    private int num = 10;
    private static int sNum = 20;
    private InClass inClass;
    
    public OutClass(){ 
        inClass = new InClass(); 
    }
    
    //인스턴스 내부 클래스 (보통 private로 선언한다)
    class InClass{
        int iNum = 100;
        
        void inTest() {
            System.out.println(num);
            System.out.println(sNum);
        }
        /* static int sInNum = 200;
         * 인스턴스 내부 클래스는 클래스 생성 이후에 class의 맴버를 사용할 수 있기 때문에
         * 언제나 사용 가능한 static 변수를 선언할 수 없다. 
         */       
         
    }
    
    public void usingInner() {
        InClass.inTest();
    }
    
    //정적 내부 클래스
    static class InstaticClass{
        int inNum = 100;
        static int sInNum = 200;
        
        void inTest() {
            System.out.println(inNum);
            System.out.println(sInNum);
            System.out.println(sNum);
        }
        
        static void sTest() {
//          System.out.println(inNum); static 메서드에서는 인스턴스 변수인 inNum은 사용할 수 없다.
            System.out.println(sInNum);
            System.out.println(sNum);
            
        }
    }
    
    
}

public class InnerTest {

    public static void main(String[] args) {
        
        //OutClass 생성과 동시에 inClass도 생성됨.
        OutClass outClass = new OutClass();
        outClass.usingInner();
        
        //InClass는 인스턴스 클래스이기 때문에 OutClass. 으로 불러와야 한다.
        //외부 클래스는 언제나 static이기 때문에 OutClass처럼 사용할 수 있다.
        OutClass.InClass myInClass = OutClass.new InClass();
        myInClass.inTest();
        
        System.out.println();
        
        OutClass.InstaticClass sInClass = new OutClass.InstaticClass();
        
        OutClass.InstaticClass.sTest();
        sInClass.inTest();
        
    
    
    }

}

2-2 지역 내부 클래스

 - 매서드 내부에 구현 

 - 지역 내부 클래스에 선언된 맴버변수는 지역 내부 클래스를 담는 메서드의 맴버변수에 비해 생명 주기가 길어, 메서드의 맴버변수가 상수화된다. 따라서 지역 내부 클래스 안에서는 외부 메서드의 맴버변수를 참조할 수 있지만 변경할 수는 없다. 

package innerclass;

class Outer {
    
    int outNum = 100;
    static int sNum = 200;
    
    Runnable getRunnable(int i) {
        
        int num = 100;
        //지역 내부 클래스
        class MyRunnable implements Runnable {

            
            public void run() {
                
//               num += 10; 상수(final)로 선언되기 때문에 참조는 할 수 있지만 변경은 할 수 없음
//               i = 200;
                
              System.out.println(i);
              System.out.println(num);
              System.out.println(outNum);
              System.out.println(Outer.sNum);
                
            }
            
        }
        
        return new MyRunnable();
    }
}

public class LocalInnerClassTest {

    public static void main(String[] args) {
        Outer outer = new Outer();
        Runnable runnable = outer.getRunnable(50);
        
        runnable.run();

    }

}

 

2-3 익명 내부 클래스

 - 안드로이드 위젯 기능구현에서 많이 사용하는 방식

 - 일반적으로 클래스를 선언할 때 작성하는 class코드나 클래스명이 없기 때문에, '익명' 클래스라고 불림.

 - 클래스의 정의 할때 인스턴스를 바로 생성하는 코드를 작성하기 때문에 static과 비슷한 작동방식으로 사용할 수 있음.

 

package innerclass;

class Outer2 {
    
    int outNum = 100;
    static int sNum = 200;
    
    Runnable getRunnable(int i) {
        
        int num = 100;
        //익명 이너 클래스
        return new Runnable(){

            
            public void run() {
                
//               num += 10; 상수(final)로 선언되기 때문에 참조는 할 수 있지만 변경은 할 수 없음
//               i = 200;
                
              System.out.println(i);
              System.out.println(num);
              System.out.println(outNum);
              System.out.println(Outer.sNum);
                
            }
            
        };
        
       
    }
    
    //익명 이너 클래스 2
    //인스턴스 생성과 정의를 같이함.
    Runnable runner = new Runnable() {
        
        @Override
        public void run() {
            System.out.println("test");
            
        }
    };
}

public class AnonymousInnerClassTest {

    public static void main(String[] args) {
        Outer2 outer = new Outer2();
        outer.runner.run(); //인스턴스지만 클래스 내부에서 생성되기 때문에 바로 사용할 수 있다.
        
        Runnable runnable = outer.getRunnable(50);
        
        runnable.run();
        
        

    }

}

'Java > Java 올인원 패키지' 카테고리의 다른 글

29. 스트림 (Java)  (0) 2020.03.23
28. 람다식 (Java)  (0) 2020.03.23
25. Set 인터페이스 (Java)  (0) 2020.03.19
24. List 인터페이스 (Java)  (0) 2020.03.19
23. 컬렉션 프레임워크 (Java)  (0) 2020.03.19
댓글