인터페이스 타입의 입력 매개변수로 익명 이너 클래스를 이용해 생성한 객체를 전달하는 방법을 알아볼 것이다.
인터페이스 A에는 추상메서드 abc(), 클래스 C에는 인터페이스 A 타입의 객체를 입력매개변수로 포함하고 있는 메서드 cde(A a)가 있다.
interface A {
public abstract void abc();
}
class C {
void cde(A a) {
a.abc();
}
}
클래스 C의 객체를 생성한 후 cde(A a)메서드를 호출하기 위해서는 입력 매개변수로 사용될 인터페이스 A타입의 객체를 생성해야한다.
그런데 A는 인터페이스 이므로 객체를 직접 생성할 수 없어 인터페이스 A를 구현(implements)한 자식 클래스의 객체가 전달되어야 한다.
인터페이스 A의 객체를 생성하고, 메서드의 입력 매개변수로 전달하는 방법은 4가지 형태로 분류할 수 있다.
먼저 첫번째 두번째 방법은 인터페이스 A의 자식클래스 B를 직접 정의할 때 방법이다.
class B implements A{
public void abc(){
// ...
}
}
상속을통해 자식클래스를 정의했다. 자식 클래스의 생성자를 호출함으로써 객체는 얼마든지 생성할 수 있다.
이때 생성한 객체를 메서드 입력매개변수로 전달하는 방식에 따라 다음 2가지 형태로 나타낼 수 있다.
C c = new C();
// 방법1
A a1 = new B();
c.cde(a1);
// 방법2
c.cde(new B());
방법1은 B() 생성자를 이용해 생성한 객체를 A타입의 참조변수에 저장하고 , 입력매개변수로 참조 변수를 넘겨주는 방식이다. a1(객체 참조 변수는) 객체의 참조값만을 전달하기 위해 사용한다.
객체의 참조값만 전달할 목적이면 참조변수를 쓰지않고 방법2처럼 입력매개변수 위치에서 객체를 생성하면 생성된 객체의 참조값이 메서드로 전달될 것이다.
자식클래스를 정의하지 않고 익명 이너클래스를 이용하여 메서드 입력매개변수로 객체를 전달하는 방법은 다음과 같다
C c = new C();
// 방법3
A a = new A(){
public void abc(){
// ...
}
};
c.cde(a);
// 방법4
c.cde(new A(){
public void abc(){
// ...
}
});
방법 3은 익명 이너 클래스를 사용해 객체를 생성하고, 객체를 참조하는 변수(a)를 cde()메서드의 입력매개변수로 전달했다.
방법4는 참조변수를 대입하지 않고, 메서드 입력매개변수 자리에서 곧바로 익명 이너 클래스 객체를 생성해 전달하는 방식이다.
클래스 정의 및 참조 변수명을 사용/미사용했을 때 입력매개변수 객체 전달
interface A{
public abstract void abc();
}
// 자식 클래스 직접 생성
class B implements A{
public void abc(){
System.out.println("입력 매개변수 전달");
}
}
class C{
void cde(A a){
a.abc();
}
}
public class MyClass1 {
public static void main(String[] args) {
C c = new C();
// 방법1. 클래스명(O) + 참조변수명(O)
A a = new B();
c.cde(a);
// 방법2. 클래스명(O) + 참조변수명(x)
c.cde(new B());
}
}
클래스 미정의 및 참조 변수명을 사용/미사용했을 때 입력매개변수 객체 전달
interface A{
public abstract void abc();
}
class C{
void cde(A a){
a.abc();
}
}
public class AnonymousClass_4 {
public static void main(String[] args) {
C c = new C();
// 방법3. 클래스명(X) + 참조 변수명(O)
A a = new A(){
public void abc(){
System.out.println("입력매개변수 전달");
}
};
c.cde(a);
//방법4. 클래스명(X) + 참조 변수명(X)
c.cde(new A(){
public void abc(){
System.out.println("입력매개변수 전달");
}
});
}
}
'Language > Java' 카테고리의 다른 글
[Java] 예외 처리 (0) | 2022.04.04 |
---|---|
[Java] 이너 인터페이스 (0) | 2022.04.03 |
[Java] 익명 클래스, 익명 이너 클래스 (0) | 2022.04.03 |
[Java] Interface(인터페이스) VS Abstract Class(추상 클래스) 차이점, 정리 (0) | 2022.04.03 |
[Java] 업캐스팅, 다운캐스팅 (0) | 2022.04.02 |