[Java] Anonymous class


Anonymous class


Anonymous class(匿名クラス)は、その名の通り名前のないLocal内部クラスです.
名前がないため、コンストラクション関数として作成するのではなく、クラスを定義しながらインスタンスを作成します.

Java例1


ソースコード

  • Person Local inner class
  • public class Person {
    	private String name;
        
        public Person(String name) {
        	this.name = name.;
        }
        
        public MyReadable createInstance(int age) {
    
            MyReadable person = new MyReadable() {
          	    @Override
                public voidi 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は、PersonWithAgeというクラスを指定して生成します.
    ただし、Anonymous inner classはその名の通り익명内部クラスであるため、個別に指定されたクラスは存在しない.
    MainではAnonymous Inner 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();
        }
    }

    実行結果



    Java例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)を使用して匿名の内部クラスを作成できることを示している.

    実行結果



    Java例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クラス概念
  • メンバー内部クラスの例
  • ネストされたクラスの例
  • Local inner classの例