내부클래스의 종류, 특징, 선언

 

✔ 내부클래스 (inner class)

: 클래스 안의 클래스

: 내부클래스에서 외부클래스의 멤버들을 쉽게 접근할 수 있다

: 코드의 복잡성을 줄일 수 있다 (캡슐화)

class A { // B의 외부클래스
	class B { // A의 내부클래스 
    	// 객체생성없이도 A의 멤버에 접근 가능
        }
  }

> class B가 class A안에서만 사용될 때 특히 유용. 다른 클래스에서 접근하기 힘들게 만든다. 

 

내부클래스의 종류와 유효범위(scope)는 변수와 동일

 

int iv 👉 class InstanceInner{}

static int cv 👉 static class StaticInner{}

int lv = 0; 👉 class LocalInner{}

내부클래스 특징
인스턴스 내부클래스
(Instance class)
: 외부클래스의 멤버변수 선언위치에 선언
: 외부클래스 인스턴스 멤버처럼 다루어짐
: 인스턴스 멤버들과 관련되어 사용될 목적
스태틱 내부클래스
(static class)
: 외부클래스 멤버변수 선언위치에 선언
: 외부클래스의  static 멤버변수처럼 다루어짐
: 외부클래스의 static 멤버, static 메서드에서 사용될목적
지역 내부클래스
(Local class)
: 외부클래스 메서드나 초기화블럭 안에 선언
: 선언된 영역 내부에서만 사용
익명클래스
(anonymous class)
: 익명클래스
: 클래스 선언, 객체생성을 동시에 하는 이름없는 클래스 (일회용 클래스)

 


 

내부클래스의 제어자와 접근성

 

: 내부클래스의 제어자는 변수에 사용가능한 제어자와 동일

: 일반 클래스에는 default, public만 가능하지만 내부클래스는 일반 변수처럼 접근제어자 4개 모두 사용 (즉 변수 자리에 내부클래스를 넣은것)

: 인스턴스 내부 클래스는 외부클래스의 인스턴스를 생성해야 내부 클래스에 인스턴스 생성 가능

: 스태틱 내부 클래스는 외부 클래스 인스턴스 생성 없이도 사용 가능.(iv, cv의 특징과 동일)

 

 

class InstanceInner { 
		int iv = 100; 
//		static int cv = 100;            // 에러! static변수를 선언할 수 없다. 
		final static int CONST = 100;   // final static은 상수이므로 허용
	} 

   static class StaticInner { 
		int iv = 200; 
		static int cv = 200;    // static클래스만 static멤버를 정의할 수 있다. 
	} 

	void myMethod() { 
		class LocalInner { 
			int iv = 300; 
//			static int cv = 300;             // 에러! static변수를 선언할 수 없다. 
			final static int CONST = 300;    // final static은 상수이므로 허용. 상수라고 static이 꼭 붙는건 아님
		} 
	} 

	public static void main(String args[]) { 
		System.out.println(InstanceInner.CONST); 
		System.out.println(StaticInner.cv); 
	//	System.out.println(LocalInner.cv);  에러. 지역 내부 클래스는 메서드 내에서만 사용가능
	}
class Outer{ // 외부,내부, 내부클래스 메소드의 지역변수값이 모두 같을때 구별법
	int value = 10; // Outer.this.value=10
    
    class Inner{	// 내부클래스
    	int value=20; // this.value=20 (메인변수와 지역변수 구분할때의 this)
        
        void method1(){
        int value=30; // 메서드의 lv. value = 30
        System.out.println("value:"+value);
        System.out.println("this.value:"+ this.value);
        System.out.println("Outer.this.value:"+Outer.this.value);}
 	}
}

Class Test{
public static void main(String[] args){
	Outer out = new Outer();	// 외부 인스턴스 생성
    Outer.Inner inner = Outer.new Inner(); // 내부 인스턴스 생성
    Inner.method1(); // 메소드 호출
	}	
}

 

 


익명클래스

 

: 1번만 쓰고 버리는 일회용 클래스

: 익명이라서 클래스 이름이 없다.

: 클래스 정의와 객체 생성을 동시에 함.

 

class MyClass extends Object
MyClass mc = new MyClass();

// 여기서 익명클래스는 자기 클래스명이 없으므로, 객체 생성시 들어갈 타입도, 변수명도 없음.
// 따라서 조상클래스를 가져다가 사용.

new Object() {/*클래스의 내용 그대로 넣어줌*/}
//new 다음에 조상 이름을 쓰던가, 인터페이스 이름을 써줌.

 

+ Recent posts