안녕하세요, 오늘은 이너 클래스와 이너 인터페이스에 대해서 알아보겠습니다.
이너 클래스 (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번째 방법이 사용되었습니다!
이렇게 사용자 이벤트 처리 기능을 작성할 수 있습니다!
'Development > Java' 카테고리의 다른 글
[Library] 오렐리 COS 라이브러리 이미지 다중 업로드 (2) | 2024.05.04 |
---|---|
[Java, 환경] Mac JavaFx 설치법 (1) | 2022.09.21 |
[Java, 개념] 추상 클래스와 인터페이스 (0) | 2022.07.24 |
[Java, 개념] 부모 생성자가 먼저 생성되는 이유 (0) | 2022.07.22 |
[Java, 개념] 객체의 다운캐스팅 (1) | 2022.07.22 |