본문 바로가기

코딩/JAVA 공부

[JAVA] 자바의 정석 _ 내부 클래스

 * 내부 클래스 - 클래스 안의 클래스

class A{	// 외부 클래스

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

장점

1. 내부 클래스에서 외부 클래스의 멤버들 쉽게 접근 가능.

- 서로 다른 클래스일 땐 객체 생성해야 접근 가능.

 

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

 

내부 클래스 종류

- 인스턴스 내부 클래스, 스태틱 내부 클래스, 지역 내부 클래스. 각각 iv, cv, lv 랑 비슷한 특징을 갖는다.

스태틱 내부 클래스만 스태틱 멤버를 가질 수 있다. 나머진 못 가짐.

인스턴스 내부 클래스
= iv
내부 클래스가 들어있는,
외부 클래스 에서만 사용 가능
스태틱 내부 클래스
= cv
외부 클래스 생성 없이도 사용 가능.
주로 static 멤버에서 사용될 목적으로 선언
지역 내부 클래스
= lv
외부 클래스의 메서드 안에 선언,
선언된 영역 내부에서만 사용 가능.
익명 클래스 클래스 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)
public class EX7 {
	class InstanceInner{
		int iv = 100;
		//static int cv = 100; // 에러! 인스턴스 내부 클래스에선 static 멤버X
		final static int CONST = 100; // 상수는 허용.
	}
	
	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;
		}
		int i = LocalInner.CONST;
		System.out.println(i);		// 300
		
		LocalInner LI = new LocalInner();
		System.out.println(LI.iv);	// 300
	}
	
	public static void main(String[] args) {
		System.out.println(InstanceInner.CONST);// 100
		System.out.println(StaticInner.cv); 	// 200
		EX7 E = new EX7();
		E.myMethod();  	 	  		// 300 300
	}
}

 

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

내부 클래스는 접근자 4개 (public, protected, default, private) 모두 가능.

인스턴스 내부 클래스 : 외부 클래스의 private멤버 접근 가능

지역 내부 클래스        : 지역 변수는 접근 불가. 상수는 접근 가능.  

지역 변수는 그 지역(메서드)이 종료되면 사라짐. 지역 내부 클래스는 그 보다 오래 존재할 수 있으므로 사용 불가.

상수의 경우 Contant pool에서 따로 관리하기 때문에 사라지지 않음.

class Outer{
	private int outerIv = 0;
	private static int outerCv = 0;
	
	class InstanceInner{
		int iiv = outerIv;
		int iiv2 = outerCv;
	}
	
	static class StaticInner{
		//int siv = outerIv; 스태틱 클래스는 외부 클래스의 인스턴스 멤버 접근 불가.
		static int scv = outerCv;
	}
	
	void myMethod() {
		int lv = 0;
		final int lv2 = 0;
		lv = 3;
		
		class LocalInner{
			int liv = outerIv;
			int liv2 = outerCv;
			//int liv3 = lv; 지역변수 접근 불가
			int liv4 = lv2;
		}
		LocalInner LII = new LocalInner();
		System.out.println(LII.liv);
		System.out.println(LII.liv2);
		//System.out.println(LII.liv3);
		System.out.println(LII.liv4);
	}
}

변수 위치에 따른 구별법.

class Outer{
    int value = 10;	// Outer.this.value
    class Inner{
        int value = 20;	// this.value
        
        void method(){
        	int value = 30;
        }
    }
}

 

 * 익명 클래스

- 이름이 없는 일회용 클래스. 정의와 생성을 동시에

new 조상클래스이름(){
	//멤버 선언
}