ABOUT ME

Today
Yesterday
Total
  • 0. JAVA 기초 (7)
    JAVA Spring 2020. 3. 7. 22:31

    - 내부 클래스(Inner Class) : 클래스 안에 클래스

     

    - 컴파일 시, Class가 총 3개 생성된다. OutClass$InClass가 추가로 생성된다.

     

    - Instance/Static Inner Class

    package innerClass;
    
    class OutClass {
    	
    	private int num = 10;
    	private static int sNum = 20;
    	private InClass inClass;
    	
    	
    	public OutClass() {
    		inClass = new InClass();
    	}
    	// Instance Inner Class
    	
    	// 단, static 변수를 쓰고 싶으면 Static Inner Class를 만들어야한다.
    	// InnerClass의 Instance 생성 없이 쓸 수 있어야하기 때문이다.
    	
    	class InClass { 
    		int iNum = 100;
    		
    		void inTest() {
    			System.out.println(num);
    			System.out.println(sNum);
    		}
    	}
    	
    	public void usingInner() { // innerClass를 사용하기 위해 public 함수를 쓴다. 
    		inClass.inTest();
    	}
    	
    	
    	// Static Inner Class
    	
    	//static Inner Class 내에서는 static VAR/METHOD 생성이 가능  
    	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); // ERROR!!! static이므로 instance VAR 사용 불가. 
    			System.out.println(sInNum);
    			System.out.println(sNum);
    			
    		}
    	}
    	
    	
    	
    }
    
    public class InnerTest {
    	public static void main(String[] args) {
    		OutClass outClass = new OutClass();
    		outClass.usingInner(); // innerClass를 사용하기 위해 public 함수를 쓴다.
    		
    		// Inner Class의 직접 접
    		// OutClass instance를 생성한 후에 그것의 InClass로 할당해줘야 한다. 
    		OutClass.InClass myInClass = outClass.new InClass(); 
    		
    		
    		// Static Class 내의 METHOD 직접 접근 
    		OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
    		sInClass.inTest();
    		
    		// Static Class 내의 static METHOD 직접 접근
    		OutClass.InStaticClass.sTest();
    		
    		
    	}
    
    }
    

     

     

    - Local Inner Class

    package innerClass;
    
    class Outer {
    	
    	int outNum = 100;
    	static int sNum = 200;
    	
    	Runnable getRunnable(int i) { // Runnable METHOD
    		
    		int num = 100;
    		// 지역 내부 Class : 함수 안에 만들어진 Class 
    		class MyRunnable implements Runnable {
    			
    			@Override
    			public void run() {
    				
    				// 아래 num, i 등의 지역 변수들은 getRunnable()이 끝나면 사라진다.
    				// 그러나 MyRunnable Class 안에서 이 변수들이 존재하면,
    				// MyRunnable Class 만 따로 호출되었을 때 문제가 생긴다. 
    				// 따라서, num, i는 컴파일러가 자동적으로 final을 붙여 상수로 만들어준다.
    				// 따라서 지역 변수는 inner Class에서 변경이 불가하다. 
    				
    				// num += 10; 
    				// i = 200;
    				System.out.println(i);
    				System.out.println(num);
    				System.out.println(outNum);
    				System.out.println(Outer.sNum);
    				
    			}
    		}
    		return new MyRunnable(); // inner Class를 반환 
    	}
    }
    
    
    public class LocalInnerClassTest {
    
    	public static void main(String[] args) {
    		Outer outer = new Outer();
    		Runnable runnable = outer.getRunnable(50);
    		
    		runnable.run();
    
    	}
    
    }
    

     

    - Anonymous Inner Class

     

    package innerClass;
    
    
    
    package innerClass;
    
    class Outer {
    	
    	int outNum = 100;
    	static int sNum = 200;
    	
    	Runnable getRunnable(int i) { // Runnable METHOD
    		
    		int num = 100;
    		
            // 위의 Local Inner Class에서 어차피 MyRunnable Class는 한 번만 쓰일 것이므로
            // 아래처럼 바로 return한다. 
            
    		return new Runnable() { // Anonymous Inner Class 
    			
    			@Override
    			public void run() {
    
    				System.out.println(i);
    				System.out.println(num);
    				System.out.println(outNum);
    				System.out.println(Outer.sNum);
    				
    			}
    		};
    	}
    	
    	Runnable runner = new Runnable() { // 이렇게도 사용 가능 (1/2) 
    		
    		@Override
    		public void run() {
    			System.out.println("test");
    		}
    	};
    	
    }
    
    
    public class AnnoymousInnerClassTest {
    
    	public static void main(String[] args) {
    		Outer outer = new Outer();
    		Runnable runnable = outer.getRunnable(50);
    		
    		runnable.run();
            
            outer.runner.run(); // 이렇게도 사용 가능 (2/2) 
    
    	}
    
    }
    

     

     

     

    'JAVA Spring' 카테고리의 다른 글

    0. JAVA 기초 (9)  (0) 2020.03.08
    0. JAVA 기초 (8)  (0) 2020.03.07
    0. JAVA 기초 (6)  (0) 2020.03.07
    0. JAVA 기초 (5)  (0) 2020.03.07
    0. JAVA 기초 (4)  (0) 2020.03.06
Designed by Tistory.