04. Nested Class, Nested Interface

2020. 1. 19. 01:56CSE/JAVA

* 중첩 클래스(Nested Class)

: 클래스 내부에 선언한 클래스 

=> 코드의 복잡성을 줄일 수 있음

=> But, 코드가 장황해질 수 있고, 가독성이 떨어질 수 있음

 

* 인스턴스 멤버 클래스

: 인스턴스 필드와 메소드만 선언 가능

  정적 필드와 메소드는 선언 불가능

  바깥 클래스 외부에서 인스턴스 멤버 클래스의 객체를 생성하기 위해서는 먼저 바깥 클래스 객체를 생성하고 인스턴스 멤버 클래스의 객체를 생성해야 함

 

+ 인스턴스 멤버 클래스의 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근 가능

class Out{
	class In{						//인스턴스 멤버 클래스
    	In(){...}					//생성자
        int field;					//인스턴스 필드
        void method(){...}			//인스턴스 메소드
    }
}

public class Main{
	public static void main(String[] args){
    	Out out = new Out();		//외부 클래스 객체 생성
        Out.In in = out.new In();	//인스턴스 멤버 클래스 객체 생성
        in.field = 3;
        in.method();
   	}
}

 

* 정적 멤버 클래스

: static 키워드로 선언된 클래스

 모든 종류의 필드와 메소드를 선언할 수 있음

 정적 멤버 클래스의 객체를 생성하기 위해서는 외부 클래스 객체를 생성할 필요 없음

 

+ 정적 클래스의 안에서는 바깥 클래스의 정적 필드와 정적 메소드만 접근할 수 있음

class Out{
	static class In{					//정적 멤버 클래스
    	In(){...};						//생성자
        int field1;						//인스턴스 필드
        static int field2;				//인스턴스 메소드
        void method1(){...}				//정적 필드
        static void method2(){...}		//정적 메소드
  	}
}

public class Main{
	public static void main(String[] args){
    	Out.In in = new Out.In();		//정적 멤버 클래스 객체 생성
        in.field1 = 3;
        in.method1();
        in.field2 = 3;
        in.method2();
  	}
}    

 

* 로컬 클래스

: 메소드 내에 선언한 중첩 클래스

  접근제한자를 붙일 수 없음

  인스턴스 필드와 메소드만 선언 가능, 정적 필드와 메소드는 선언 불가

 

+ 로컬 클래스에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다

class Out{
	void method(){
    	class In{					//로컬 클래스
        	In(){...}				//생성자
            int field;				//인스턴스 필드
            void method(){...}		//인스턴스 메소드
       	}
    	
        In in = new In();			//로컬 클래스 객체 생성
        in.field = 3;
        in.method();
  	}
}      

 

* 중첩 클래스에서 바깥 클래스 참조하기

public class Out{
	String field = "Out Class's field");
    void method(){
    	System.out.println("Out Class's method");
   	}
    
    class In{
    	Out.this.field;				//바깥클래스.this.필드;
        Out.this.method();			//바깥클래스.this.메소드();
   	}
}    

 

 

* 중첩 인터페이스

class Out{
	interface Out{			//중첩 인터페이스
    	void method();
   	}
}    

'CSE > JAVA' 카테고리의 다른 글

06. Exception  (0) 2020.01.20
05. Anonymous Inner Class  (0) 2020.01.19
03. Annotation  (0) 2020.01.13
02. Singleton, Final  (0) 2020.01.12
01. Static  (0) 2020.01.08