. Anonymous Class
익명 클래스에 대해서 알아보자
부모님이 아들과 딸을 위해 밥을 만들어 준다고 예시를 들어 보겠습니다.
부모님이 요리한 요리를 먹기 위해 아들과 딸은 부모 클래스인 Parents를 상속을 받아야 합니다.
상속을 받기위해 우리는 아들과 딸이라는 이름에 클래스를 만들어서 각각 상속을 extends Parents라는 코드로 작성을 해줍니다.
public class Parents {
public void eat() {
System.out.println("밥을 먹습니다");
}
}
public class Daughter extends Parents{
@Override
public void eat() {
System.out.println("딸이 밥을 먹습니다");
}
}
public class Son extends Parents{
@Override
public void eat() {
System.out.println("아들이 밥을 먹습니다");
}
}
단지 메소드를 오버라이드 해주기 위해 클래스 파일을 생성한다니 뭔가 불편하지 않으신가요?
이럴 때 우리는 익명 클래스를 사용합니다. 단순히 밥을 한번 먹을 것인데 2개의 클래스 파일이 생성되는 것보단 익명 클래스를 사용해 코드를 간단히 만들 수 있습니다.
먼저 익명 클래스를 사용하기위한 준비입니다.
Parents son = new Parents() {
};
우리가 인스턴스를 생성할때 사용하는 코드와 별 다른 점은 없습니다. {}; 빼고요.
우리는 son이라는 익명 클래스를 생성했습니다. 그럼 아들과 딸이 밥을 먹어야겠죠?
Parents son = new Parents() {
@Override
public void eat() {
System.out.println("아들이 밥을 먹습니다.");
}
};
son.eat();
Parents daughter = new Parents() {
@Override
public void eat() {
System.out.println("딸이 밥을 먹습니다.");
}
};
daughter.eat();
Parents를 상속받은 두 개의 son , daughter라는 익명 클래스의 인스턴스가 생성되었습니다.
Parents의 eat() 메서드를 오버라이드 해서 밥을 먹을 수 있습니다.
클래스 파일 또한 2개가 줄었고요. 이것이 익명 클래스의 장점입니다.
그렇다고 과하게 사용하면 코드 가독성이 상당히 떨어질 것입니다.
또 주의할 점은 부모 형식으로 익명 인스턴스를 생성했기 때문에
{} 밖에서는 부모의 필드나 메서드만 이용할 수 있습니다.
public void baseball() {
System.out.println("아들이 야구를 합니다.");
}
라는 메서드를 {} 밖에서 실행할 때 오류가 발생하는 것을 보실 수 있을 것입니다.
어찌 보면 당연한 에러입니다. 자식의 인스턴스를 부모 형식으로 생성했을 경우 자식의 필드와, 메서드를 이용하지 못하고
부모만의 필드와, 메서드만을 이용할 수 있습니다.
익명 클래스 또한 부모 형식으로 생성 됐기 때문에 부모의 메서드만을 사용할 수 있는 것입니다.
Parents son = new Parents() {
public void baseball() {
System.out.println("아들이 야구를 합니다.");
}
@Override
public void eat() {
System.out.println("아들이 밥을 먹습니다.");
baseball();
}
};
son.eat();
이런 식으로 부모의 메서드를 재정의해서 사용하는 방법이 있겠군요.
또한 매개변수로써 익명 클래스를 사용할 수도 있습니다.
public static void eating(Parents child) {
child.eat();
}
Parents son = new Parents() {
@Override
public void eat() {
System.out.println("아들이 밥을 먹습니다.");
}
};
Parents daughter = new Parents() {
@Override
public void eat() {
System.out.println("딸이 밥을 먹습니다.");
}
};
Parents.eating(son);
Parents.eating(daughter);
결과창은 안 보셔도 아시겠죠?
사실 익명 클래스보다는 람다식을 좀 더 사용하고 익명 인터페이스 Runnable Callable를 간간히 사용한다고 합니다.
안드로이드에서는 자주 사용한다지만 저와는 거리가 먼 이야기입니다.
이번 시간에는 익명 클래스에 대해서만 공부해봤습니다.
'JAVA > [JAVA] 바구니' 카테고리의 다른 글
[JAVA] Object Class (0) | 2020.04.08 |
---|---|
[JAVA] Java.lang 패키지 (0) | 2020.04.08 |
[JAVA] 유효범위 (0) | 2020.04.02 |
[JAVA] SOLID 객체지향설계 (0) | 2020.03.25 |
[JAVA] Java Thread (0) | 2020.03.12 |
댓글