익명클래스 Annoymous Inner Class
: 이름이 없는 클래스로 일회성으로 사용하기 위한 목적을 가진 클래스이다.
보통 추상클래스나 인터페스으로 받아서 매개변수로 많이 쓰인다.
new 키워드를 앞에 붙여서 미구현된 메서드를 재정의하고, 그 재정의된 메서드를 사용한다.
익명클래스 파일 확인
작업폴더 > 해당 프로젝트 파일 > bin > 해당 패키지 파일 의 경로에서 아래와 같이 클래스명$1로 표시된다.
예제코드
public interface Cafe {
// 추상메서드
void setMenu(String[] menu);
String[] getMenu();
void sell(String choice);
}
익명으로 사용할 클래스를 생성해 구현하고 싶은 추상메서드를 선언한다.
Cafe 인터페이스 클래스에 setMenu, getMenu, sell 추상 메서들를 선언해주었다.
public class Starbucks {
private String [] menu = {"아메리카노", "레몬티", "카푸치노"};
private int[] arPrice = {5000, 8000, 9000};
private int income;
String choice = "카푸치노";
public String[] getMenu() {
return menu;
}
public void setMenu(String[] menu) {
this.menu = menu;
}
public int[] getArPrice() {
return arPrice;
}
public void setArPrice(int[] arPrice) {
this.arPrice = arPrice;
}
public int getIncome() {
return income;
}
public void setIncome(int income) {
this.income = income;
}
public void registCafe(Cafe c, String choice) {
c.setMenu(menu);
System.out.println("카페 등록 완료");
System.out.println("----Menu----");
for (int i = 0; i < c.getMenu().length; i++) {
String menu = c.getMenu()[i];
System.out.println((i+1)+ " " + menu + "(" + arPrice[i] + ")");
}
c.sell(choice);
}
//메인메서드
public static void main(String[] args) {
Starbucks gangnam = new Starbucks();
gangnam.registCafe(new Cafe() { //익명클래스
@Override
public void setMenu(String[] menu) {
gangnam.menu = menu;
}
@Override
public void sell(String choice) {
for (int i = 0; i < gangnam.getMenu().length; i++) {
if(gangnam.getMenu()[i].equals(choice)) {
gangnam.income += gangnam.arPrice[i];
}
}
}
@Override
public String[] getMenu() {
return gangnam.menu;
}
},"카푸치노");
System.out.println(gangnam.choice+" 주문 완료");
System.out.println("현재수익 : "+gangnam.getIncome());
}
}
Starbucks 클래스에서는 멤버변수, 메서드를 생성해서 main 함수에 객체화해 구현할 것이다.
멤버변수로 메뉴를 담을 menu,가격을 담을 arPrice을 배열로 만들어 값을 초기화해주었고,
수입을 담을 income,
테스트를 위한 choice 변수를 만들어 선택할 메뉴로 초기화해주었다.
menu, arPrice, income 변수는 private로 선언을 해서 외부에서 직접적으로 접근하지 못하도록 해주고,
getter setter 을 생성해주어서 접근을 할 수 있도록 해 준다.
registerCafe라는 메서드로 카페를 등록하는 기능을 구현할 것이다.
Cafe class와 choice 변수를 매개변수로 받게 한다.
이 메서드를 통해서 Cafe 클래스의 추상메서드들을 선언할 수 있도록 한다.
for문을 활용해 배열에 담겨있는 menu를 가져오고, 출력해준다.
main 메서드로 이제 객체화하고 메서드를 구현한다.
Starbucks 클래스를 객체화해 gangnam 을 힙 메모리에 올려준 뒤에
registerCafe 메서드를 이용해 Cafe 타입의 객체가 들어가야할 매개변수 부분에 new Cafe로 익명클래스로 불러온다.
그러면 Override(재정의) 해야할 추상메서드들이 자동적으로 생성되고
Starbucks의 멤버변수로 초기화해 둔 menu를 setMenu, getMenu메서드에 연결시켜주고,
sell 메서드에는 for문, if문을 이용해 choice한 메뉴를
menu 배열에서 하나씩 비교해 income 변수에 그 메뉴의 가격을 누적 + 시켜준다.
익명클래스의 구현이 끝났다면 choice를 넣을 매개변수 부분에 원하는 메뉴명을 넣어준다.
테스트로 "카푸치노"를 지정해 주었다.
이제 run을 해보면 아래와 같은 결과를 확인할 수 있다.
'Back-End > Java' 카테고리의 다른 글
[Back-End][Java] 36. Object 클래스 (0) | 2021.09.24 |
---|---|
[Back-End][Java] 35. 예외처리 (Exception) - try/catch (0) | 2021.09.23 |
[Back-End][Java] 33. 내부 클래스 Inner Class (0) | 2021.09.16 |
[Back-End][Java] 32. 인터페이스 Interface (0) | 2021.09.14 |
[Back-End][Java] 31. 객체 지향 프로그래밍 연습하기 (스타크래프트) (0) | 2021.09.14 |