Cute Running Puppy

Language/[Java] 자바 완전 정복

5주차_13.이너 클래스와 이너 인터페이스

R.silver 2022. 2. 24. 20:33
반응형

이너 클래스

1. 인스턴스 멤버 이너 클래스 

객체 내부에 멤버의 형태로 존재하는 클래스 

아우터 클래스의 모든 접근 지정자의 멤버에 접근 가능 

이너 클래스는 독집적으로 사용될 수 없고, 반드시 아우터 클래스를 사용해야 사용할 수 있다.

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

아우터 클래스의 객체 생성 -> 아우터 클래스의 객체 참조 변수를 이용 -> 객체 내부에 있는 이너 클래스의 생성자 호출

cf) 인스턴스 필드, 메서드를 사용하기 위해 클래스의 객체를 먼저 생성하는 것과 같은 원리 

 

인스턴스 멤버 이너 클래스의 객체 생성 방법

아우터_클래스 아우터_클래스_참조_변수 = new 아우터_클래스 ();
아우터_클래스.이너_클래스 이너_클래스_참조_변수 = 아우터_클래스_참조_변수.new 이너_클래스();

 

class A {
	class B {
    }
}

A a = new A();
A.B b = a.new B(); //주의 
//이너 클래스의 자료형은 A.B 이다 (B가 아니다)

 

아우터 클래스의 객체 참조하기 

아우터 클래스의 필드나 메서드와 동일한 이름을 이너 클래스 안에 정의할 때 이너 클래스의 내부에서는 이너 클래스의 필드나 메서드가 참조된다. (참조 객체명을 생략하며 this 키워드가 자동으로 추가되기 때문)

 

class A {
	...
    class B {
    ... 
    }
}

// 이너 클래스의 멤버 호출 또는 사용
System.out.println(a);

// 아우터 클래스의 멤버 호출 또는 사용
System.out.println(A.this.a);

 

2. 정적 멤버 이너 클래스

이너 클래스 앞에 static 키워드가 포함된 이너 클래스 

아우터 클래스의 정적 멤버에만 접근할 수 있다. 

정적 이너 클래스 객체 생성하기

정적 멤버 이너 클래스의 객체 생성 방법

아우터_클래스.이너_클래스 이너_클래스_참조_변수 = new 아우터_클래스.이너_클래스 ();

 

class A {
	static class B {
    ...
    }
}

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

 

3. 지역 이너 클래스 

클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스 

선언 이후 바로 객체를 생성하여 사용, 메서드가 호출될 때만 메모리로 로딩 

그러므로 지역 이너 클래스는 정적 클래스로 지정 불가 

지역 이너 클래스 객체 생성하기 

지역 변수를 사용할 때는 반드시 해당 지역 변수가 final로 선언되어야 한다. 

지역 이너 클래스의 객체 생성 방법

지역_이너_클래스 지역_이너_클래스_참조_변수 = new 지역_이너_클래스 ();

 

class A {
	void abc() {
    	class B {
        }
        B b = new B ();
    }
}

 

익명 이너 클래스 

익명 이너 클래스의 정의와 특징 

클래스의 중괄호 바로 아래 사용 -> 인스턴스 익명 이너 클래스

메서드 내부에서 사용 -> 자역 익명 이너 클래스 

(익명 이너 클래스는 이름을 알 수 없기에 정적 익명 이너 클래스는 존재할 수 없다)

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

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

 

C c = new C();

// 방법 1
// 생성자를 이용해 생성한 객체를 A 타입의 참조 변수에 저장 
// 입력 매개변수로 참조 변수를 넘겨주는 방식 
A a1 = new B();
c.cde(a1);

// 방법 2
// 입력 매개변수 위치에서 바로 객체를 생성하여 객체의 참좃값을 메서드로 전달
// 단순히 객체의 참조값만 전달할 때 사용 
c.cde(new B());

// 방법 3 
// 익명 이너 클래스를 사용해서 객체를 생성 후
// 객체를 참조하는 참조 변수 a를 cde() 메서드의 입력 매개변수로 전달
A a = new A() {
	public void abc() {
    ...
    }
};
c.ced(a);


// 방법 4
// 참조 변수를 대입하지 않고, 메서드 입력 매개변수 자리에 익명 이너 클래스 객체를 생성하여 전달
// 이벤트 처리에서 많이 사용 
c.cde(new A() {
	public void abc() {
    ...
    }
});

 

이너 인터페이스 

이너 인터페이스의 정의와 특징 

정적 이너 인터페이스만 존재할 수 있다 (static 제어자 생략하면 자동 추가)

이너 인터페이스 또한 자체적으로 객체를 생성할 수 없다. 

따라서 객체를 생성하기 위해서는 해당 인터페이스를 상속한 자식 클래스를 생성한 후 생성자를 이용해 객체를 생성하거나 익명 이너 클래스를 활용하여 객체를 생성해야 한다. 

객체의 타입을 아우터_클래스명.이너_인터페이스명 으로 사용해야 한다. 

 

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

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

 

// 이너 인터페이스의 2가지 객체 생성 방법

// 방법 1 - 자식 클래스 직접 생성
A.B ab = new C();
C c = new C();
c.bcd();

// 방법 2 - 익명 이너 클래스 생성
A.B b = new A.B() {
	public void bcd() {
    ...
    	}
	};
    b.bcd();
    }
}

 

 

반응형