중첩 클래스와 중첩 인터페이스란?

2023. 11. 29. 09:29java/java

 

객체 지향 프로그램에서는 클래스들은 서로 긴밀한 관계를 맺고 상호작용을 한다. 어떤 클래스는 여러 클래스와 관계를 맺지만 어떤 클래스는 특정 클래스와 관계를 맺는다.

 => *다른 클래스에서는 특정 클래스에서만 종속적으로 쓰이는 경우에 하는 걸로 알고있다.

 

 중첩 클래스란 클래스 내부에 선언한 클래스를 말하는데, 중첩 클래스를 사용하면 두 클래스으 ㅣ멤버들을 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

public class ClassName {
    ...
    class NestedClassName {
    	...
    }
}

 

인터페이스도 클래스 내부에 선언할 수 있다. 이런 인터페이스를 중첩 인터페이스라고 한다. 중첩 인터페이스를 쓰는 이유는 해당 클래스와 긴밀한 관게를 맺는 구현 클래스를 만들기 위해서이다. 주로 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다고 한다. 

 

ex) View 클래스의 클릭 이벤트를 처리하는 구현 클래스를 만들 수 있도록 View 클래스 내부에 OnClickListener라는 중첩          인터페이스를 가지고 있다.

 public class View {
    //중첩 인터페이스
    public interface OnClickListener {
        void onClick(View view);
    }
}


======================================================================================


View.OnClickListener listener = new View.OnClickListener() {

    @Override
    public void onClick(View view) { // 사용자가 클릭한 위젯이 view 파라미터에 들어간다.
        //구현할 내용
        System.out.println("클릭!");
    }
};

 

 

 

 

중첩 클래스

- 중첩 클래스는 클래스 내부에 선언되는 위치에 따라서 두 가지로 분류된다.

  1. 클래스 멤버로서 선언되는 중첩 클래스를 멤버 클래스

  2. 메소드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 한다.

 

멤버 클래스는 클래스나 객체가 사용중이라면 재사용이 가능하지만, 로컬 클래스는 메소드 실행 시에만 사요되고 메소드가 종료되면 없어진다.

선언 위치에 따른 분류 선언 위치 설면
멤버 클래스 인스턴스 멤버 클래스 class A {
       class B {
       }
}
A 인스턴스 생성후 B 중첩 클래스 사용
정적 멤버 클래스 class A {
       static class B {
       }
}
A 클래스로 바로 접근할 수 있는 B 중첩 클래스
로컬 클래스 class A {
       void method() {
                class B {
               }
       }
}
method() 실행할 때만 사용 가능한 B 중첩 클래스

 

 

인스턴스 멤버 클래스

인스턴스 멤버 클래스는 static 키워드 없이 선언된 클래스이다. 인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

 => *실제로 인텔리제이에서 해봤는데 static이 선언이 된다... 버전업이 되면서 바뀐 것 같은데 릴리즈 노트를 좀 찾아 보고          포스팅 내용을 추가해야 겠다.

 

정적 멤버 클래스

모든 종류의 필드와 메소드를 선언할 수 있다.

 

로컬 클래스

로컬 클래스는 접근 제한자 및 static을 붙일 수 없다. 로컬 클래스는 메소드 내부에서만 사용하기 때문에 붙일 필요가 없다. 로컬 클래스 내부에서는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

    public void method2() {
        class A {
            A() {} //생성자
            int field;
            void method() {
                System.out.println("hello");
            }
            static final int field2 = 2;
            static void staticMethod() {
                System.out.println("hello sydney");
            }
        }

        System.out.println(A.field2);
        A.staticMethod();
    }

 => *마찬가지로 인텔리제이에서 해봤는데 static이 선언이 된다... 버전업이 되면서 바뀐 것 같은데 릴리즈 노트를 좀 찾아        보고 포스팅 내용을 추가해야 겠다.

 

로컬클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다. 주로 비동기 처리를 위한 스레드 객체를 만들 때 사용한다.

    void threadMethod() {
        class DownloadThread extends Thread {
            ...
        }
        
        DownloadThread thread = new DownloadThread();
        thread.start();
    }

'java > java' 카테고리의 다른 글

람다식 (1) - 기본 문법, 함수적 인터페이스  (1) 2023.12.07
Generic  (1) 2023.12.04
어노테이션  (2) 2023.11.26
UDP 네트워킹  (0) 2022.06.04
스레드 풀(1)  (0) 2022.05.07