[Java] 익명 객체

Local Gaji·2023년 8월 19일

이것이 자바다

목록 보기
11/18

🎈 익명 객체란?

따로 명시적으로 선언하지 않고 일회용 객체를 만들 수 있다. 익명 객체는 주로 필드 값, 로컬 변수 값, 매개변수 값으로 사용된다. 클래스를 상속하거나 인터페이스를 implements 해서 생성할 수 있다.


🎈 익명 자식 클래스

부모 클래스를 상속해서 생성하는 익명 객체

new 부모클래스생성자(...) { ... }

중괄호 블록에서는 주로 부모 클래스의 메서드를 Override 한다. 부모 클래스의 멤버만 익명 객체의 멤버에 접근할 수 있다.

/* CPU.java */
public class CPU {
  public void powerOn() { 
    System.out.println("CPU ON");
  }
}

/* Desktop.java */
public class Desktop {

  /* 1. 익명 자식 클래스를 필드에 대입하고 메서드 정의 */
  private CPU cpu = new CPU() {
    @Override
    public void powerOn() { 
      System.out.println("Apple CPU ON");
    }
  }
  public void start1() {
    cpu.powerOn();
  }
  
  
  /* 2. 익명 자식 클래스를 메서드 속 로컬변수에 대입 */
  public void start2() {
    CPU cpu = new CPU() {
      @Override
      public void powerOn() {
        System.out.println("Intel CPU ON");
      }
    }
    cpu.powerOn();
  }
  
  
  /* 3. 익명 자식 클래스를 매개변수로 받기 */
  public void start3(CPU cpu) {
    cpu.powerOn();
  }
}


/* 실행 */
Desktop mypc = new Desktop();

mypc.start1(); 
mypc.start2();
mypc.start3(new CPU() {
  @Override
  public void start() {
    System.out.println("AMD CPU ON");
  }
});        // 매개변수로 익명 객체를 전달
  1. 익명 자식 클래스가 powerOn 메서드를 재정의한 후, 필드 cpu 에 대입된다. start1 메서드는 이 cpu 필드를 이용해, 재정의된 powerOn 메서드를 호출한다.
  2. start2 메서드 선언 시 익명객체를 생성해서 로컬변수 cpu 에 대입하고, 이를 활용해서 재정의된 powerOn 메서드를 호출한다.
  3. start3 메서드는 이 메서드를 사용하는 곳 에서 익명 객체를 생성해서 매개변수로써 전달된다. 이 익명객체는 자동 타입 변환되어 cpu 매개변수에 대입되고, 재정의된 powerOn 메서드를 호출한다.

🎈 익명 구현 클래스

/* CPU.java */
public interface CPU {
  void powerOn();  // 추상 메서드
}

/* Desktop.java */
public class Desktop {

  /* 1. 필드에 익명 구현 클래스 대입 */
  private CPU cpu = new CPU() {
    @Override
    public void powerOn() { ... }
  }
  public void start1() {
    cpu.powerOn();
  }
  
  
  /* 2. 메서드 속 로컬 변수에 대입 */
  public void start2() {
    CPU cpu = new CPU() {
      @Override
      public void powerOn() { ... }
    }
  }
  
  
  /* 3. 매개변수로 익명구현클래스 받기 */
  public void start3(CPU cpu) {
    cpu.powerOn();
  }
  
}


/* 실행 */
Desktop mypc = new Desktop();

mypc.start1();
mypc.start2();
mypc.start3(new CPU() {
  @Overrride
  public void powerOn() { ... }
});

0개의 댓글