개발/JAVA

[JAVA] 익명객체, 익명구현객체, 익명자식객체

mabb 2022. 5. 19. 10:36
반응형

 안녕하세요. 삶의 질을 높이고자 노력하는 영차영차입니다.
자바 기본기를 탄탄히 다지기 위한 공부 목적 포스팅입니다.
이것이자바다, HeadFirstJava 등의 교재와 구글링을 토대로 본인의 이해를 위해 작성하였으며
계속해서 살을 붙여나갈 계획입니다.
틀린 부분이 있을 경우 댓글 남겨주시면 감사하겠습니다.
---------------------------------------------------------------------------------------------------------

WHY
- 재사용하지 않을 경우 클래스를 만들기보다는 익명객체로 생성하는 것이 좋을 수 있다.
- 클래스-익명자식객체 , 인터페이스-익명구현객체

Anonymous

일반적인 방법.
1) 부모 클래스를 상속해서 자식 클래스를 선언한다.
2) new 연산자를 이용해서 자식 객체를 생성한 후 필드나 로컬 변수에 대입한다.

-> 재사용하지 않을 경우 익명객체를 만들어 사용하는 것이 좋다.

추상클래스나 인터페이스의 경우 직접 객체를 생성할 수가 없고 참조변수로만 사용하며 여기에 자식 또는 구현객체를 대입해서 사용하여야 함.

 

직접 객체를 만들 수 없는
추상클래스나 인터페이스에서 익명 객체를 사용할 수 있다.

public interface A{ }
public class B implements A{
    //@Override  
}

A a =  new B();  이렇게 해주는 것이 일반적.
그러나 B객체를 재사용하지 않을 경우에 B클래스를 만드는 것은 비효율적이다.

A a = new A();   // 컴파일 에러 발생. 인터페이스는 객체를 만들 수 없으니까.
여기서 바로 중괄호를 열어 객체를 만들어버림.

A a = new A(){   
// 인터페이스의 추상메소드 모두 @Override 해야함
};   // 세미콜론으로 마무리.

-> 원래는 인터페이스를 구현한 구현클래스에서 추상메소드들을 오버라이드해주고 이 클래스의 객체를 사용해야함.
다시 쓰지 않을 클래스를 만드는 것이 낭비인 것인가 봄. 

익명 객체를 필드나 로컬변수나 매개변수의 자리에 선언하는 경우

public class A{
    void method1(){}
}
public class B{
//필드
    A field = new A(){
        void method2( ){}
        @Override
        void method1(){}
     };

   method3(A a){}

-> 필드에 익명객체를 생성해버림. B클래스에서 A클래스를 extends 선언 하지 않았다는게 특이하게 느껴짐.


-> 익명 객체의 이용
public class Main{
    B b = new B();
    b.field.method1();

    b.method3(
//A타입 변수를 넣어야 하는 매개변수 자리에 익명객체를 선언할 수 있다

 new A(){
    void method4(){}
    @Override
    void method1(){}
}
};




 

 

 

반응형

'개발 > JAVA' 카테고리의 다른 글

[JAVA] 제네릭  (0) 2022.05.19
[JAVA] 예외처리  (0) 2022.05.19
[JAVA] 자바의 구조_ 상속 및 구현, 오버라이드  (0) 2022.05.19
[JAVA] @어노테이션  (0) 2022.05.19
[JAVA] Getter와 Setter  (0) 2022.05.19