익명 객체

mmmhmm·2024년 2월 13일

이것이 자바다

목록 보기
8/11

익명 객체란?

이름이 없는 객체를 말한다. 명시적으로 클래스를 선언하지 않기 때문에 쉽게 객체를 생성할 수 있다는 장점이 있다. 익명 객체는 필드값, 로컬 변수값, 매개변수값을 주로 사용된다.

  • 익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다.
  • 클래스를 상속해서 만들 경우 익명 자식 객체라고 한다.
  • 인터페이스를 구현해서 만들 경우 익명 구현 객체라고 한다.

익명 자식 객체

익명 자식 객체는 부모 클래스를 상속받아 다음과 같이 생성된다. 이렇게 생성된 객체는 부모 타입의 필드, 로컬 변수, 매개변수의 값으로 대입할 수 있다.

new 부모생성자(매개값,...) {
	//필드
    //메소드
}

중괄호 블록 안에 필드와 메소드는 익명 자식 객체가 가져야 할 멤버로, 중괄호 블록 안에서만 사용 할 수 있다. 익명 자식 객체는 부모 타입에 대입되므로 부모 타입에 선언된 멤버만 접근할 수 있기 때문이다. 중괄호 블록 안에는 주로 부모 메소드를 재정의하는 코드가 온다.
[예제] Tire 클래스의 roll() 메소드를 재정의해 실행 내용을 변경(다형성)

//Tire.java
package ch09.sec07.exam01;

public class Tire {
	public void roll() {
		System.out.println("일반 타이어가 굴러갑니다.");
	}
}
//Car.java
package ch09.sec07.exam01;

public class Car {
	//필드에 Tire 객체 대입
	private Tire tire1 = new Tire();
	
	//필드에 익명 자식 객체 대입
	private Tire tire2 = new Tire() {
		public void roll() {
			System.out.println("익명 자식 Tire 객체 1이 굴러갑니다.");
		};
	};
	
	//메소드(필드 이용)
	public void run1() {
		tire1.roll();
		tire2.roll();
	}
	
	//메소드(로컬 변수 이용)
	public void run2() {
		//로컬 변수에 익명 자식 객체 대입
		Tire tire = new Tire() {
			public void roll() {
				System.out.println("익명 자식 Tire 객체 2가 굴러갑니다.");
			};
		};
		tire.roll();
	}
	
	//메소드(매개변수 이용)
	public void run3(Tire tire) {
		tire.roll();
	}
}
//CarExample.java
package ch09.sec07.exam01;

public class CarExample {
	public static void main(String[] args) {
		// Car 객체 생성
		Car car = new Car();

		// 익명 자식 객체가 대입된 필드 사용
		car.run1();

		// 익명 자식 객체가 대입된 로컬변수 사용
		car.run2();

		// 익명 자식 객체가 대입된 매개변수 사용
		car.run3(new Tire() {
			@Override
			public void roll() {
				System.out.println("익명 자식 Tire 객체 3이 굴러갑니다");
			}
		});

	}
}
실행결과:
일반 타이어가 굴러갑니다.
익명 자식 Tire 객체 1이 굴러갑니다.
익명 자식 Tire 객체 2가 굴러갑니다.
익명 자식 Tire 객체 3이 굴러갑니다

익명 구현 객체

인터페이스를 구현해서 다음과 같이 생성된다. 이렇게 생성된 객체는 인터페이스 타입의 필드, 로컬변수, 매개변수의 값으로 대입할 수 있다. 익명 구현 객체는 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 많이 사용된다.

new 인터페이스(){
	//필드
    //메소드
}

중괄호 블록 안의 필드와 메소드는 익명 구현 객체가 가져야 할 멤버로, 중괄호 블록 안에서만 사용 할 수 있다. 그 이유는 익명 구현 객체는 인터페이스 타입에 대입되므로 인터페이스 타입에선언된 멤버만 접근할 수 있기 때문이다. 중괄호 블록 안에는 주로 인터페이스의 추상 메소드를 재정의하는 코드가 온다.
[예제] RemoteControl 인터페이스의 익명 구현 객체를 생성해서 필드, 로컬 변수, 매개변수 값으로 사용하는 방법보여주기. roll() 메소드 재정의(다형성)

//RemoteControl.java
package ch16.lambda01.ch09.sec07.exam02;

public interface RemoteControl {
	//추상 메소드
	void turnOn();
	void turnOff();
	
}
//Home.java
package ch16.lambda01.ch09.sec07.exam02;

public class Home {
	//필드에 익명 구현 객체 대입
	private RemoteControl rc =new RemoteControl() {
		
		@Override
		public void turnOn() {
			System.out.println("Tv를 켭니다.");
		}
		
		@Override
		public void turnOff() {
			System.out.println("Tv를 끕니다.");			
		}
	};
	
	//메소드(필드 이용)
	public void use1() {
		rc.turnOn();
		rc.turnOff();
	}
	
	//메소드(로컬 변수 이용)
	public void use2() {
		RemoteControl rc = new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("에어컨를 켭니다.");
				
			}
			
			@Override
			public void turnOff() {
				System.out.println("에어컨를 끕니다.");
				
			}
		};
		rc.turnOn();
		rc.turnOff();
	}
	
	//메소드(매개변수 이용)
	public void use3(RemoteControl rc) {
		rc.turnOn();
		rc.turnOff();
	}
}
//HomeExample.java
package ch16.lambda01.ch09.sec07.exam02;

public class HomeExample {

	public static void main(String[] args) {
		// Home 객체 생성
		Home home = new Home();

		// 익명 구현 객체가 대입된 필드 사용
		home.use1();

		// 익명 구현 객체가 대입된 로컬 변수 사용
		home.use2();

		// 익명 구현 객체가 대입된 매개변수 사용
		home.use3(new RemoteControl() {

			@Override
			public void turnOn() {
				System.out.println("난방을 켭니다");

			}

			@Override
			public void turnOff() {
				System.out.println("난방을 끕니다");
			}
		});
	}

}
실행결과:
Tv를 켭니다.
Tv를 끕니다.
에어컨를 켭니다.
에어컨를 끕니다.
난방을 켭니다
난방을 끕니다
profile
어라? 금지

0개의 댓글