자바 이론

[Java] non-static 클래스 (내부 클래스)

easy-6 2025. 3. 21. 00:01

내부(non-static) 클래스는 자바에서 클래스 내부에 정의된 클래스를 의미하며, 특별히 인스턴스 내부 클래스라고도불림

예시로 아래의 코드를 들 수 있다. 

public class NonStaticClassExample { // 외부 클래스

    // 인스턴스 내부 클래스 (non-static 내부 클래스)
    class A {  
        public A() { 
            System.out.println("A의 생성자 호출");
        }

        public void AMethod() {
            System.out.println("A의 메소드 실행");
        }

        public void overMethod() {
            System.out.println("A의 오버라이딩 전 메소드");
        }
    }

    class B extends A {
        public B() {
            super();
            System.out.println("B의 생성자 호출");
        }

        public void BMethod() {
            System.out.println("B의 메소드 실행");
        }

        @Override
        public void overMethod() {
            System.out.println("A의 메소드를 오버라이딩한 B 메소드");
        }
    }

    public static void main(String[] args) {
        NonStaticClassExample nsce = new NonStaticClassExample(); // 외부 클래스 객체 생성

        // (1) 부모 타입 변수 = new 자식 타입() (O, 정상 작동)
        A a = nsce.new B();  
        a.AMethod();    // A타입의 AMethod() 실행 
        a.overMethod();  // 동적 바인딩으로 B의 메소드 실행

        // (2) 자식 타입 변수 = new 자식 타입() (O, 가능하지만 권장되지 않음)
        B b = nsce.new B(); 
        b.BMethod();  // 자식 클래스의 메소드 실행
        b.AMethod();  // 부모 메소드 실행 가능
        b.overMethod();  //동적 바인딩으로 오버라이딩된 메소드 실행

        // (3) 잘못된 코드 예시
        // B bb = nsce.new A(); // (🚫) 불가능: A 객체는 B의 기능을 포함하지 않음.
        /*
        	자세한 설명 
        	B타입은 A타입에게 상속받아 A타입의 메소드를 포함한 A타입과 B타입의 고유 기능을 가지나
            A타입을 참조하는 형태를 가지게 된다면, 이전에 가진 B타입의 고유한 기능을 
            사용하지 못하기 때문에 허용되지 않는다.
        */
    }
}

 

위의 코드를 자세하게 나눌 수 있다. 

 

1. 외부 클래스 선언 

public class NonStaticClassExample { // non-static 클래스 선언 
}

 

2. 외부 클래스에 내부 클래스 선언 

public class NonStaticClassExample { // non-static 클래스 선언 

    public class A{ // A 클래스 선언 

    }



	public class B{ // B 클래스 선언 
    
    }


	public static void main (String []args){ // 메인 클래스 선언 
    
    }
    
    
    
}

 

 

3.  외부 클래스의 인스턴스에 종속적이며 내부 클래스는 외부 클래스의 인스턴스와 연결되어 있다.

>> 즉, 내부 클래스의 객체를 생성하려면 외부 클래스의 객체가 필요함 

NonStaticClassExample nsce = new NonStaticClassExample();
nsce.A a = nsce.new A();

 

4. non -static의 장점??

non-statuc을 통해서 캡슐화를 할 수 있음 

캡슐화  ::  외부 기능과 관련된 기능을 내부 클래스로 분리하여 외부에 노출할 필요가 없는 구현 세부사항을 감출 수 있음 

'자바 이론' 카테고리의 다른 글

[JAVA] 배열과 리스트의 차이 toString()  (0) 2025.04.02
[JAVA] 소수 찾는 로직  (0) 2025.03.26
[java]HttpServletRequest  (0) 2024.12.12