ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 익명클래스
    개발/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(); // 컴파일 에러 
    }

     

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

    map vs flatmap  (0) 2022.01.04
    익명클래스 실용편  (0) 2022.01.01
    stream vs parallelStream  (0) 2021.12.30
    초기화블록  (0) 2021.12.25
    Builder 패턴 활용기  (0) 2021.12.25

    댓글

Designed by Tistory.