개발/java

익명클래스

캐리캐리 2022. 1. 1. 15:33

익명클래스는 이름 그대로 이름이 없는 클래스입니다. 

사용하는 이유에 대해서 알려드리자면 부모 클래스를 사용하는 자식이 1회성에 그치거나 혹은 너무 무분별한 자식이 생길 경우 

이를 익명 클래스를 이용해서 Override하여 사용할 수 있습니다. 

 

예를 들어보겠습니다.

이런 부모 클래스가 있습니다.

이 메서드를 재활용하기 위해서는 일반적으로는 Person을 상속받는 자식 클래스를 만들고 거기에 구현부를 Override해서 작성해야합니다. 

public class Person {
     public void whoAmI() {
        System.out.println("나는 사람이다.");
    }
}
public class Child extends Person {
    @Override
    public void whoAmI() {
        System.out.println("나는 자식이다");
    }
}

 

그러나 자식이 한명도 아니고 여러명이고 1회성에 그칠경우 이를 익명 클래스를 통해서 구현할 수 있습니다. 

@Test
void anonymousExample() {
   Person p = new Person() {
      String name="잘생긴";
      @Override
      public void whoAmI() {
         System.out.println("나는 "+name+" 자식입니다.");
      }
   };
   p.whoAmI();
}

그리고 이는 파라미터로도 전달할 수 있습니다. 

@Test
void anonymousExample() {
   walk(new Person() {
      String name="잘생긴";
      @Override
      public void whoAmI() {
         System.out.println("나는 "+name+" 자식입니다.");
      }
   });
   
}

void walk(Person person) {
   person.whoAmI();
   System.out.println("길을 걷고 있습니다");
}

 

또한 이는 인터페이스를 통해서도 가능합니다. 

public interface Order {
    public void Buy();

    public void Cancel();
}
@Test
void anomousInterface() {
   Order a = new Order() {
      String name = "카페";
      @Override
      public void Buy() {
         System.out.println(name+"에서 구매하였습니다.");
      }

      @Override
      public void Cancel() {
         System.out.println(name+"에서 취소하였습니다.");
      }
   };
   a.Buy();
}

 

그러나 익명클래스 내부에 생성죈 메서드나 필드는 익명 클래스 밖에서 접근할 수 없습니다. 

이유는 당연히 부모클래스의 인스턴스이므로 부모클래스에 있는 내용이 아니기 때문에 접근을 할 수 없습니다. 

@Test
void anonymousError() {
   Person a = new Person() {
      String name="잘생긴";

      public void error() {
         System.out.println("에러입니다.");
      }
   };
   a.error(); // 컴파일 에러 
}