본문 바로가기
Java

[Java] 익명 객체

by lmyourpearl 2025. 11. 15.

익명 객체(anonymous)

이름이 없는 객체를 말하며, 익명 객체를 만들려면 어떤 클래스를 상속하거나 인터페이스를 구현해야만 함.

// 상속
class 클래스이름1 extends 부모클래스 {...}
부모클래스 변수 = new 클래스이름1();

// 구현
class 클래스이름2 implements 인터페이스 {...}
인터페이스 변수 = new 클래스이름2();

* 이 경우 부모 클래스 변수는 클래스이름1의 객체를 참조하고, 인터페이스 변수는 클래스이름2의 객체를 참조.

 

// 상속
부모클래스 변수 = new 부모클래스() {...};

// 구현
인터페이스 변수 = new 인터페이스() {...};

* 이 경우 부모 클래스 변수는 이름이 없는 자식 객체를 참조하고, 인터페이스 변수는 이름이 없는 구현 객체를 참조.


익명 자식 객체 생성

// 부모 클래스

package sec02.exam01;

public class Person {
	void wake() {
    	System.out.println("7시에 일어납니다.");
    }
}
// 익명 자식 객체 생성

package sec02.exam01;

public class Anonymus {

	// 필드 초기값으로 대입
    Person field = new Person() {
       void work() {					// 필드값으로 익명 객체 대입
         System.out.println("출근합니다.");
       }
       @Override
       void wake() {
         System.out.println("6시에 일어납니다.");
         work();
      }
   };
   
   void method1() {
   	 // 로컬 변수값으로 대입
     Person localVar = new Person() {
     	void walk() {					// 로컬 변수값으로 익명 객체 대입
        	System.out.println("산책합니다.");
        }
        @Override
        void wake() {
        	System.out.println("7시에 일어납니다.");
            walk();
        }
     };
     
     // 로컬 변수 사용
     localVar.wake();
    }
    
    void method2(Person person) {
    	person.wake();
    }
}
// 익명 자식 객체 생성
package sec02.exam01;

public class AnonymousExample {
	public static void main(String[] args) {
    	Anonymous anony = new Anonymous();
        // 익명 객체 필드 사용
        anony.field.wake();
        // 익명 객체 로컬 변수 사용
        anony.method1();
        
        // 익명 객체 매개값 사용
        anony.method2(
          new Person() {				// 매개값으로 익명 객체 대입
            void stud() {
              System.out.println("공부합니다.");
            }
            @Override
              void wake() {
              	 System.out.println("8시에 일어납니다.");
                 study();
              }
           }
        );
    }
}

익명 구현 객체 생성

// 인터페이스

package sec02.exam02;

public interface RemoteControl {
	public void turnOn();
    public void turnOff();
}
// 익명 구현 객체 생성

package sec02.exam02;

public class Anonymous {
	// 필드 초기값으로 대입
    RemoteControl field = new RemoteControl() {
    	@Override
        public void turnOn() {					// 필드 선언과 초기값 대입
        	System.out.println("TV를 켭니다.");
       }
       @Override
       public void turnOff() {
       		System.out.println("TV를 끕니다.");
       }
    };
    
    void method1() {
    	// 로컬 변수값으로 대입
        RemoteControl localVar = new RemoteControl() {
        	@Override
            public void turnOn() {				// 로컬 변수 선언과 초기값 대입
            	System.out.println("Audio를 켭니다.");
           }
           @Override
           public void turnOff() {
           		System.out.println("Audio를 끕니다.");
          }
       };
       // 로컬 변수 사용
       localVar.turnOn();
     }
     void method2(RemoteControl rc) {
     	rc.turnOn();
    }
}
// 익명 구현 객체 생성

package sec02.exam02;

public class AnonymousExample {
	public static void main(String[] args) {
    	Anonymous anony = new Anonymous();
        // 익명 객체 필드 사용
        anony.field.turnOn();
        // 익명 객체 로컬 변수 사용
        anony.method1();
        // 익명 객체 매개값 사용
        anony.method2(
        	new RemoteControl() {
            	@Override
                public void turnOn() {						// 매개값
                	System.out.println("SmartTv를 켭니다.");
                }
                @Override
                public void turnOff() {
                	System.out.println("SmartTV를 끕니다.");
                }
             }
         );
     }
 }

익명 객체의 로컬 변수 사용

// 인터페이스

package sec02.exam04;

public interface Calculatable {
	public int sum();
}
// 익명 객체의 로컬 변수 사용

package sec02.exam04;

public class Anonymous {
	private int field;
    
    public void method(final int arg1, int arg2) {
    	final int var1 = 0;
        int var2 = 0;
        
        field = 10;
        
        Calculatable calc = new Calculatable() {
        	@Override
            public int sum() {
            	int result = field + arg1 + arg2 + var1 + var2;
                return result;
            }
        };
        
        System.put.println(calc.sum());
    }
}
// 익명 객체의 로컬 변수 사용

package sec02.exam04;

public class AnonymousExample {
	public static void main(String[] args) {
    	Anonymous anony = new Anonymous();
        anony.method(0,0);
    }
}

 


🔘 익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하는 것은 귀찮은 작업인데, 이 경우에는 익명 자식 객체를 생성해서 사용.

부모클래스 [필드|변수] = new 부모클래스(매개값, ...) {
    // 필드
    // 메소드
};

 

🔘 익명 구현 객체: 구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용할 경우라면 구현 클래스를 명시적으로 선언하는 것은 귀찮은 작업인데, 이 경우에는 익명 구형 객체를 생성해서 사용.

인터페이스 [필드|변수] = new 인터페이스() {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    // 필드
    // 메소드
};

 

'Java' 카테고리의 다른 글

[Java] 예외 처리  (1) 2025.11.15
[Java] 예외 클래스  (0) 2025.11.15
[Java] 중첩 클래스와 중첩 인터페이스  (0) 2025.11.15
[Java] 타입 변환과 다형성  (0) 2025.11.14
[Java] 인터페이스  (0) 2025.11.14