Ms'Note

Anonymous Class의 이해와 사용 방법 본문

IT/JAVA

Anonymous Class의 이해와 사용 방법

Jelly_B 2020. 9. 1. 14:13

익명 클래스(=무명 클래스)

  • 어떠한 인터페이스가 있고, 그 인터페이스를 이용하는 빈도수가 현저하기 적을 경우,
    클래스를 새로 만드는 것은 낭비일 수 있다.
  • 이 경우에 일회성으로 사용하기 위한 클래스의 정의 방법이 익명 클래스이다.

 

 

 

 

 

 

인터페이스의 정의와 암묵적 형변환에 따른 객체 선언

  • 인터페이스를 상속받는 클래스는 암묵적 객체 형변환의 조건에 따라 인터페이스에 대한 객체로 선언될 수 있다.
public interface MyInterface {
    public void foo();
}

public class Foo {
    public void myFunction() {
        MyInterface my;
    }       
}

 

 

 

 

 

 

익명 클래스의 생성

  • 인터페이스를 상속받는 별도의 클래스가 없는 상태이므로, 할당은 인터페이스 형식으로 이루어진다.
public class Foo {
    public void myfunction() {
        MyInterface my = new MyInterface();
    }
}

 

 

 

  • 하지만 인터페이스는 반드시 어딘가에 상속이 되어야만 사용이 가능하므로 상속된 '이름 없는 클래스'
    표현하기 위해 할당과 함께 클래스 정의를 위한 블록을 생성한다.
public class Foo {
    public void myFunction() {
        MyInterface my = new MyInterface() *{}*;
    }
}

 

 

 

 

 

 

 

익명 클래스 안에서의 메서드 오버라이드

  • 생성된 블록 안은 물리적으로는 Foo 클래스 안에 소속되어 있지만, 논리적으로는 어떤 이름 없는 클래스이다.
  • 인터페이스를 상속받는 형태이기 때문에 블록 안에서는 인터페이스에 대한 메서드 재정의가 이루어져야 한다.
public class Foo {
    public void myFunction() {
        MyInterface my = new MyInterface() {
        
            @Override
            public void foo() {
                System.out.println("Hello");
            }
        };
    }
}

 

 

 

 

 

 

 

익명 클래스는 선언, 할당, 구현이 한 번에 이루어진다.

  • 클래스의 정의 과정에서 이미 my 객체에게 모든 기능이 할당되었으므로, 바로 기능을 활용할 수 있다.
public class Foo {
    public void myFunction() {
        MyInterface my = new MyInterface() {
            
            @Override
            public void foo() {
                System.out.println("Hello");
            }
        };
        my.foo();
    }
}

 

 

 

 

 

 

 

익명 클래스 사용의 제약

public class Foo {
    private int value1 = 100;     // 상위 클래스의 멤버변수
    public void myFunction() {
        int value2 = 200;         // 상위 메서드의 지역변수
        final int value3 = 300;   // 상수 형태의 데이터
        MyInterface my = new MyInterface() {
            @Override
            public void foo() {
                // 상위 클래스의 멤버변수는 사용 가능
                System.out.println(value1);
                // 상위 메서드의 지역변수는 사용 불가 (에러 발생)
                Systeom.out.println(value2);
                // 상수 형태의 데이터는 사용 가능
                System.out.println(value3);
            }
        };
    }
}

'IT > JAVA' 카테고리의 다른 글

ClassPath  (0) 2020.09.01
Package  (0) 2020.09.01
Inner Class의 사용 방법  (0) 2020.08.27
Inner Class의 이해  (0) 2020.08.27
SingleTon 객체 생성 과정  (0) 2020.08.27
Comments