본문 바로가기

Java/Java

중첩 클래스 및 중첩 인터페이스_익명 객체

1. 익명 객체

익명(anonymous) 객체는 이름이 없는 객체를 말한다. 

익명 객체를 생성하기 위한 조건이 있다.

익명 객체는 부모 클래스의 자식 객체 또는 인터페이스의 구현 객체여야한다.

 

일반적인 상황에서는 자식 클래스, 구현 클래스의 이름을 선언하고 객체를 생성한다.

  • class 자식클래스 extends 부모클래스 { ... } //상속
  • 부모클래스 변수 = new 자식클래스(); //상속
  • class 구현클래스 implements 인터페이스 { ... } //구현
  • 인터페이스 변수 = new 구현클래스(); //구현

 

그러나 익명 객체에서는 자식 클래스 또는 구현 클래스의 이름이 선언되지 않는다.

그리고 아래의 코드를 통해 자식 및 구현 객체를 생성하고 참조하게 된다.

  • 부모클래스 변수 = new 부모클래스(매개값, ... ) { ... }; //상속
  • 인터페이스 변수 = new 인터페이스(매개값, ... ) { ... }; //구현

 

위의 코드의 의미를 알아보자. '부모클래스(매개값, ... ) { ... }'는 부모클래스를 상속해서 중괄호 내부처럼 자식 클래스를 선언하라는 의미를 가지고 있다.

그리고 new 연산자는 그렇게 선언된 자식 클래스의 객체를 생성한다.

 

좀 더 세부적으로 살펴보자. '부모클래스(매개값, ... )'은 해당 매개값과 일치하는 부모 클래스의 생성자를 호출하는 코드이다. 

그리고 중괄호 내부에는 필드와 메소드를 선언하거나, 부모 클래스의 메소드를 재정의한다. 주의할 점은 일반 클래스와는 다르게 생성자를 선언할 수 없다는 것이다. 

 

 

2. 익명 자식 객체

아래는 익명 자식 객체 사용의 예를 보여준다.

부모 클래스인 person클래스가 존재한다. 그리고 자식 객체가 사용되지만, 자식 클래스 이름은 가지지 않은 익명 객체로써 사용된다.

 

Anonymous클래스 내부를 보면 Person field = new Person() { ... };를 통해 필드 값으로 익명 자식 객체를 사용할 수 있음을 알 수 있다. 

그리고 void method1() { Person localVar = new Person() { ... } ... };를 통해 로컬 변수 값으로 익명 자식 객체가 사용됨을 볼 수 있다.

 

AnonymousExample클래스 내부를 보면 anony.method2( new Person() { ... } );를 통해 매개 변수 값으로 익명 자식 객체가 사용됨을 볼 수 있다.

package sec02.exam01;

public class Person {
	void wake() {
		System.out.println("7시에 일어납니다.");
	}

}

 

package sec02.exam01;

public class Anonymous {
	//필드 초기값으로 대입
	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 study() {
						System.out.println("공부합니다.");
					}
					@Override
					void wake() {
						System.out.println("8시에 일어납니다.");
						study();
					}
				}
				);
	}

}

 

 

3. 익명 구현 객체

아래의 예제 코드는 익명 구현 객체 사용의 예를 보여준다.

RemoteControl인터페이스가 존재하며, 그에 대한 구현 클래스 이름은 존재하지 않고 익명 구현 객체가 사용된다.

 

Anonymous클래스 내부를 살펴보자.

RemoteControl field = new RemoteControl() { ... };를 통해 필드 값으로 익명 구현 객체가 사용됨을 볼 수 있다.

또한 void method1() { RemoteControl localVar = new RemoteControl() { ... }; ... }를 통해 익명 구현 객체가 로컬 변수 값으로 사용됨을 볼 수 있다.

 

마지막으로 AnonymousExample클래스 내부에서 anony.method2( new RemoteControl() { ... ] );를 통해 매개 변수 값으로 익명 구현 객체가 사용될 수 있음을 보여준다. 

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를 끕니다.");
					}
				});
		

	}

}

 

 

출처: 혼자 공부하는 자바(신용권)

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

예외 처리_예외 처리  (0) 2022.03.23
예외 처리_예외 클래스  (0) 2022.03.19
중첩 클래스 및 중첩 인터페이스  (0) 2022.03.09
인터페이스_타입 변환과 다형성  (0) 2022.03.07
인터페이스_인터페이스  (0) 2022.03.01