관리 메뉴

너와 나의 스토리

[Java] 익명 객체(Anonymous Object) 본문

Programming Language/Java

[Java] 익명 객체(Anonymous Object)

노는게제일좋아! 2021. 4. 20. 22:23
반응형

익명(Anonymous) 객체

  • 익명 객체는 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.
  • Parent라는 부모 클래스와, 이를 상속받은 Child라는 자식 클래스가 있다고 하자.
class Child extends Parent {
}
  • 이를 다음과 같이 사용할 수 있다.
Parent field = new Child();
  • 이때 자식 클래스가 재사용되지 않고, 오로지 초기값으로만 사용하는 경우 익명 자식 객체를 생성해서 사용하는 것이 좋은 방법이다.
  • 익명 자식 객체 생성 방법:
Parent field = new Parent() {
  int childField;
  void childMethod() {}

  @Override
  void parentMethod() {
    childField = 3;
    childMethod();
  }
}
  • 즉, child같은 완전한 클래스를 생성하는 것 대신 처음 지정한 값으로만 사용할 익명 객체를 만드는 것이다.
  • 외부에서는 이 익명 객체의 필드와 메서드에 접근할 수 없다.
    • 위의 예제 코드의 경우, childMethod()는 해당 자식 객체 내부에서만 접근이 가능하다.
    • parentMethod()는 접근 가능하고 override한 결과가 반영된다.
  • Parent가 class일 수도 Interface일 수도 있다.
  • 매겨변수로 부모 클래스를 받아오는 경우도 다음과 같이 사용할 수 있다.
class A {
  void method1(Parent p) {}

  void method2(int param){
    int var2 =3;
    
    //method1() 호출
    method1(
      new Parent(){
        @Override
        void parentMethod() {}
      }
    )
  }
}

 

 

익명 객체의 로컬 변수 사용

  • 익명 객체 내부에서는 바깥 클래스의 필드나 메서드를 제한 없이 사용할 수 있다.
  • 하지만 메서드의 매개 변수(param)나 로컬 변수(var2)를 익명 객체에서 사용할 때 문제가 생길 수 있다.
  • 메서드 내에서 생성된 익명 객체는 메서드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있다.
  • 하지만 매개 변수나 로컬 변수는 메서드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 객체에서 사용할 수 없게 되므로 문제가 발생한다.
  • 이러한 문제를 해결하기 위해서 Java 8 이후부터는, 익명 객체 내부에서 메서드 매개 변수나 로컬 변수를 사용할 경우, 자동으로 이 변수들은 final 특성을 가지게 된다.
  • 중첩 클래스에서 발생한 문제 및 문제 해결법이 동일하다.

 

 

 

 

출처:

- [이것이 자바다]

반응형
Comments