목차


<aside>

</aside>

익명 클래스(Anonymous Class)


익명 클래스란

익명 클래스는 클래스 정의와 동시에 객체를 생성할 수 있다.

메서드, 지역 변수 등으로 객체를 선언할 수 있으며 쓰임에 따라 생명주기에 맞게 일회용으로 쓰인다. 그래서 부모 클래스의 자원을 상속받아 재정의하며 사용할 자식 클래스가 한 번만 사용되고 버려질 자료형이라면 익명 클래스 객체를 통해 코드를 줄이면서도 메모리를 아끼며 유지보수성을 높일 수 있다.

public class Animal {
    public String bark() {
        return "동물이 웁니다";
    }
}

public class Main {
    public static void main(String[] args) {
        // 익명 클래스 - 자식 클래스 정의와 객체화를 동시에
        Animal dog = new Animal() {
            // 오버라이딩
            public String bark() {
                return "개가 짖습니다";
            }
        };
        
        dog.bark();
}

주의점

익명 클래스 내에서 새로이 선언한 메서드는 익명 클래스 밖에서 사용하지 못한다. 아래 코드에서 run() 이라는 메서드는 익명 클래스 밖에서 실행할 때 컴파일 에러가 난다.

public class Main {
    public static void main(String[] args) {
        // 익명 클래스 - 자식 클래스 정의와 객체화를 동시에
        Animal dog = new Animal() {
            // 오버라이딩
            public String bark() {
                return "개가 짖습니다";
            }
            // 새로 정의
            public String run() {
		            return "달리다.";
            }
        };
        
        // 컴파일 에러 - 익명 클래스 밖에서 실행하기 때문에.
        dog.run();
}

선언 위치

익명 클래스는 3가지 케이스로 나누어 선언할 수 있다.

먼저, 클래스 필드로써 사용할 수 있다. Animal 클래스의 필드로써 Animal을 익명으로 선언했다.

public class Creature {
    Animal dog = new Animal() {
        public String bark() {
            return "필드에서 멍멍";
        }
    };
	  ...
}

두 번째로, 지역 변수로써 사용할 수 있다. method() 내에서 활용하기 위해 익명 클래스를 선언했다.

public class Creature {
		public void method() {
				Animal dog = new Animal {
						public String bark() {
								return "지역변수로써 멍멍";
						}
				};
				dog.bark();
		}
}

마지막으로, 메서드의 매개변수로 받을 수 있다. Creature 내에 Animal 객체를 매개변수로 받는 메서드를 만들어 다른 곳에서 새로이 Animal 객체를 익명으로 선언해 전달했다.