경주란 빨리 달리는 사람들의 것이 아니라
       계속 뛰어가는 사람들의 것이다.
LinkTree🌲

Development/Java

[Java, 개념] 이너 클래스와 이너 인터페이스

컴공희 2022. 7. 26. 16:22

안녕하세요, 오늘은 이너 클래스와 이너 인터페이스에 대해서 알아보겠습니다. 

이너 클래스 (inner class)는 단어 그대로 클래스 내부에 포함되는 이너 클래스입니다. 

👉🏻이너 클래스
클래스 내부에 포함되는 이너 클래스 

👉🏻종류 
멤버 이너 클래스 
지역 이너 클래스

인스턴스 맴버 이너 클래스 

 

클래스에 멤버의 형태로 존재하는 클래스

클래스 맴버의 역할을 그대로 수행하기 때문에 겉 클래스 (아우터 클래스)의 모든 접근 지정자의 맴버 접근 가능 


인스턴스 이너 클래스 객체 생성

class A{ //아우터 클래스 
	class B{
    //이너 클래스
    }
}

A a = new A();
A.B b = a.new B();

 

위에서 클래스 맴버의 역할을 그대로 해서 아우터 클래스의 모든 멤버에 접근 가능하다고 했습니다. 

그렇다면 메서드 이름이 같다면 어떻게 접근할 수 있을까요? 

class A{
	void a(){
    	System.out.println("안녕");
    }
    
    Class B{
    		void a(){
            	System.out.println("안녕");
                }
            }
 }

이름이 같을 때 아우터 클래스(A)에 멤버(메서드 a)를 호출하기 위해서는 

A.this.a

를 통해서 호출할 수 있습니다. 

그저 a(); 를 한다면 자동으로 this 가 붙어서 이너 클래스에 a() 메서드가 호출됩니다! 


정적 멤버 이너 클래스

위에서 설명한 이너 클래스에서 static이 붙은 형태 

Static에 특성으로 객체를 생성하지 않아도 정적 멤버에 접근 가능하다 

Class A{
	static class B{}
    }
    
// A a = new A(); 필요 없어요!  
A.B b = new A.B();

 

지역 이너 클래스 

지역 이너 클래스는 지역 변수처럼 해당 영역에서만 생존한다는 특성이 있다. 즉, 호출될 때만 메모리에 올라간다. 

객체 생성 방법 

Class A {
	void abc() {
    	class B {}  //지역 이너 클래스
        B b = new B();  //객체 생성! 
     }
}

지역 이너 클래스에서 사용하는 지역변수들은 자동으로 Final로 선언된다는 특성을 가지고 있습니다! 

 

익명 이너 클래스 

👉🏻이름을 알 수 없는 이너 클래스 

저번 시간에도 배웠지만 익명 이너 클래스는 객체 생성과 동시에 직접 정의하여 사용합니다. 

interface C {
	public abstract void bcd();
}

Class A {

	C b = new C() {
    	public void bcd() {/*메서드 구현*/}
    };
 }

 

익명 이너 클래스를 활용한 인터페이스 타입의 입력 매개 변수 전달 

 

메서드에 매개 변수로 인터페이스 객체를 넘기는 방법은 4가지가 존재합니다.

<기본 조건>

interface A {
	public abstract void abc();
}

class B implements A {
	public void abc() { } 
}

C c = new C();
객체 생성하여 매개 변수 전달하는 방법
👉🏻첫 번째 
C c = new C();

A a1 = new B();
c.cde(a1);
👉🏻두 번째
c.cde(new B());
익명 이너 클래스를 사용해 매개 변수 전달하는 방법
👉🏻첫 번째 
A a = new A() {
         public void abc() { }
};
c.cde(a);

👉🏻두 번째
c.cde(new A() {
          public void abc() { } 
} ) ;

 


 

이너 인터페이스 (inner interface)

 

이너 클래스처럼 이너 인터페이스는 클래스 안에 있는 인터페이스입니다. 

이너 인터페이스의 특징은 무조건 정적 이너 인터페이스라는 것입니다! 

이너 인터페이스도 이너 클래스와 동일하게 객체를 생성할 수 있습니다. 

👉🏻첫 번째 방법 (객체 생성) 

Class C implements A.B {
	public void bcd() {}
}

C c = new C();
c.bcd();

👉🏻두 번째 방법 (익명 이너 사용)

A.B a = new A.B() {
	public void bcd() {}
};
a.bcd();

 


 

 

응용

이벤트 처리 기능 작성하기 

익명 이너 클래스를 활용한 인터페이스 타입의 입력 매개 변수 전달 4번째 방법이 사용되었습니다! 

이렇게 사용자 이벤트 처리 기능을 작성할 수 있습니다!