본문 바로가기
Backend/Java

Java - 익명 클래스, 익명 객체

by 퐁고 2023. 2. 22.
반응형

익명 클래스 (Anonymous Class)

  • 내부 클래스의 일종 , 이름이 없는 클래스
  • 일시적으로 한 번만 사용되고 버려지는 객체
  • 자식이 될 클래스를 만들고 상속 후 객체 인스턴스 초기화 후 가능하다.
  • // 부모 클래스 class Animal { public String bark() { return "동물이 웁니다"; } } public class Main { public static void main(String[] args) { // 익명 클래스 : 클래스 정의와 객체화를 동시에. 일회성으로 사용 Animal dog = new Animal() { @Override public String bark() { return "개가 짖습니다"; } }; // 단 익명 클래스는 끝에 세미콜론을 반드시 붙여 주어야 한다. // 익명 클래스 객체 사용 dog.bark(); } }

유의점

  • 오버라이딩한 메소드만 사용가능하고, 새로 정의한 메소드는 외부에서 사용 불가하다.
    • new Aninal(){}을 통해 생성하는 인스턴스는 별도의 클래스가 아니라 Animal 클래스를 상속받는 익명 클래스기 때문에 부모 클래스 Animal에는 run()메소드가 선언되지 않아 사용하지 못한다. (다형성)
// 부모 클래스
class Animal {
    public String bark() {
        return "동물이 웁니다";
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Animal() {
            // @Override 메소드
            public String bark() {
                return "개가 짖습니다";
            }
            
            // 새로 정의한 메소드
            public String run() {
                return "달리기 ㄱㄱ싱";
            }
        };
        
        dog.bark();
        dog.run(); // ! Error - 외부에서 호출 불가능
    }
}

선언 방법 3가지

  1. 클래스 필드로 이용
    1. 특정 클래스 내부에서 여러 메소드에서 이용될 때 고려
    class Animal { ... }
    
    class Creature {
        // 필드에 익명자식 객체를 생성 하여 이용
        Animal dog = new Animal() {
            public String bark() {
                return "멍멍";
            }
        };
    
        public void method() {
            dog.bark();
        }
        
        public void method2() {
            dog.bark();
        }
    }
    
  2. 지역 변수로 이용
    1. 메소드에서 일회용으로 사용하고 버려질 클래스면 적당함
    class Animal { ... }
    
    class Creature {
    	// ...
        
        public void method() {
        	// 지역 변수같이 클래스를 선언하여 일회용으로 사용
            Animal dog = new Animal() {
                public String bark() {
                    return "멍멍";
                }
            };
            dog.bark();
        }
    }
    
  3. 메소드 아큐먼트로 이용
    1. 메소드 매개변수로 클래스 자료형이 이용된다 할 때 일회성으로만 사용한다면 아규먼트로 익명 객체 넘겨주면 된다.
    class Animal { ... }
    
    class Creature {
    	// ...
        
        public void method(Animal dog) { // 익명 객체 매개변수로 받아 사용
            dog.bark();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Creature monster = new Creature();
            
            // 메소드 아규먼트에 익명 클래스 자체를 입력값으로 할당
            monster.method(new Animal() {
                public String bark() {
                    return "멍멍";
                }
            });
        }
    }
    

인터페이스 익명 구현 객체

  • 사실 실무에서 멀쩡한 클래스 놔두고 익명 클래스 사용할 일은 거의 없다.
  • 하지만 인터페이스를 익명 객체로 선언하여 사용할 때는 많이 사용한다.
// 인터페이스
interface IAnimal {
    public String bark(); // 추상 메소드
    public String run();
}

public class Main {
    public static void main(String[] args) {
        // 인터페이스 익명 구현 객체 생성
        IAnimal dog = new IAnimal() {
            @Override
            public String bark() {
                return "개가 짖습니다";
            }
            
            @Override
            public String run() {
                return "개가 달립니다";
            }
        };
        
        // 인터페이스 구현 객체 사용
        dog.bark();
        dog.run();
    }
}
  • 클래스가 인터페이스를 구현한 후 인터페이스를 구현한 클래스로 객체를 만들어야하는데, 위 코드는 인터페이스를 바로 구현해서 클래스명 없이 객체를 만들었다. 이것은 익명 구현 객체라한다.

한계점

  • 오로지 하나의 인터페이스만 구현하여 객체 생성할 수 있다는 점이다.

'Backend > Java' 카테고리의 다른 글

Java - 스레드 (Thread)  (0) 2023.02.23
Java - 예외  (0) 2023.02.22
Java - 중첩 클래스  (0) 2023.02.22
Java - 상속  (0) 2023.02.19
Java - 객체, 클래스, 인스턴스의 차이  (2) 2023.02.19

댓글