반응형
Anonymous class
익명 클래스는 말 그대로 이름이 없는 Local inner class이다.
이름이 없으므로 생성자로 만들 수 없고, 클래스의 정의와 동시에 인스턴스를 생성한다.
💻 예제 1
📝 소스 코드
- Person
public class Person {
private String name;
public Person(String name) {
this.name = name.;
}
public MyReadable createInstance(int age) {
MyReadable person = new MyReadable() {
@Override
public void readInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println();
}
};
retrun person;
}
}
interface MyReadable {
public abstract void readInfo();
}
🤔 Local inner class에서 본 Person 예제와 다른 점은 무엇일까?
Local inner class 에서는 class PersonWithAge implements MyReadable로 PersonWithAge 라는 클래스를 명시하여 생성하였다. 그러나 Anonymous inner class는 말그대로 익명 내부 클래스이므로 따로 명시된 클래스가 존재하지 않고, 바로 MyReadable() 객체를 생성해주었다.
Main에서도 바로 Anonymous class를 사용할 수 있다.
- Main
public class Main {
public static void main(String[] args) {
System.out.println("Anonymous Inner Class (익명 내부 클래스)\n");
Person p = new Person("홍길동");
MyReadable r = person.craeteInstance(30);
r.readInfo();
System.out.println();
// Anonymous 01
MyReadable r2 = new MyReadable() {
int age = 10;
@Override
public void readInfo() {
System.out.println("age = " + age);
System.our.println();
}
};
r2.readInfo();
// Anonymous 02
new MyReadable() {
int age = 20;
@Override
public void readInfo() {
System.,out.println("age = " + age);
System.our.println();
}
}.readInfo();
}
}
📄 실행 결과
💻 예제 2
📝 소스 코드
- Main
public class Main {
public static void(String[] args) {
System.out.println("Anonymous Inner Class\n");
// Anonymous 01
System.out.println(new MyAbstract() {
int c = 3;
@Override
int sum(int a) {
return a + b + n + c;
}
}.sum(10));
System.out.println();
// Anonymous 02
System.out.println(new MyClass() {
int d = 40;
@Override
int sum(int c) {
return a + b + c + d;
};
}.sum(30));
}
}
abstract class MyAbstract {
int a = 1;
int b = 2;
abstract int sum(int a);
}
class MyClass {
int a = 10;
int b = 20;
int sum(int c) {
return a + b + c;
}
}
System.out.println() 메소드 내에서 익명 내부 클래스를 만들어 실행하여 출력되게 한다.
예제 1에서는 인터페이스(MyReadable)를 이용해 익명 내부 클래스를 만들었다.
예제 2에서는 추상 클래스(MyAbstract)와 일반 클래스(MyClass)를 이용해서 익명 내부 클래스를 만들었다.
📄 실행 결과
💻 예제 3
클래스를 상속 받아서 구현하는 방법과 익명 클래스를 사용하는 방법이 어떻게 다른지도 살펴본다.
📝 소스코드
public class Main {
public static void main(String[] args) {
System.out.println("익명 내부 클래스 활용\n");
System.out.println("1. 상속 받아서 구현하는 방법");
Calculable c1 = new MyMath();
double result = c1.operate(1.0, 2.0);
System.out.println("result = " + result);
System.our.println();
System.out.println("2. 익명 클래스 사용");
Calculable c2 = new Calculable() {
@Override
public double operate(double x, double y) {
return x * y;
}
};
System.out.println("result = " + c2.operate(3.0, 4.0));
System.out.println("result = " + new Calculable() {
@Override
public double operate(double x, double y) {
return Math.pow(x, y);
}
}.operate(5.0, 2.0));
}
}
inferface Calculable {
public abstract double operate(double x, double y);
}
class MyMath implements Calculable {
@Override
public double operate(double x, double y) {
return x + y;
}
}
📄 실행 결과
Inner class 개념
Member inner class 예제
Nested class(Static inner class) 예제
Local inner class 예제
반응형