내부클래스

HYUNBIN CHO·2021년 7월 9일
0

java

목록 보기
21/23
post-thumbnail

🔷 내부클래스

🔸 클래스 내에 선언된 클래스

🔹장점

- 내부클래스에서 외부클래스의 멤버에 쉽게 접근할 수 있다.
- 불필요한 코드를 감춤으로써 코드를 간결하게 할 수 있다.

🔷 종류 및 특징

🔸 내부클래스의 종류는 변수의 선언위치에 따른 종류와 동일하다.
🔸 내부클래스는 변수와 비슷한 성질과 유효범위를 가진다.
   - 인스턴스 클래스 : 외부 클래스 멤버변수 선언위치에 선언, 외부클래스의 인스턴스 멤버와 관련된 작업에 사용
   - static 클래스 : 외부 클래스 멤버변수 선언위치에 선언, 외부클래스의 static클래스, 메서드에서 사용
   - 지역 클래스 : 외부 클래스의 메서드 혹은 초기화 블럭 내에 선언, 선언된 영역 안에서만 사용
   - 익명클래스 : 이름없는 일회용 클래스, 클래스의 선언과 객체의 생성을 동시에 함

🔷 선언

/* 외부클래스 */
class Outer{ 
    /* 내부클래스 */
    class InstanceInner{} // 인스턴스 클래스
    static class StaticInner{} // static클래스
    void myMethod(){
        class LocalInner{} // 지역클래스
    }
}

🔷 제어자

🔸 내부클래스도 일반클래스와 마찬가지로 abstract, final등의 제어자, public, private등의 접근제어자도 사용 가능하다

class Outer{
    private class InstanceInner{}
    protected static class StaticInner{}
    void myMethod(){
        class LocalInner{}
    }
}

🔸 static변수는 static클래스 내에서만 선언이 가능하다
🔸 final과 static이 같이 붙은 경우는 상수이기 때문에 모든 내부클래스에서 정의할 수 있다.

🔸 내부클래스는 변수와 비슷한 유효범위와 성질을 가진다고 했다
➡️ 변수는
🔸 인스턴스 멤버는 같은 클래스에 있는 인스턴스 멤버, static멤버 모두 직접 호출 가능
🔸 static멤버는 인스턴스 멤버를 호출할 수 없음.
➡️ 내부클래스도 변수와 마찬가지로
🔸 인스턴스 클래스는 외부 클래스의 인스턴스 멤버와 static클래스를 객체 생성없이 바로 사용할 수 있음
🔸 static 클래스는 외부 클래스의 인스턴스 멤버와 인스턴스 클래스를 객체 생성없이 사용할 수 없음

class Outer{
    int value = 50; // Outer.this.value
    class Inner{
        int value = 100; // this.value
        void method(){
            int value = 200;
            System.out.prinln("value = " + value);
            System.out.prinln("this.value = " + this.value);
            System.out.prinln("Outer.this.value = " +  Outer.this.value);
        }
    }
   
    class InstanceInner{
        int iv = 100;
    }
    static class StaticClass{
        int iv = 200; 
        static int cv = 300;
    }
    void myMethod(){
        class LocalClass{
            int iv = 400;
        }
    }
   
}

class Test{
    public static void main(String[] args){
        // 인스턴스의 인스턴스를 생성하려면 외부클래스의 인스턴스를 먼저 생성해야한다.
        Outer outer = new Outer();

        // 내부클래스 객체생성
        Outer.InstanceInner instanceInner = outer.new InstanceInner();
        Outer.Inner inner = Outer.new Inner();
        System.out.println(instanceInner.iv);
        inner.method();

        // static클래스는 외부클래스를 먼저 생성하지 않아도 사용가능함.
        Outer.StaticInner staticInner = new Outer.StaticInner();
        System.out.println(staticInner.iv);
    }
}

🔷 익명클래스

🔸 이름이 없기 때문에 단 한번만 사용할 수 있고, 하나의 객체만을 생성할 수 있는 일회용. 생성자 또한 가질 수 없다.

new 조상클래스 이름 or 구현인터페이스 이름(){
    ...
}
class Test{
    public static void main(String[] args){
        Button button = new Button("시작");
        button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ac){
                    System.out.println("이벤트발생");
                }
            } // 익명 클래스 끝
        );
    }
}
profile
백견이 불여일타

0개의 댓글

관련 채용 정보