본문 바로가기
  • Coding & Book
학습단/JAVA 학습단

10. 혼공자 10일차(중첩 인터페이스 & 중첩 클래스)

by 루이3 2023. 7. 15.

10일차

중첩 클래스

  • 클래스 내부에 선언한 클래스를 말합니다.
  • 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할수 있습니다.
  • 코드의 복잡성을 줄일수 있습니다.
  • 클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고 합니다.

 

인스턴스 멤버 클래스

  • 인스턴스 멤버 클래스는 static 키워드 없이 중첩 선언된 클래스를 말합니다.
  • 정적필드와 메소드는 선언 할수 없습니다.
class B {
	B() { System.out.println("B 객체 생성"); }
	int field1;		
	void method1() { }
}

 

 

 

정적 멤버 클래스

  • static 키워드로 선언된 클래스를 말합니다.
  • 모든 종류의 필드와 메소드를 선언할수 있습니다.
static class C {
	C() {  System.out.println("C 객체 생성"); }
	int field1;
	static int field2;
	void method1() { }
	static void method2() { }
}

 

 

로컬 클래스

  • 생성자 또는 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 합니다.
  • 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할수 있습니다.
  • 메소드를 실행할때만 사용되고 메소드가 종료되면 없어집니다.
void method() {
	class D {
		D() {  System.out.println("D 객체 생성"); }
		int field1;
		void method1() { }
	}
	D d = new D();
	d.field1 = 3;
	d.method1();
}

 

 

예제


package sec09.exam01;

class A {	
	A() { 
		System.out.println("A 객체 생성"); 
	}
		
		
class B {
	B() { System.out.println("B 객체 생성"); }
	int field1;		
	void method1() { }
}
		
		
static class C {
	C() {  System.out.println("C 객체 생성"); }
	int field1;
	static int field2;
	void method1() { }
	static void method2() { }
}
		
void method() {
	class D {
		D() {  System.out.println("D 객체 생성"); }
		int field1;
		void method1() { }
	}
	D d = new D();
	d.field1 = 3;
	d.method1();
  }
}
package sec09.exam01;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		A.B b = a.new B();
		b.field1 = 3;
		b.method1();

		A.C c = new A.C();
		c.field1 = 3;
		c.method1();
		A.C.field2 = 3;
		A.C.method2();
		
		a.method();
	}

}

 

 

중첩 인터페이스

  • 클래스의 멤버로 선언된 인터페이스 입니다.
  • 하나의 인터페이스 내부에 다른 인터페이스를 정의 하는것을 말합니다.
  • 내부 인터페이스를 외부에 노출시키지 않고 논리적으로 관련된 인터페이스를 그룹화하는데 사용할수 있습니다.

 

 

예제


 

Button.java

package sec09.exam01;

public class Button {
	OnclickListener listener;
	
	void setOnclickListener(OnclickListener listener) {
		this.listener = listener;
	}
	
	void touch() {
		listener.onClick();
	}
	
	static interface OnclickListener {
		void onClick();
	}
}

CallListener.java

package sec09.exam01;

public class CallListener implements Button.OnclickListener {
	@Override
	public void onClick() {
		System.out.println("전화 거는 중");
	}
}

MessageListener.java

package sec09.exam01;

public class MessageListener implements Button.OnclickListener {
	@Override
	public void onClick() {
		System.out.println("메시지를 보냄");
	}
}

 

ButtonExample.java

package sec09.exam01;

public class ButtonExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Button btn = new Button();
		btn.setOnclickListener(new CallListener());
		btn.touch();
		btn.setOnclickListener(new MessageListener());
		btn.touch();
	}

}

 

 

익명 자식 객체

  • 익명 클래스를 사용하여 부모 클래스나 인터페이스를 상속받거나 구현하는 이름이 없는 자식 객체를 말합니다.
  • 익명 자식 객채에 새롭게 정의된 필드나 메소드는 익명 자식 객체 내부에서만 사용됩니다.
    (외부에서 접근이 안됩니다.)
  • 아래는 익명 자식 객체를 생성하여 사용하는 방법입니다.
부모 클래스 [필드|변수] = new 부모클래스(매개값, ..) {
    //필드
    //메소드
}

 

익명 구현 객체

  • 익명 클래스를 사용하여 인터페이스를 구현하는 이름이 없는 객체를 말합니다.
  • 구현 클래스가 재사용되지 않고 오로지 특정위치에서 사용하는경우에 익명구현 객체를 생성 하는것이 좋습니다.
인터페이스 [필드|변수] = new 인터페이스() {
    //인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    //필드
    //메소드
}

 

'학습단 > JAVA 학습단' 카테고리의 다른 글

11. 혼공자 11일차(예외)  (0) 2023.07.17
2주차 완료  (2) 2023.07.15
9. 혼공자 9일차(인터페이스)  (0) 2023.07.14
8. 혼공자 8일차(상속)  (0) 2023.07.13
7. 혼공자 7일차(메소드)  (0) 2023.07.11