[JAVA] 내부 클래스

XXXX·2024년 1월 9일
0
post-thumbnail

내부 클래스

  • 클래스 in 클래스 (클래스 안에 선언한 클래스)
class Outer {
	...
	class Inner {
		...
	}
}

내부 클래스 특징

  • 내부 클래스에서 외부 클래스 멤버에 접근가능
  • 외부에서는 내부 클래스에 접근 불가

내부 클래스 종류

  • 인스턴트 클래스 (instance class) : 바깥 클래스를 만들어야 사용할 수 있는 형태
  • 정적 클래스 (static class) : 내부 클래스에 static이라는 키워드가 붙어서 바깥쪽 클래스가 만들어지지 않아도 사용할 수 있는 클래스
  • 지역 클래스 (local class) : 어떤 메소드 안에 클래스가 있는 형태
  • 익명 클래스 (anonymous class) : 이름을 가지지 않는 클래스, 선언과 동시에 객체 생성, 일회용 클래스
< 익명 클래스 구조 >
클래스이름 참조변수이름 = new 클래스 이름 () {
	...
};


// Java 프로그래밍 - 내부 클래스

// 내부 클래스 구조
class Outer {
    public void print() {
        System.out.println("Outer.print");
    }

    class Inner {
        public void innerPrint() {
            Outer.this.print(); // 내부 클래스에서 외부 클래스 접근
        }
    }

    static class InnerStaticClass {
        void innerPrint() {
//            Outer.this.print(); 내부 클래스인데 static이 붙어서 정적 특성을 갖기 때문에 바로 메모리에 올라감.
//            근데 Outer 쪽은 static이 아니라 메모리에 안 올라간다. 따라서 바로 사용할 수 있는 형태의 메소드는 아니기 때문에 오류가 뜬다.
//            정적 클래스는 내부로 접근이 사실상 되지 않는다.
        }
    }
}

abstract class Person { 	// 추상 클래스
    public abstract void printInfo(); // 출력 메소드
}

class Student extends Person { // 추상 클래스 상속 받기
    public void printInfo() {
        System.out.println("Student.printInfo");
    }
}

public class Main {

    public static void main(String[] args) {

//      외부 클래스
        Outer o1 = new Outer();

//      내부 클래스 - 인스턴스
        Outer.Inner i1 = new Outer().new Inner();
        // 외부 객체를 만든 다음 내부 객체를 만들어서 접근

//      내부 클래스 - 정적
        Outer.InnerStaticClass is1 = new Outer.InnerStaticClass();
        // 객체 생성은 따로 해주지 않아도 된다. (static 이기 때문!)

//      익명 클래스
        Person p1 = new Person() {
            @Override
            public void printInfo() {
                System.out.println("Main.printInfo");
            }
        };

    }

}

0개의 댓글