내부 클래스(inner class)

정순동·2023년 12월 8일
0

자바기초

목록 보기
37/89

내부 클래스

내부 클래스란? 클래스 내에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 간단하다. 두 클래스가 서로 긴밀한 관계에 있기 때문이다.
내부 클래스 형태로 클래스를 선언하면 멤버들 간에 서로 수비게 접근할 수 있다는 장점과 외부에는 감춤으로써 캡슐화를 할 수 있다는 장점이 있다.

내부 클래스의 장점

  • 내부 클래스에서 외부 클래스 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다(캡슐화).

아래 클래스 A,B를 일반적인 방법으로 정의해 보자.

	class A {}
    class B {}

B클래스를 A클래스 내부에 정의하게되면 아래와 같다.

	class A { //외부 클래스
    	class B { //내부 클래스
        }
    }

이때 내부 클래스인 B는 외부 클래스인 A를 제외하고는 다른 클래스에서 잘 사용되지 않는 것이어야 한다.

내부 클래스의 종류와 특징

내부 클래스의 종류는 변수의 선언위치에 따른 종류와 같다고 볼 수있다. 변수의 선언위치에 따라 인스턴스 변수, 클래스 변수, 지역변수로 구분되는 것과 같이 내부 클래스도 선언위치에 따라 다음과 같이 구분되어 진다.

내부 클래스의 선언

변수의 선언위치와 같게끔 아래 Outer클래스 안의 내부 클래스를 구성해 보았다. 위와 아래 코드를 비교해서 보자

	class Outer {
    	int iv = 0;	// 인스턴스 변수
        static int cv = 0; // 클래스 변수
        
        void myMethod() {
        	int lv = 0; // 지역 변수
        }
    }
    
    class Outer {
    	class InstaceInner {} // 인스턴스 내부 클래스
        static class StaticInner {} // 클래스 내부 클래스
        
        void myMethod() {
        	class LocalInner {} // 지역 내부 클래스
        }
    }

내부 클래스에서 static메서드를 만들려면 꼭 클래스 내부 클래스이어야 한다. static innerClass이어야만 해당 클래스 안에 static메서드를 생성할 수 있다.

내부 클래스 예제

	class Example {
    	class InstanceInner {}
        static class StaticInner {}
        
        // 인스턴스 멤버 간에는 서로 직접 접근이 가능하다.
        InstanceInner iv = new InstanceInner();
        // static 멤버 간에는 서로 직접 접근이 가능하다.
        static StaticInner cv = new StaticInner();
        
        static void staticMethod() {
        	// static 멤버는 인스턴스 멤버에 직접 접근할 수 없다.
          //InstanceInner obj1= new InstanceInner(); 에러!
            StaticInner obj2 = new StaticInner();
            
            // 굳이 접근하려면 아래와 같이 객체를 생성해야 한다.
            // 인스턴스 클래스는 외부 클래스를 먼저 생성해야만 생성할 수 있다.
            Example outer = new Example();
            InstanceInner obj1 = outer.new InstanceInner();
        }
        
        void instanceMethod() {
        	// 인스턴스 메서드에서는 인스턴스 멤버와 static 멤버 모두 접근 가능하다.
            InstanceInner obj1 = new InstanceInner();
            StaticInner obj2 = new StaticInner();
            // 메서드 내에 지역적으로 선언된 내부 클래스는 외부에서 접근할 수 없다.
          //LocalInner lv = new LocalInner();
        }
        
        void myMethod() {
        	class LocalInner{}
            LocalInner lv = new LocalInner();
        }
    }

0개의 댓글