본문 바로가기

객체 지향 프로그래밍 - 중첩 선언과 익명 객체

익명 객체

익명 객체

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

익명 자식 객체

  • 부모 클래스를 상속받아 생성되는 객체
  • 부모 타입의 필드, 로컬 변수, 매개변수의값으로 대입할 수 있음


    출처, 이것이 자바다


package ch09.sec07.exam01;

/*
 일반적인 메소드는 클래스이름에 구성요소로 관리가된다.
 익명구현객체의 재정의된 메소드들은 클래스이름 하에 관리가 되지않고,
 단 일회성으로 클래스 이름없이 사용이 되기 때문에 익명이라는 표현을 사용한다.
 */

public class Tire {

    public void roll() {
        System.out.println("일반 타이어가 굴러갑니다.");
    }

}

package ch09.sec07.exam01;

public class Car {

    //tire1 필드에 객체 대입
    private Tire tire1 = new Tire();

    void methodA() {
        tire1.roll();
    }

    //익명구현객체 문법 사용이유?
    //기존의 Tire클래스의 roll()메소드를 그대로 두고, 일회성으로 재정의하여 사용하는 경우
    //익명 : 재정의 내용을 클래스에 추가해서 사용하지 않고, 클래스 이름없이 직접 사용한다.
    private Tire tire2 = new Tire() {
        //구성요소
        //추가 메소드
        void method() {}; //외부에서 접근 붋가능.

        @Override
        public void roll() {
            System.out.println("익명 자식 Tire 객체 1이 굴러갑니다.");
            method();
        };
    };

    public void run1() {
        tire1.roll();
        tire2.roll();
    }

    public void run2() {
        Tire tire = new Tire() {
            @Override
            public void roll() {
                System.out.println("익명 자식 Tire 객체 2가 굴러갑니다.");
            };
        };
        tire.roll();
    }

    public void run3(Tire tire) {
        tire.roll();
    }
}

package ch09.sec07.exam01;

public class CarExample {

    public static void main(String[] args) {
        Car car = new Car();

        car.run1();

        car.run2();

        car.run3(new Tire() {
            @Override
            public void roll() {
                System.out.println("익명 자식 Tire 객체 3이 굴러갑니다.");
            }
        });
    }

}

익명 구현 객체

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


    출처, 이것이 자바다


package ch09.sec07.exam02;

public interface RemoteControl {

    //추상 메소드
    void turnOn();
    void turnOff();
}

package ch09.sec07.exam02;

//익명 구현 객체는 아래와 같이 클래스로 구현 작업을 하지않고,
//일회성으로 직접 단 1번 사용하는 형태.
public class RemoteControlImpl implements RemoteControl {

    @Override
    public void turnOn() {
        // TODO Auto-generated method stub

    }

    @Override
    public void turnOff() {
        // TODO Auto-generated method stub

    }

}

package 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();
    }
}

package ch09.sec07.exam02;

public class HomeExample {

    public static void main(String[] args) {

        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("난방을 끕니다.");

            }
        });
    }

}

'객체 지향 프로그래밍 - 중첩 선언과 익명 객체' 카테고리의 다른 글

바깥 멤버 접근  (0) 2023.01.25
로컬 클래스  (0) 2023.01.25
정적 멤버 클래스  (0) 2023.01.25
중첩, 인스턴스 멤버 클래스  (0) 2023.01.25