ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 중첩 클래스
    프로그래밍/JAVA 2022. 8. 11. 22:23
    728x90

     

     

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

    class ClassName{
        class Name{ // 중첩 클래스
        }
    }

     

     

    인터페이스도 클래스 내부에 선언할 수 있는데, 이런 인테페이스를 중첩 인터페이스라고 한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들 수 있기 때문이다.

    class ClassName{
        interface Name{ // 중첩 인터페이스
        }
    }

     

     


     

     

    내부 클래스(Inner Class)

    내부 클래스는 static 키워드 없이 중첩 선언된 클래스를 말하며, 클래스 또는 메소드 안에 또 다른 클래스를 만드는 것으로 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

    class OuterClass {
        private int num1 = 10;
    
        public void method1() {
            System.out.println("num1 : " + num1);
        }
    
        class InnerClass {  // innerClass 생성
            private int num2 = 20;
    
            public void method2() {
                System.out.println("InnerClass.num1 : " + num1);
                // InnerClass.num1 : 10
                System.out.println("InnerClass.num1 : " + num2);
                // InnerClass.num1 : 20
            }
        }
    
        public void printInner() {
            InnerClass innerClass = new InnerClass();
            innerClass.method2();
        }
    }
    
    public class InnerClass {
        public static void main(String[] args) {
            OuterClass outerClass = new OuterClass();
            outerClass.method1();  // num1 : 10
            outerClass.printInner();
            System.out.println();
            OuterClass.InnerClass innerClass = outerClass.new InnerClass();
            // innerClass 선언 방법
            innerClass.method2();
        }
    }
    
    
    /* 실행결과
    num1 : 10
    InnerClass.num1 : 10
    InnerClass.num1 : 20
    
    InnerClass.num1 : 10
    InnerClass.num1 : 20
    */

     

     

    로컬 클래스(Local Class)

    중첩 클래스를 메소드 내에서도 선언할 수 있는데, 이것을 로컬클래스라고 함. 로컬 클래스는 접근 제한자 및 static를 붙일 수 없고 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언할 수 없다. 지역 변수는 접근 할 수 없지만, final로 선언된 상수는 접근 가능하다.

    public class LocalClass {
        private int num1 = 10;
    
        public void method1() { // 3번. 메소드 내
            int num2 = 20;
    
            class Local { // 로컬 클래스 생성
                private int num3 = 30;  // 인스턴스 필드
    
                public void method2() {  // 6. 인스턴스 메소드
                    System.out.println("num1 : " + num1); // num1 : 10
                    System.out.println("num2 : " + num2); // num1 : 20
                    System.out.println("num3 : " + num3); // num1 : 30
                }
            }
            Local local = new Local(); // 4. 로컬 클래스 객체 선언
            local.method2(); // 5. method2() 호출
            local.num3 = 10;
        }
    
        public static void main(String[] args) {
            LocalClass localClass = new LocalClass(); // 1. 객체 선언
            localClass.method1();  // 2번. method1() 호출
        }
    }
    
    
    /* 실행결과
    num1 : 10
    num2 : 20
    num3 : 30
    */

     

     

    Static 클래스

    static 클래스는 static 키워드로 선언된 클래스를 의미하며, 모든 종류의 필드와 메소드를 선언할 수 있고 외부 클래스에 관계없이 객체를 생성할 수 있다.

    public class StaticClass {
        static class Static{  // static 클래스 생성
            int num = 0;  // 인스턴스 필드
            public void plus(){ // 3. 인스턴스 메소드
                num++;
            }
        }
    
        public static void main(String[] args) {
           StaticClass.Static Static = new StaticClass.Static(); 
            // 1. static 클래스 객체 생성
           Static.plus();  // 2. 메소드 호출
           System.out.println(Static.num); // 4. 1
        }
    }
    
    
    /* 실행결과
    1
    */

     

     

    익명 클래스(Anonymous Class)

    익명 클래스는 클래스를 정의하지 않고 객체를 정의할 때 사용되며, 1회용 클래스이므로 재활용이 불가능하다.

    interface Inter2{
        String method2();
    }
    class TestClass2 implements Inter2 {
        public String method2(){
            return "실명 클래스";
        }
    }
    class TestClass3{
        public void method3(Inter2 inter2){     
        // 인터페이스인 Inter2를 구현한 객체(TestClass2)만 진입 가능
            System.out.println(inter2.method2());
        }
    }
    public class Anonymous {
        public static void main(String[] args) {
            TestClass2 testClass2 = new TestClass2();
            TestClass3 testClass3 = new TestClass3();
            testClass3.method3(testClass2);
    
            testClass3.method3(new TestClass2(){
            // 참조변수 없이 직접 구현하는 방법
                @Override
                public String method2() {
                    return "익명객체";
                }
            });
        }
    }
    
    
    /* 실행결과
    실명 클래스
    익명객체
    */

     

     

     

     

     

    728x90

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

    [Java] DB와 연동하기  (0) 2022.08.12
    [Java] 제네릭(Generic) 타입  (0) 2022.08.11
    [Java] 입출력 스트림(Stream)  (0) 2022.08.10
    [Java] 예외처리(Exception)  (0) 2022.08.10
    [Java] Map 컬렉션 클래스  (0) 2022.08.09

    댓글

Designed by Tistory.