Java

[Java Programming] 9.2 익명 클래스

코딩펭귄 2024. 1. 29. 17:41
자바의 추상화

1. 추상 클래스

2. 인터페이스

   추상클래스 & 인터페이스 : 인스턴스 생성 불가능 (구현되지 않은 메소드가 있기 때문)

     -> 추상클래스 : extends (상속받아서) 구현 / 인터페이스 : implements 구현

     -> 구현 이후 클래스로 만들어줘야 -> 인스턴스 생성할수 있게 됨 

3. 익명클래스 : 한번 쓰고 안쓸것들을 만드는 용도

 

익명클래스

- 추상클래스, 인터페이스를 강제로 인스턴스화 시키는 방법

- 사용하는 이유 : 한번쓰고 안쓸건데, 클래스 복잡하게 만들기 싫어서

- 언제쓰면 좋을까? : 단 한번 사용할 인스턴스 만들 때 사용

 

- 이름이 없는 객체를 말함 -> 단독으로 생성할 수 없고 클래스 상속하거나 인터페이스 구현해야만 생성할수있다

 

순서

1. 익명 자식 객체 생성

방법1) 부모클래스 상속해서 자식클래스 선언 & new연산자로 자식객체 생성 -> 필드, 로컬변수에 대입

Class Child extends Parent{ } //자식클래스 선언
Class A {
    Parent field = new Child(); // 필드에 자식객체 대입
    void method() { 
Parent localVar = new Child(); // 로컬변수에 자식객체 대입

}

방법2) (자식클래스 사용x, 필드의 변수의 초기값으로만 사용할 경우) : 익명자식객체를 생성해서 초기값으로 대입

부모클래스[필드|변수] = new 부모클래스(매개값, ...){
//필드
//메소드
}

 

 

 

Rideable 인터페이스를 강제 인스턴스화 하기

1. new + 인터페이스 / 추상클래스 작성

2. 생성자 뒤 {구현되지 않은것들(개수만큼) 즉시구현};

public class App {
    public static void main(String[] args) throws Exception {
        Rideable car1 = new Rideable() {
            // 즉시 구현
            @Override
            public void startEngine() {
                System.out.println("시동을 걸었습니다!");
            }
        };
        car1.startEngine();
    }
}

** 안드로이드 어플리케이션 만들때 굉장히 많이 사용함

 

인터페이스(new Rideable() )를 파라미터로 받는 메소드 = '콜백' 
package Class;
public interface Rideable {
	void startEngine();
}​
public class App {
	public void startEngine(Rideable rideable) {
		rideable.startEngine();
	}

	public static void main(String[] args) {
		App app = new App();
        
       		//App의 startEngine을 호출하기 위해 파라미터로 익명클래스 보냄
		app.startEngine(new Rideable() { 
			@Override
			public void startEngine() {
				System.out.println("일회용 차의 시동을 겁니다!");
			}
		});
	}
}