중첩클래스 2
이전글
중첩클래스
안드로이드 프로그래밍을 하면서, 클래스 내부에 다른 클래스를 만드는 형태의 코드를 종종 짜게 되었다. 관련 레퍼런스나 다른 사람들이 작성한 코드를 복붙하는 수준으로만 했었는데, 문뜩
robinjoon98.tistory.com
이전 포스팅에서 중첩클래스의 종류와 특징, 그리고 중첩클래스의 접근제한에 대해 알아봤다. 이번 포스팅에서는 익명객페에 대해 다룬다.
익명객체
익명객체는 이름이 없는 객체를 말한다. 익명객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성이 가능하다. 인터페이스를 구현한 익명객체는 오로지 하나의 인터페이스만 구현할 수 있다.
1. 익명자식객체
익명자식객체란 클래스를 상속하여 만들어지는 익명객체를 말한다. 부모타입으로 선언된 필드에 자식타입을 대입하는 경우를 생각해보자.
class Parent{
void method(){
};
}
class Child extends Parent{ ... }
class A {
Parent parent = new Child();
void method(){
parent.method();
}
}
일반적으로 위와같은 형태의 코드가 작성될 것이다. 그런데, 자식클래스가 재사용되지 않는다면 익명객체를 구현하는 것이 좋다. 코드의 복잡성이 떨어지기 때문. 익명객체를 생성하는 방법은 아래와 같다.
부모클래스 [필드|변수] = new 부모클래스(매개값,...){
필드
메소드
};
class Parent{
void method(){
...
};
}
class A {
Parent parent = new parent(){
@Override
void method(){
` ...
child_method();
...
}
void child_method(){
` ...
}
};
void method(){
parent.method();
//parent.child_method(); (X)
}
}
익명객체를 작성할 때 중요한 것은, 결국 부모클래스 타입의 변수에 객체를 대입하는 실행문이므로 ;를 붙여야 한다.
또한, 익명객체에는 생성자를 작성할 수 없고, 부모클래스 타입에 자식객체를 대입한 것이기 때문에 객체 외부에선 부모클래스에 정의된 메소드와 필드만 사용가능하다.
2. 익명구현객체
익명구현객체란, 인터페이스를 구현하는 익명객체를 말한다. 사용이유와 생성방식은 익명자식객체와 비슷하다. 둘의 차이점은 상속과 구현의 차이 뿐이다. 익명구현객체는 인터페이스타입에 구현객체를 대입하는 것 이므로 당연히 인터페이스에 선언된 메소드들만 사용가능하다.
인터페이스 [필드|변수] = new 인터페이스(){
필드
메소드
};
3. 익명객체의 로컬변수 사용
익명객체 내부에서 바깥 클래스의 필드나 메소드의 사용에 추가적인 제약이 부여되지는 않는다. 그러나, 메소드 내부에서 생성된 익명객체는 메소드의 반환등으로 메소드 종료 이후에도 사라지지 않고 계속 사용될 수 있다. 따라서, 익명객체 내부에서 자신이 생성된 메소드의 매개변수나 로컬변수를 사용하면 문제가 발생한다. 이에 대한 해결책은 이전글의 로컬클래스때와 같다.
결론적으로, 메소드 내에서 생성된 익명객체 내에서 자신을 생성한 메소드의 로컬변수나 매개변수를 사용한다면 이 변수들은 (유사) final 변수여야만 한다.