Java 내부 클래스 (1)

Codren·2021년 6월 4일
0

내부 클래스

목록 보기
1/2

Section 1. 인스턴스 내부 클래스

1. 내부 클래스

클래스 내부에 선언된 클래스로 외부 클래스와 밀접한 연관이 있는 경우가 많음

  • 내부 클래스의 종류

    ① 인스턴스(instance) 내부 클래스
    ② 정적(static) 내부 클래스
    ③ 지역(local) 내부 클래스
    ④ 익명(anonymous) 내부 클래스




2. 인스턴스 내부 클래스

  • 내부적으로 사용할 클래스를 선언 (private으로 선언하는 것을 권장)
  • 외부 클래스가 생성된 후 생성됨 (인스턴스 멤버 변수와 같은 원리)
OutClass outClass = new OutClass();
OutClass.InClass inClass = outClass.new InClass();
  • private이 아닌 내부 클래스는 다른 외부 클래스에서 생성할 수 있음




3. 인스턴스 내부 클래스 구현

class OutClass {					##### 외부 클래스 ####
 
	private int num = 10;
	private static int sNum = 20;
	private InClass inClass;
	
	public OutClass(){
    
		inClass = new InClass(); 		# 내부 클래스 생성
	}
	
	class InClass{					##### 내부 클래스 ####
		
		int inNum = 100;
		//static int sInNum = 200;  		# 내부 클래스는 외부 클래스가 생성된 후에 
        						# 접근 가능하기 때문에 정적 변수를 갖을 수 없음 
	    	//static void sTest(){}			# 정적 메서드도 마찬가지
	    	void inTest(){
			System.out.println("OutClass num = " +num + "(외부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)");
			System.out.println("InClass inNum = " + inNum + "(내부 클래스의 인스턴스 변수)");
		}

	}
	
	public void usingClass(){
		inClass.inTest(); 			# 내부 클래스 변수를 사용하여 메서드 호출하기
	}
}
public class InnerTest {

	public static void main(String[] args) {
    
		OutClass outClass = new OutClass();	# 외부 클래스 인스턴스 생성
		outClass.usingClass();    		# 내부 클래스 기능 호출
	    
		OutClass.InClass inClass = outClass.new InClass();   # 외부 클래스 생성 후에 내부 클래스 생성
	
	}

}



Section 2. 정적 내부 클래스

1. 정적 내부 클래스

  • 외부 클래스 생성과 무관하게 사용할 수 있음
  • 정적 변수, 정적 메서드 사용 가능
  • 인스턴스 변수, 인스턴스 메서드 사용 불가능




2. 정적 내부 클래스 구현

class OutClass {				##### 외부 클래스 #####

	private int num = 10;
	private static int sNum = 20;
	private InClass inClass;
	
	public OutClass(){
    
		inClass = new InClass(); 
	}
	
	static class InStaticClass{		##### 정적 내부 클래스 #####
		
		int inNum = 100;
		static int sInNum = 200;
		
		void inTest(){   		# 정적 내부 클래스의 메서드
        
			//num += 10;    	# 외부 클래스의 인스턴스 변수는 사용할 수 없음
			System.out.println("InStaticClass inNum = " + inNum + "(내부 클래스의 인스턴스 변수 사용)"); 
			System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)");
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)");
		}
		
		static void sTest(){  		# 정적 내부 클래스의 static 메서드
			//num += 10;   		# 외부 클래스의 인스턴스 변수는 사용할 수 없음
			//inNum += 10; 		# 내부 클래스의 인스턴스 변수는 사용할 수 없음
			
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)");
			System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)");
			
		}
	}	
}
public class InnerTest {

	public static void main(String[] args) {
	   	
		# 외부 클래스 생성하지 않고 바로 정적 내부 클래스 생성
		OutClass.InStaticClass sInClass = new OutClass.InStaticClass(); 
		sInClass.inTest();
        
		# 정적 내부 클래스의 정적 메소드 사용
		OutClass.InStaticClass.sTest();
	}

}




3. 정적 내부 클래스에서의 변수 접근

  • 정적 내부 클래스의 일반 메서드와 정적 메서드에서의 변수 사용

0개의 댓글