728x90
class는 설계도다. 경우에 따라 한번 설계하고 끝나는 것이 필요한데, 그럴때 익명객체를 사용하면된다.
★ 익명객체 - 단독생성불가 : 클래스 상속하거나 인터페이스 구현해야만 생성가능
익명객체(익명클래스) 를 사용하는 이유
1. 프로그램 내에서 일시적으로(단발성으로) 한번만 사용되어야 하는 객체일 경우
-> UI 이벤트처리, 스레드 객체 등 (단발성 이벤트 처리)
2. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때
-> 비즈니스 로직이 정말 재각각이며, 재사용성이 전혀없어 매번 클래스를 생성해야하는 비용이 더 많을때
익명 자식 객체 생성
부모클래스 [필드|변수] = new 부모클래스(매개값, ...){
//필드
//메소드
};
중괄호블록은 부모클래스를 상속을해서 자식클래스로 만들겠다는 것.
자식클래스에 이름이없으니, 익명이라고 부른다.
필드 초기값 ↓
class A {
Parent field = new Parent() {
//익명자식객체 생성
int childField;
void childMethod(){
@Override
void parentMethod(){}
//부모의 메소드를 오버라이딩
};
}
로컬변수 초기값 ↓
class A {
void method(){
//로컬변수선언
Parent localVar = new Parent(){
int childField;
void childMethod(){}
@Override
void parentMethod(){}
//부모 메소드 오버라이딩
};
}
}
메소드의 매개값 ↓
class A{
void method1(Parent parent){}
void method2(){
method1{
new Parent(){
int childField;
void childMethod(){}
@Override
void parentMethod(){}
}
};
}
익명 객체에서 새롭게 정의
외부에서는 익명객체의 필드와 메소드에 접근 할 수 없다.
ㄴ 익명객체는 부모타입 변수에 대입되므로 부모타입에 선언된것만 사용가능
익명객체 예제1▽
package ex1;
public class Person {
//부모클래스
void wake() {
System.out.println("7시에 일어납니다");
}
}
package ex1;
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 ex1;
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();
}
}
);
}
}
익명객체 예제2▽
package ex4;
public class Insect {
//부모클래스
void attack(){
System.out.println("곤충은 공격을 한다");
}
}
package ex4;
public class Anonymous {
//방법1: 필드에 익명자식 객체를 생성
Insect spider1 = new Insect(){
String name ="무당거미";
//거미줄을치다
void cobweb(){
System.out.println("사각형으로 거미줄을 친다");
}
@Override
void attack(){
System.out.println(name+"독을 발사한다");
}
};
//방법2: 로컬변수의 초기값으로 대입
void method1(){
Insect spider2 = new Insect(){
String name ="늑대거미";
void cobweb(){
System.out.println("육각형으로 거미줄을 친다.");
}
@Override
void attack(){
System.out.println(name+"앞니로 문다.");
}
};
//로컬변수이기 때문에 메서드에서 바로 사용
spider2.attack();
}
//방법3: 익명객체 매개변수로 대입
void method2(Insect spider){
spider.attack();
}
}
package ex4;
public class AnonymousExample {
public static void main(String[] args) {
Anonymous a = new Anonymous();
//방법 1 : 익명객체 필드 사용
a.spider1.attack();
//방법2 : 익명객체 로컬 변수 사용
a.method1();
//방법3 : 매개변수로 익명개체 사용
a.method2(new Insect(){
String name = "타란툴라";
//거미줄을 치다.
void cobweb(){
System.out.println("그냥 마구잡이로 친다.");
}
@Override
void attack() {
System.out.println(name + " 공격 안하고 후퇴한다..");
}
});
//익명객체 내부에서 새롭게 정의된 필드,메서드는 부모객체로 생성된 spider1에서 접근할 수 없음!!!
//a.spider1.name = "왕거미"; //익명객체에서 새롭게 정의된 필드 (접근불가)
//a.spider1.cobweb(); //익명객체에서 새롭게 정의된 메서드 (접근불가)
//a.spider1.attack(); //부모클래스 Insect에서 오버라이딩해서 재정의한 메서드 (접근가능)
}
}
익명 구현 객체 생성
인터페이스 [필드|변수] = new 인터페이스(){
//인터페이스에 선언된 추상메소드의 실체메소드선언
//필드
//메소드
};
{ } 중괄호에 들어갈 내용이 인터페이스를 구현한 클래스의 내용
필드 초기값 ↓
class A {
//클래스 A의 필드선언
RemoteControlfield = new RemoteControl(){
//RemoteControl인터페이스의 추상메소드에 대한 실체 메소드
@Override
void turnOn(){}
};
}
로컬변수 초기값 ↓
void method() {
//로컬변수선언
RemoteControl localVar = new RemoteControl(){
//RemoteControl 인터페이스의 추상메소드에 대한 실체메소드
@Override
void turnOn(){}
};
}
메소드의 매개값 ↓
class A {
void method1(RemoteControl rc){}
void method2() {
//method1()메소드호출
method1(
//method1()의 매개값으로 익명구현객체를 대입
new RemoteControl(){
@Override
void turnOn(){}
}
);
}
}
익명 구현객체 예제▽
package ex2;
public interface RemoteControl {
public void turnOn();
public void turnOff();
}
package ex2;
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 ex2;
public class AnnonymousExample {
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를 끕니다.");
}
}
);
}
}
이해 참고링크 : https://limkydev.tistory.com/226
이미지출처 : 이것이자바다
728x90
'STUDY > JAVA' 카테고리의 다른 글
[JAVA] 22-07-19 예외(Exception) ☑ (0) | 2022.07.19 |
---|---|
[JAVA-이것이자바다.7장] 상속 확인 문제 (0) | 2022.07.18 |
[JAVA] 22-06-13 상수풀 / String · StringBuilder · StringBuffer ☑ (0) | 2022.07.18 |
[JAVA] 22-07-14 중첩 클래스 중첩 인터페이스 ☑ (0) | 2022.07.14 |
[JAVA-이것이자바다.6장] 클래스 확인 문제 (0) | 2022.07.13 |