티스토리 뷰

1. 정의

클래스 내부에 선언한 클래스, 클래스 내부에 선언한 인터페이스.

이렇게 내부에 선언하면, 두 클래스의 멤버 접근이 쉽고 하나의 클래스로 여러 클래스를 쓰는 효과가 있다.


2. 선언 및 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package NestedClass;
 
public class nestedClass {
    
    class instanceMemberClass{
        public instanceMemberClass() {
            // TODO Auto-generated constructor stub
        }
        int instanceField;
        void instanceMethod() {System.out.println("인스턴스 클래스 메소드");};
        //static void or static int는 당연히 사용불가능하다.
    }
    
    static class stMemberClass{
        public stMemberClass() {
            // TODO Auto-generated constructor stub
        }
        static int a = 10;
        static void m() {System.out.println("static memeber method");};
        int b = 30;
    }
    
    void method() {
        class localClass {
            public localClass() {
                // TODO Auto-generated constructor stub
            }// method 사용시에 생성될 수 있기 때문에 static, public 등 불가능.
            int a = 30;
            // a=20; 불가능, a는 로컬변수의 필드는 final 특성을 가짐.
            void b() {System.out.println("localClass " + a);};
        }
        localClass a = new localClass();
        a.b();
        
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        nestedClass a = new nestedClass();
        nestedClass.instanceMemberClass b = a.new instanceMemberClass();
        b.instanceMethod();
        // 인스턴스 멤버 클래스는 a가 생성되야만 생성가능
        nestedClass.stMemberClass c = new nestedClass.stMemberClass();
        c.m();
        // 정적 멤버클래스므로 a 상관없이 바로 생성가능.
        a.method();
        // local 변수 사용 예제, 중요한 점은 local 변수의 필드는 final 특성을 갖고 있다.
    }
 
}
 
cs


3. 중첩 인터페이스

: 클래스의 멤버로 선언된 인터페이스로, 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해 사용한다.

주로, UI 프로그래밍에서 비동기적으로 이벤트를 처리할 목적으로 사용


class A {

    interface I {

      void method();

    }

}


 예) 버튼을 클릭했을 때 이벤트를 처리하고 싶다고 하고, 아무 객체나 받으면 안 되고, 버튼 내부에서 선언된 중첩 인터페이스를 구현한 객체만 받아야 한다고 한다면, 아래와 같이 Button클래스를 선언하면 됩니다.




public class Button {

 OnClickListener listener;


 void setOnClickListener(OnClickListener listener) {

  this.listener = listener;

 }


 void touch() {

  listener.onClick();

 }


 interface OnClickListener {

  void onClick();

 }

}


 


아래 예제는 버튼을 클릭했을 때 두 가지 방법으로 이벤트를 처리하는 방법을 보여주는 예제입니다.

어떤 구현 객체를 생성해서 Button 객체의 setOnClickListener() 메서드를 세팅하느냐에 따라서 Button의 touch() 메서드의 실행 결과가 달라집니다.


중첩 인터페이스


public class Button {

 OnClickListener listener;


 void setOnClickListener(OnClickListener listener) {

  this.listener = listener;

 }


 void touch() {

  listener.onClick();

 }


 interface OnClickListener {

  void onClick();

 }

}


구현 클래스1


public class CallListener implements Button.OnClickListener {

                                         Button클래스의 중첩인터페이스


 @Override

 public void onClick() {

  System.out.println("전화를 겁니다.");

 }

}



구현 클래스2

public class MessageListener implements Button.OnClickListener {

 @Override

 public void onClick() {

  System.out.println("메시지를 보냅니다.");

 }

}



실행 클래스

public class ButtonExample {

 public static void main(String[] args) {

  Button btn = new Button();

  btn.setOnClickListener(new CallListener());

  btn.touch();

  btn.setOnClickListener(new MessageListener());

  btn.touch();

 }

}


4. 익명 객체

익명구현객체(Anonymouse class)란 말 그래도 이름이 없는 객체이다.일반적으로 인터페이스를 사용하기 위해서는 해당 인터페이스를 구현한 클래스를 만들어야 한다. 예를 들어 하나의 인터페이스를 구현하는 클래스 3개를 만든다면, 3개의 java파일을 미리 만들어야 한다. 하지만 만약 재사용이 불필요한 구현클래스가 필요할땐 어떻게 해야 할까? 한번만 사용할 소스코드를 XXX.java 라는 파일로 만들고 그 것을 파일로 관리 해야만 할까? 프로그래밍에서 관리의 대상이 많아지는 것은 그 만큼 유지보수의 비용이 증가한다는 의미이다.

이렇게 일회성이며, 재사용할 필요 없고 파일단위의 관리 대상이 아닌 객체를 만들때 이 익명구현객체라는 것을 활용 할 수 있다. 문법 형태는 다음과 같다.

1
2
3
4
5
6
인터페이스명 변수 = new 인터페이스명(){
//인터페이스에 선언된 추상메소드의 구현 메소드
//해당 인터페이스에 선언된 모든 추상메소드를 구현해야 한다. 없을시 컴파일 에러 발생
//추가적으로 필드와 메소드를 선언 할 수 있지만, 익명객체 안에서만 사용할수있다.
//익명구현객체도 컴파일시 클래스파일이 만들어 지긴한다. 인터페이스명$1(순번)
}; //익명 클래스의 선언은 하나의 실행문이므로 끝에 세미콜론(;)이 무조건 붙는다.

간단한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//구현할 인터페이스
interface Car{
public void run();
public void stop();
}

public class AnonymouseTest1 {

public static void main(String[] args) {
//익명구현 객체 fooCar
Car fooCar = new Car(){
public void run(){
System.out.println("달려라!");
}

public void stop(){
System.out.println("머.. 멈춰!!!");
}
};

fooCar.run();
fooCar.stop();
}

}

실행결과

1
2
달려라!
머.. 멈춰!!!

즉 한번 쓰고 버릴 객체가 필요할때 이 익명구현객체란 것을 이용할 수 있다.
익명구현객체는 java8의 람다식이나 UI 프로그래밍에서 이벤트의 처리용으로 많이 사용되기 때문에 그 형태를 알아둘 필요가 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함