Language/Java

내부 클래스(inner class)

지팡구 2022. 1. 22. 02:13

1. 내부클래스(inner class)

내부 클래스는 클래스 내에 선언된 클래스로 두 클래스가 서로 가까운 관계가 있을 때 내부 클래스를 사용한다.

이로인해 멤버에 쉽게 접근할 수 있으며, 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.

(크게 중요하지 않음.)

1) 내부 클래스의 예시
class A{ //외부 클래스
	class B{ // 내부 클래스
    }
}

2) 내부 클래스의 선언
class Outer{
	int iv = 0;  // 인스턴스 변수
    static int cv = 0; // 클래스 변수
    
    void myMethod(){
    	int iv = 0; //지역 변수
    }
}

같은 위치에 선언뿐만 아니라 멤버 변수와 같은 성질을 갖는다. 따라서 내부 클래스가 외부 클래스의
멤버와 같이 간주되고, 인스턴스 멤버와 static 멤버 간의 규칙이 내부 클래스에도 똑같이 적용된다.

이러한 코드를 내부 클래스를 이용해 선언할 수 있다.
class Outer{
	class InstanceInner{} //인스턴스 클래스
    static class STaticInner{} // static 클래스
    
    void myMethod(){
    	class LocalInner ()	 // 지역 클래스
    }
}

선언된 위치에 따라 내부 클래스의 종류가 달라지며 코드의 순서와 같게
인스턴스 변수, 클래스 변수, 지역변수로 나뉜다. 이렇게 선언된 위치에 따라 변수와 동일한 유효범위와
접근성을 갖는다.

 

내부 클래스도 다른 클래스와 마찬가지로 여러 종류가 있다.

내부 클래스의 종류는 변수의 선언위치에 따라 종류가 나뉘는데 4가지가 있다.

 

내부 클래스 특징
1. 인스턴스 클래스(instance class) 외부 클래스의 멤버변수 선언위치에 선언. 
외부 클래스의 인스턴스 멤버처럼 이용하며, 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언.
2. 스태틱 클래스(static class) 외부 클래스의 멤버변수 선언위치에 선언. 
외부 클래스의 static 멤버처럼 이용하며, 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언.
3. 지역 클래스(local class) 외부 클래스의 메서드나 초기화 블럭에 선언하며, 선언된 영역 내부에서만 사용될 수 있음.
4. 익명 클래스(annoymous class) 클래스의 선언과 객채의 생성을 동시에 하는 이름없는 클래스이름이 없는 클래스로 주로 메서드를 재정의 하는 목적으로 사용.
인터페이스나 추상 클래스에서 주로 이용

 

class Main{
	class InstanceInner{}
    static class StaticInner{}
    
    // 인스턴스 멤버간 서로 직접 접근이 가능
    InstanceInner iv = new InstanceInner();
    // static 멤버간 서로 직접 접근이 가능
    static StaticInner cv = new StaticInner();
    
    static void staticMethod(){
    	// static 멤버는 인스턴스 멤버에 접근이 불가능해서 아래 코드를 사용할 수 없다.
        //InstanceInner oc = new InstanceInner();
        StaticInner oc2 = new StaticInner();
        
        // 하지만 완전 방법이 없는 것은 아닌데, 접근하려면 객체를 생성해서 접근할 수 있다.
        Main outer = new Main();
        InstanceInner oc= outer.new InstanceInner();
        
    }
    
    void instanceMethod(){
    	// 하지만 인스턴스 메서드에서는 인스턴스 멤버와 static 멤버 모두 접근 가능하다.
        InstanceInner oc = new InstanceInner();
        StaticInner oc2 = new StaticInner();
        
        // 메서드 내에 지역적으로 선언된 내부 클래스는 외부에서 접근이 불가능하다.
        LocalInner lv = new LocalInner();
    }
    
    void Method(){
    	class LocalInner{}
        LocalInner lv = new LocalInner();
    }
}

1. 인스턴스 멤버는 같은 클래스에 잇는 인스턴스 멤버와 static 멤버 모두 직접 호출이 가능하다.

2. static 멤버는 인스턴스 멤버를 직접 호출 할 수 없는 것처럼, 인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체 생성없이 바로 사용 가능하지만, static 클래스는 바로 사용이 불가능해 사용하려면 객체를 생성해야한다.

 

 

2. 익명클래스(anoymous class)

익명 클래스는 클래스의 선언과 객체의 생성을 동시에 하기에 단 한번만 사용될 수 있고 오직 하나의 객체만 생성할 수 있는 일회용 클래스이다.

 

1) 익명 클래스 예시
new 조상클래스 이름(){
	// 멤버선언
}

new 구현 인터페이스이름(){
	// 멤버선언
}

이름이 없어 생성자도 가질 수 없으며, 조상 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해 정의하기에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다.

 

 

class Main{
	Object iv = new Object(){void method(){} }; // 익명클래스
    static Object cv = new Object(){void method(){} }; // 익명클래스
 }