Jam's story

중첩 클래스 와 중첩 인터페이스 본문

자바

중첩 클래스 와 중첩 인터페이스

애플쩀 2022. 1. 27. 13:06

특정한 관계를 맺은 경우, 클래스 내부에 선언하는 것이다 

class ClassName{
	class NestedClassName{
    
    }
}
class ClassName{
	interface NestedClassName{
    
    }
}
클래스의 멤버로서 선언되는 중첩클래스 = 멤버클래스 ->객체가 사용중이면 언제든지 재사용 가능 
메소드 내부에서 선언되는 중첩 클래스= 로컬클래스 ->메소드가 실행될때만 사용할 수 있음 
-멤버클래스 
A$B.class  
A가 바깥 클래스, B가 멤버클래스 

-로컬클래스
A$1B.class 
A가 바깥 클래스, B가 로컬클래스 
인스턴스 멤버 클래스 

static 필드와 메소드는 선언할 수 없다 

class A{
   class B{
}}

A  a=new A();
A.B b=a.new B();
정적 멤버 클래스 

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

class A{
	static class C{
    	
    }
}
정적 멤버 클래스의 객체를 생성하기 위해서 , 바깥 클래스의 객체를 만들 필요가 없다. 

A.C c=new A.C();
c.field1=3;
A.C.method1();
로컬 클래스 

메소드 내부에 있는 중첩 클래스

접근제한자 (private, public. static )을 붙일 수 없다. 

로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언가능 

void method(){
class D{

}
D d=new D();
d.filed1=3;
d.method1();
}

로컬클래스는 메소드가 실행될때, 메소드 안에서 객체를 생성하고 사용한다.

 

인스턴스 멤버 클래스는 바깥클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체를 생성할 수 있으나 정적 필드의 초기값이나 정적 메소드에서는 객체를 생성할 수 없다.

반면, 정적 멤버클래스는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있다. 
package twoInterface;

public class A1 {
	B field11=new B();
	C field1=new C();
	
	void method1() {
		B var1=new B();
		C var2=new C();
	}
	static B field3= new B(); //붚가능 
	static C field4=new C();
	
	static void method2() {
    	B var1= new B(); //블가능 
		C var2=new C();
	}
	class B{}
	static class C{}
	}

 

정적 멤버클래스, 자기 내부에 선언하는거는 모든 필드와 메소드를 선언할 수 있지만
바깥클래스에 접근할때에는 정적 필드, 정적메소드에만 접근할 수 있다. 

선언은 다 가능하지만 접근! 할때는 정적 필드,메소드만 가능 

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

 

중첩클래스에서 바깥클래스 참조 얻기 
package twoInterface;

 class Outter {
	String field="Outter-field";
	 
	void method() {
		System.out.println("outter-method");
	}
	
	class Nested{
		String field1="nested-field";
		void method() {
			System.out.println("nested-method");
		}
		void print() {
			System.out.println(this.field1);
			this.method();
			System.out.println(Outter.this.field);
			Outter.this.method();
		}
	}
	
	public static void main(String args[]) {
		Outter outter=new Outter();
		Outter.Nested nested=outter.new Nested();
		nested.print();
		
	}
}
중첩 인터페이스 
package twoInterface;

public class Button {
	OnClickListener listener;
	
	void setOnClickListener(OnClickListener listener) {
		this.listener=listener;
	}
	void touch() {
		listener.onClick();
	}
	interface OnClickListener{
		void onClick();
	}
}

클래스 내부에 선언된 중첩 인터페이스를 구현한 객체만 받아야 한다고 하면 , 중첩 인터페이스릃 선언 

'자바' 카테고리의 다른 글

예외처리  (0) 2022.02.02
자바 구구단 3행 3열로 입력받아 출력 중복은 제외  (0) 2022.01.31
이것이자바다 8장 확인문제  (0) 2022.01.27
인터페이스 상속  (0) 2022.01.26
상속과 인터페이스의 다른점  (0) 2022.01.26
Comments