stackoverflow.com/questions/355167/how-are-anonymous-inner-classes-used-in-java

 

How are Anonymous inner classes used in Java?

What is the use of anonymous classes in Java? Can we say that usage of anonymous class is one of the advantages of Java?

stackoverflow.com

2020/12/08 - [JAVA] - 내부 클래스

 

내부 클래스

내부 클래스  일반적으로 자바나 c++ c# 등 기본적으로 클래스 생성들은 대부분 외부 클래스를 해당됩니다. 그렇다면 외부 클래스 안에 존재하는 클래스들 내부 클래스라고합니다. 그렇다면 왜?

kwaksh2319.tistory.com

 

일반적으로 안드로이드에서 버튼 사용 이벤트가 익명 내부 클래스를 사용하는 방식입니다.

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do something
    }
});

 

 

stackoverflow.com/questions/38387541/what-is-the-use-case-and-advantage-of-anonymous-class-in-java?noredirect=1&lq=1

 

What is the use case and advantage of Anonymous class in java?

What i know about Anonymous class is when you have any class or interface , and only someof your code need to implement or override some class or interface Anonymously ,it increases the readability...

stackoverflow.com

 익명 내부 클래스란?

위의 stackoverflow의 베스트글을 빌리자면 

익명클래스를 정의하는것을 외부클래스에서 인스턴스화 시키지 않고 정의할수 잇는셈이다. 

 

그렇다면 왜 익명클래스를 사용할까?
익명 클래스는 어플리케이션의 필요한 자바 파일의 숫자를 줄이고 시간을 아낄수 있습니다. 

Comparator와 같은 특수한 상황이 발생했을때 즉석으로 object를 생성할 일이 있을수 있습니다.

Ex)

Collections.sort (aList, 
    new Comparator () { // implements the IF 
        public int compare (ObjectType o1, ObjectType o2 ) throws ..{ 
            //.... implementation for compare() 
        } // end of compare() 
    } // end of Comparator implementation
); // closed paren for sort() and end of statement semicolon

*Comparator?

정렬 수행시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스

그리고 익명 클래스를 선호한다면 많은 사람들이 GUI에 listeners같은것들을 확장하는데 사용할것 입니다. 협업에 좋은것같습니다.

 

위의 코드를 보면 sort 함수 내의 new Comparator ()를  사용하여  public int compare (ObjectType o1, ObjectType o2 ) 비교할수를 이용합니다.

 

그렇다면 한번 익명 클래스를 사용해보겠습니다. 

메인 클래스:

package Test01;



public class Main {

  
	public static void main(String [] args)  {
	
	   
	   //익명 클래스 
	   MyAnonmymous myAnonmymous= new MyAnonmymous();//outer 클래스 
	   
	  MyAnonmymousInterface myAnonmymousInterface=myAnonmymous.getMyAnonmymousInterface("Anonymoous"); //new MySubAnonmymous
	  myAnonmymousInterface.Print();//MySubAnonmymous print 함수 출력 
	 
	}
	
}Java 

익명 클래스:

package Test01;



interface MyAnonmymousInterface{
	void Print();
}


public class MyAnonmymous {
	
	
	
	MyAnonmymousInterface getMyAnonmymousInterface(String alpa){
	    //익명 클래스
		final class  MySubAnonmymous implements MyAnonmymousInterface{
	            @Override
	            public void Print() {
	            // TODO Auto-generated method stub
	            	System.out.println(alpa);
	            
	            }
		   
		
	  }
	return new MySubAnonmymous();
	
	}

 

익명 클래스를 먼저 확인해보겠습니다.

MyAnonmymous클래스는 외부클래스 이며  MySubAnonmymous 익명 내부 클래스, MyAnonmymousInterface 인터페이스 입니다.

그렇다면 MySubAnonmymous 익명 내부 클래스를 확인해보면 

final class  MySubAnonmymous implements MyAnonmymousInterface{
	            @Override
	            public void Print() {
	            // TODO Auto-generated method stub
	            	System.out.println(alpa);
	            
	            }
		   
		
	  }

MyAnonmymousInterface 인터페이스를 기능을 상속받습니다. 그렇다면 Print()함수를 오버라딩을 할수 있습니다.

그리고 이 클래스를 함수화를 시킵니다 .

 

MyAnonmymousInterface getMyAnonmymousInterface(String alpa){
	    
        
        
       { //익명 클래스
         ......
        
        }
        
        return new MySubAnonmymous();
        }

현재 익명 클래스를 return 해줌과 동시에 인스턴스화를 시킵니다. 

그렇다면 다시 메인으로 돌아가보겠습니다.

 

메인에 선언된 클래스를 확인해보겠습니다.

 //익명 클래스 
	   MyAnonmymous myAnonmymous= new MyAnonmymous();//outer 클래스 
	   
	  MyAnonmymousInterface myAnonmymousInterface=myAnonmymous.getMyAnonmymousInterface("Anonymoous"); //new MySubAnonmymous
	  myAnonmymousInterface.Print();//MySubAnonmymous print 함수 출력 

 MyAnonmymous 외부 클래스를 먼저 myAnonmymous로 인스턴스화 시켰습니다.

전역에 존재하는 인스턴스 MyAnonmymousInterface myAnonmymousInterface로 인스턴스 한후에 

myAnonmymous(외부 클래스 인스턴스).getMyAnonmymousInterface("Anonymoous"); myAnonmymous 외부 클래스의 함수를 불러옵니다.

 

이전에 기억한다면 getMyAnonmymousInterface함수는 

익명 클래스를 가지고 있는 MyAnonmymous 외부 클래스에 존재하는 함수입니다.

MyAnonmymousInterface getMyAnonmymousInterface(String alpa){
	    
        
        
       { //익명 클래스
         ......
        
        }
        
        return new MySubAnonmymous();
        }

여기서 new MySubAnonmymous(); 리턴해줌으로써 myAnonmymousInterface에 MySubAnonmymous가 익명으로 인스턴스화가 됩니다 .

그리고 아래와 같이 Print를 한다면 

myAnonmymousInterface.Print();

MyAnonmymous 외부 클래스에 존재하는 익명 내부 클래스인 MySubAnonmymous의 Print함수를 호출합니다.

final class  MySubAnonmymous implements MyAnonmymousInterface{
	            @Override
	            public void Print() {
	            // TODO Auto-generated method stub
	            	System.out.println(alpa);
	            
	            }
		   
		
	  }

결과 : 

PS. 솔직하게 말해서 익명 클래스는 아직 왜 어디서 사용해야하는지 의문이 잘 없어지진 않았습니다.

그래도 분명 이 익명 클래스가 일단 위의 말처럼 협업에 사용시 도움이 된다고 하니 열심히 쓰려고 노력해야할것같습니다.

 

'프로그래밍언어 > JAVA' 카테고리의 다른 글

<JAVA>Stream-1  (0) 2020.12.09
<JAVA>람다식  (0) 2020.12.09
<JAVA>내부 클래스  (0) 2020.12.08
<JAVA>Collection Set,Map  (0) 2020.12.07
<JAVA>Generic - 제네릭 프로그래밍  (0) 2020.12.07

+ Recent posts