IT/Java

[Java] anonymous

Huitopia 2024. 3. 13. 00:44
728x90

익명(anonymous) 객체

  • 이름이 없는 객체를 말하며, 프로그램에서 일시적으로 한 번만 사용되고 버려져 재사용이 되지 않는 객체이다.
  • 하나의 코드로 여러 인스턴스를 만들 필요 없을 때 사용한다.
  • 클래스의 선언과 객체 생성을 동시에 한다.
  • 명시적으로 클래스를 선언하지 않으나 단독으로 생성할 수 없으며, 클래스를 상속하거나 인터페이스를 구현해야 생성 가능하다.
  • 익명 객체는 필드값, 로컬 변수값, 매개변수값을 주로 사용된다.
  • UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 많이 활용된다.
  • 내부 클래스의 일종으로 외부의 지역 변수 이용할 때 똑같이 내부 클래스의 제약을 받는다.
  • 내부 클래스에서 가져올 수 있는 변수는 final 상수만 사용 가능하다.
  • 클래스를 상속해서 만들 경우 익명 자식 객체이며, 인터페이스를 구현해서 만들 경우 익명 구현 객체이다.

 

1. 익명 자식 객체(extends)

new 부모생성자(매개값, ...) {
    // 필드
    // 메소드
    // 생성자 X
}
  • 부모 클래스를 상속 받아 생성된다.
  • 생성자를 선언할 수 없으며, 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근이 불가능하다.

 

예제 코드1

더보기
/* example */
public class Anonymous {
    public static void main(String[] args) {
        /* 익명클래스의 객체 : 구현 클래스 없이 추상 클래스의 객체 생성 */
        MyClass myClass = new MyClass() {
        };
    }
}

abstract class MyClass { }

예제 코드2

더보기
package ch09.sec07.exam01;

public class CarExample {
    public static void main(String[] args) {
        Car car = new Car(); // Car 객체 생성
        car.run1(); // 익명 자식 객체가 대입된 필드 사용
        car.run2(); // 익명 자식 객체가 대입된 로컬변수 사용
        car.run3(new Tire() { // 익명 자식 객체가 대입된 매개변수 사용
            @Override
            void roll() {
                System.out.println("익명 자식 Tire 객체 3이 굴러감");
            }
        });
    }
}

class Tire {
    void roll() {
        System.out.println("일반 타이어 굴러감");
    }
}

class Car {
    private Tire tire1 = new Tire(); // 필드에 Tire 객체 대입
    private Tire tire2 = new Tire() { // 필드에 익명 자식 객체 대입
        @Override
        void roll() {
            System.out.println("익명 자식 Tire 객체1이 굴러감");
        }
    };
    void run1() { // 메소드(필드 이용)
        tire1.roll(); // "일반 타이어 굴러감"
        tire2.roll(); // "익명 자식 Tire 객체1이 굴러감"
    }
    void run2() { // 메소드(로컬 변수 이용)
        Tire tire = new Tire() { // 로컬 변수에 익명 자식 객체 대입
            @Override
            void roll() {
                System.out.println("익명 자식 Tire 객체 2가 굴러감");
            }
        };
        tire.roll();
    }
    void run3(Tire tire) { // 메소드(매개변수 이용)
        tire.roll();
    }
}

 

 

2. 익명 구현 객체(implements)

new 인터페이스() {
    // 필드
    // 메소드
    // 생성자 X
}
  • 구현 클래스를 작성하지 않고 구현 객체를 생성한다.
  • 중괄호 {}에는 인터페이스에 선언되는 모든 추상 메소드들의 실체 메소드를 작성해야 한다.
  • 필드와 메소드를 선언할 수는 있지만, 익명 객체 안에서만 사용 가능하며 인터페이스 변수로 접근 불가능하다.

 

 

 

참고 링크

 

[Java] Chapter 9.2 익명 객체

익명 객체의 개요 익명 객체는 이름이 없는 객체입니다. 익명 객체를 사용하기 위한 조건은 어떤 클래스를 상속하거나 인터페이스를 구현해야 사용할 수 있습니다. 익명 객체를 사용하면 부모

euni00.tistory.com

 

728x90