[JAVA] 정리/클래스(Class)_타입(Type)

클래스_익명 객체 Anonymous Object

쎈코 2023. 2. 28. 23:48

익명객체, Anonymous Object
익명 클래스, Anonoymous Class
- 이름이 없는 클래스
- 반드시 인터페이스(interface)가 필요(자바 특성)

실명 클래스
- 객체를 n개 만들 수 있다. > 다회용 클래스
- 클래스 선언 후 객체 생성


익명 클래스
- 객체를 딱 1개만 만들 수 있다. > 1회용 클래스
- 클래스 선언과 동시에 객체 생성
- 일반 클래스와 거의 유사하게 생김8


필요 이유
- 내가 만드는 객체를 딱 한 번만 필요할 때가 있음
-> 붕어빵을 나중에 또 다시 먹고싶지는 않은데 이번에 딱 한번만 먹고 싶음
->  한 번 먹자고 붕어빵틀 살 순 없음 
-> 익명 클래스 선언(더이상 사용하지 않는 버리는 클래스)


TODO 익명 클래스 생성 시 반드시 부모 interface 도 만들어 놔야 하는가?
- 익명 클래스의 구현에서 사용될 부모 클래스나 인터페이스가 없다면, 새로운 클래스를 만들어야 함 
  그렇지 않으면 컴파일러 오류 발생
  -> 익명 클래스를 사용할 때는 항상 부모 클래스나 인터페이스를 만들어서 상속받아야 함




요구사항] 인터페이스를 구현한 클래스 선언하기 > 객체를 생성하기(목적)

1. 본인 타입의 참조 변수
BB o1 = new BB();
o1.aaa();

2. 부모 타입의 참조 변수
AA o2 = new BB();              //자식 -> 부모 업캐스팅
o2.aaa();                             //부모가 인터페이스인 경우 업캐스팅 엄청 자주 함

3. 추상 클래스, 인터페이스는 객체를 생성할 수 없음 > 추상 메소드이기 때문에
AA o3 = new AA();         //(X) AA는 인터페이스이기 때문에 객체 생성 불가
o3.aaa();                        //라고 했을때 아무일도 일어나지 않음 > 구현부가 없기 때문


AA를 상속받는 이름없는 클래스 선언 중(= BB 클래스와 동일한 문법)
익명 클래스 > 익명 객체 생성
인터페이스와 이름없는 클래스를 부모-자식으로 무조건 만들자
AA o4 = new AA() {                    //중괄호를 붙이면 구현 가능
                    //AA는 아무 의미 없음. 바지사장 느낌
     public void aaa() {                 //어떤 클래스의 몸통. 몸통은 있는데 머리통은 안보임
     System.out.println("추상 메소드 구현");
     }
};

//자식 메소드에서 오버라이딩 된 구현과 같음
//누군가의 몸통인지는 모르지만 AA를 상속받았을 것이다
//클래스 선언도 없고 클래스 이름도 없음 -> 익명 클래스

AA o5 = new AA() {                                      AA라는 부모 interface를 상속받은 것
     public void aaa() {                                   AA가 상속한 aaa()메소드의 구현부 완성시키기
     System.out.println("추상 메소드 구현");
     }
};
o5.aaa();                                                       //"추상 메소드 구현" 출력



AA o6 = new AA() {                                      AA라는 부모 interface를 상속받은 것
     public void aaa() {                                   AA가 상속한 aaa()메소드의 구현부 완성시키기
     System.out.println("추상 메소드 구현2");
     }
};
o6.aaa();                                                       //"추상 메소드 구현2" 출력


//o5와 o6은 완전히 다른 것
//일반 클래스는 다회용 클래스지만 익명객체는 객체를 딱 1개만 만들 수 있는 1회용 클래스


     }//main
}//main class

 


interface AA {
     void aaa();
}

class BB implements AA {                       //BB라는 클래스의 몸통 안에 AA인터페이스가 강제로 강요한 메소드를 갖고있음
     public void aaa() {                               // 인터페이스에서 받은 메소드를 오버라이딩으로 구현
     System.out.println("추상 메소드 구현");
     }
} //BB의 몸통을 갖고 AA를 상속받음