자바의 객체지향 프로그래밍 내부

내부 클래스

간단히 말해서 내부 클래스 클래스 내에서 선언된 다른 클래스오전.

내부 클래스 사용 불필요한 데이터를 외부에 숨길 수 있으며 외부 클래스의 멤버에 쉽게 액세스할 수 있습니다.

이렇게 하면 코드의 복잡성을 줄일 수 있습니다.

내부 클래스로 인스턴스 내부 클래스, 정적 내부 클래스, 로컬 내부 클래스, 로컬 내부 클래스있다

유형 성명 사용 가능한 변수
인스턴스 내부 클래스 외부 클래스(내부 멤버 클래스)의 멤버 변수 선언 위치에 선언 외부 인스턴스 변수, 외부 전역 변수
정적 내부 클래스 외부 클래스(내부 멤버 클래스)의 멤버 변수 선언 위치에 선언 외부 전역 변수
로컬 내부 클래스 메서드 또는 외부 클래스의 초기화 블록 내부에 선언됨 외부 인스턴스 변수, 외부 전역 변수
익명 내부 클래스 클래스를 선언하고 동시에 객체를 생성하는 일회용 익명 클래스 외부 인스턴스 변수, 외부 전역 변수

인스턴스 내부 클래스

외부 클래스의 내부 클래스 인스턴스 생성된 개체 내에서 구성원으로 존재합니다.

그리고 외부 클래스의 모든 변수 및 메서드에 액세스할수있다.

public class Main {
    public static void main(String() args) {
        Outer outer = new Outer();
        System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
        outer.testClass(); // 내부 클래스 기능 호출
    }
}

class Outer { //외부 클래스
    private int num = 1; //외부 클래스 인스턴스 변수
    private static int sNum = 2; // 외부 클래스 정적 변수

    private InClass inClass; // 내부 클래스 자료형 변수 선언

    public Outer() {
        inClass = new InClass(); //외부 클래스 생성자
    }

    class InClass { //인스턴스 내부 클래스
        int inNum = 10; //내부 클래스의 인스턴스 변수

        void Test() {
            System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
        }
    }

    public void testClass() {
        inClass.Test();
    }
}

// 출력값

외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)

코드 흐름을 간단히 살펴보겠습니다.

  1. 메인 클래스~에 외부 클래스 인스턴스 생성(외부)
  2. 외부 클래스 생성자를 통해 내부 클래스(InClass)의 인스턴스 생성~ 후에 외부 클래스의 인스턴스 변수(inClass)에 할당
  3. ~ 후에 메인 클래스~에 외부 클래스 메서드 testClass()를 호출합니다.

  4. ~ 후에 내부 클래스의 inClass.Test() 메소드 호출
  5. 내부 클래스 메서드 inClass.Test()~에 외부 클래스의 전역 변수인 인스턴스 변수(num) 및 클래스 변수(sNum)에 대한 액세스

위에서 설명한 표준 방법 외에도 예기치 않은 상황도 구현했습니다.

메인 클래스에서 내부 클래스의 인스턴스를 생성할 수 없습니다.

그리고 이너 클래스의 인스턴스를 아우터 클래스 메서드에 반환함으로써 메인 클래스에서 접근이 가능하도록 했다.

public class Main {
    public static void main(String() args) {
        Outer outerClass = new Outer();	// 외부 클래스 생성
        outerClass.makeInnerClass().innerVariable = true;
        // 내부클래스의 변수 및 메서드에 접근 가능
    }
}

class Outer{
    Inner makeInnerClass(){	//메서드의 타입을 내부 클래스로 지정
        Inner innerClass = new Inner();	// 메서드에서 내부클래스 생성 후 리턴
        return innerClass;	
    }
    class Inner{
        boolean innerVariable;
    }
}

마지막으로 그만큼~이다 물체를 의미예를 들어 내부 인스턴트 클래스 내부사용할 때 내부 인스턴트 클래스에서 생성된 객체를 의미합니다.

외부 인스턴트 클래스도 있습니다.

그만큼가다 물체수단 인스턴스화는 불가피하다오전. 이런 이유로 모든 정적 멤버가 아님.

정적 내부 클래스

내부 클래스를 대신하여 공전당신이 넣으면 정적 내부 클래스정적 내부 클래스는 모든 인스턴스 리소스를 사용할 수 없습니다.

그 이유는 이전 포스팅에서 설명드린 바와 같습니다.

수납면적과 시기의 차이로 인해오전.

또 다른 차이점 메인 클래스에도 외부 클래스 객체를 만들지 않고 직접 내부 정적 클래스 객체를 만듭니다.

가능하다는 것입니다.

public class Main {
    public static void main(String() args) {
        Outer.StaticInClass a = new Outer.StaticInClass(); //정적 이너 클래스의 객체 생성
        a.test();
    }
}
class Outer { // 외부 클래스
    private int num = 3; // 외부 클래스의 인스턴스 변수
    private static int sNum = 4;

    void getPrint() {
        System.out.println("인스턴스 메서드");
    }

    static void getPrintStatic() {
        System.out.println("스태틱 메서드");
    }

    static class StaticInClass { // 정적 내부 클래스
        void test() {
            System.out.println("Outer sNum = " +sNum + "(외부 클래스의 정적 변수)");
            getPrintStatic();
            // num 과 getPrint() 는 정적 멤버가 아니라 사용 불가.
        }
    }
}



//출력값
Outer sNum = 4(외부 클래스의 정적 변수)
스태틱 메서드

복잡하네요… 블로그를 쓰다가 문득 깨닫고(?) 알게 되었습니다.

안과 밖을 가리지 않고 아주 간단하게 static으로 정의된 모든 메서드와 클래스는 인스턴스 메서드, 클래스 또는 변수에서 액세스할 수 없습니다.

하다.

class Test {
        Test2 test2;
    boolean a = true;
    void method(){
        method2();
        test2.b = true;
    }
    void method2(){
        test2 = new Test2();
        test2.b = true;
    }
    class Test2{
        boolean b = true;
        void innerMethod(){
            method();
        }
    }
}

위와 같이 모든 메서드와 내부 클래스가 서로 얽혀 있으며 그 중 하나라도 공전나랑 하면 공전해야만 했거나 공전입장한 회원에서 인스턴스 멤버를 호출하지 마십시오.

당연히 인스턴스에서 static을 호출하면 제대로 작동합니다.

그랬다.

마지막으로 두 사람의 공통점은 메인 클래스~에 내부 클래스에서 데이터에 액세스할 때 연산자 포인터( .) 사용 외부 클래스에서 액세스이루어져야 한다는 것입니다.

예) outerClass.makeInnerClass().innerVariable = true;