익명클래스
- 익명 클래스란 이름이 없는 클래스 이다.
- 익명 클래스를 사용하는 이유는 일시적으로 한번만 쓰고 버려지는 객체에 사용되며 물론 재사용 되지 않는다.
- 확장성을 고려하여 익명클래스를 쓰지 않는 경우가 있지만 확장성 있는 클래스를 사용하는 것 보다 익명클래스를 사용하여 추후에 유지보수시 이점이 있을 때 사용한다.
- 오로지 단 하나의 클래스를 상속받거나 단 한의 인터페이스만을 구현할 수 있다.
익명클래스를 사용하지 않은 예제
interface Age {
int age = 29;
void getAge();
}
class MyClass implements Age {
@Override
public void getAge() {
System.out.print(age);
}
}
class AnonymousTest {
public static void main(String [] args) {
MyClass obj = new MyClass();
obj.getAge();
}
}
더 이상 MyClass가 쓰이지 않는다면 익명 클래스를 통해 다음과 같이 나타낼 수 있다.
class AnonymousTest {
public static void main(String[] args) {
Age obj1 = new Age() {
@Override
public void getAge() {
System.out.print(age);
}
};
obj1.getAge();
}
}
또 다른 예제를 들면
import java.awt.*;
import java.awt.event.*;
class EventHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent");
}
}
public class InnerEx7 {
public static void main(String[] args) {
Button btn = new Button("Start");
btn.addActionListener(new EventHandler());
}
}
public class AnnTest {
public static void main(String[] args) {
Button btn = new Button("Start");
btn.addActionListener(new EventHandler());
}
}
위의 예제를 익명 클래스를 사용하여 아래와 같이 변환할 수 있다.
import java.awt.*;
import java.awt.event.*;
public class AnnTest {
public static void main(String[] args) {
Button btn = new Button("Start");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent");
}
});
}
}
익명 이너 클래스
- 이름이 없는 클래스이다.
- 익명 클래스는 정의된 위치에 따라 분류하는데, 클래스의 중괄호 바로 아래에 사용했을 때는 인스턴스 익명 이너 클래스, 메서드 내부에서 사용했을 때는 지역 익명 이너 클래스를 의미한다.
- 상속받은 추상클래스 또는 인터페이스를 객체로 생성해서 반환한다.
- 하나의 추상클래스를 상속받거나 또는 하나의 인터페이스를 바로 생성할 수 있다.
- 클래스 마지막에 세미콜론을 붙여 익명 내부 클래스를 표현함.
인터페이스를 상속한 이너 클래스를 생성해 인터페이스 객체 생성
class A{
C c =new B();
void abc(){
c.bcd();
}
class B implements C{
public void bcd(){
System.out.println("인스턴스 이너 클래스");
}
}
}
interface C{
public abstract void bcd();
}
public class AnonymousClass_1 {
public static void main(String[] args) {
A a = new A();
a.abc();
}
}
익명 이너 클래스를 활용해 인터페이스 객체 생성
class A{
C c = new C(){
public void bcd(){
System.out.println("익명 이너 클래스");
}
};
void abc(){
c.bcd();
}
}
interface C{
public abstract void bcd();
}
public class AnonymousClass_2 {
public static void main(String[] args) {
A a = new A();
a.abc();
}
}
인터페이스 C를 구현한 자식 클래스에서 새로운 메서드를 추가로 정의했을 때 알아보자.
interface C{
public abstract void bcd();
}
class B implements C{
public void bcd(){
}
public void cde(){
}
}
B b = new B();
b.bcd();
b.cde();
위와같이 자식클래스 타입으로 객체를 선언하고 생성하면 오버라이딩된 메서드(bcd())와 추가 메서드 (cde())모두 사용할 수 있다. bcd(), cde()메서드 모두 클래스 B 내부에서 정의되었고 참조변수가 B 타입이므로 두 메서드 모두 호출 가능함.
반면에 익명 이너 클래스를 사용 할 때는 무조건 부모 타입으로만 선언할 수 있어 추가로 정의한 메서드(cde())는 호출할 수 없다.
class A{
C c = new C(){
public void bcd(){
cde() //내부적으로 호출 가능
}
};
void cde(){
}
};
c.bcd();
c.cde(); // X
참고 한 곳
'Language > Java' 카테고리의 다른 글
[Java] 이너 인터페이스 (0) | 2022.04.03 |
---|---|
[Java] 인터페이스 타입의 입력 매개변수 전달 (0) | 2022.04.03 |
[Java] Interface(인터페이스) VS Abstract Class(추상 클래스) 차이점, 정리 (0) | 2022.04.03 |
[Java] 업캐스팅, 다운캐스팅 (0) | 2022.04.02 |
[Java] 메소드 오버라이딩 / 메소드 오버로딩 (0) | 2021.07.15 |