정리/Java

자바의 정석 94~96강 내부클래스, 익명 클래스

민발자 2023. 8. 7. 06:15
728x90

ch 7-42~44 내부클래스 종류, 특징, 선언

1. 내부클래스

내부 클래스에서 객체 생성 없이 외부클래스의 멤버들을 쉽게 접근 가능

코드의 복잡성 줄일 수 있음(캡슐화)

 

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

내부 클래스 특징
인스턴스 클래스 외부 클래스 멤버변수 위치에 선언
인스턴스 멤버처럼 다루어짐
외부클래스 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언
static 클래스 외부 클래스 멤버변수 위치에 선언
외부 클래스 static멤버처럼 다루어짐
외부클래스 static멤버, 특히 static 메서드에서 사용될 목적으로 선언
지역 클래스 외부 클래스의 메서드나 초기화 블럭안에 선언
선언된 영역 내부에서만 사용
익명 클래스 클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스
일회용으로 사용
class outer {
	class InstanceInner {} // 인스턴스 클래스
	static class StaticInner {} // static 클래스
	
	void method() {
		class LocalInner {} // 지역 클래스
	}
}

ch 7-45~50 내부 클래스의 제어자와 접근성

1. 내부 클래스 제어자는 변수 제어자와 동일

클래스 → default, public

내부 클래스 → default, public, protected, private 

 

2. 내부 클래스 접근성

class outer {
	private int outerIv = 0;
    
	// 인스턴스 내부 클래스
	class InstanceInner {
		int iv = 100;
		// static int cv = 100; static 변수 선언 불가
		final static int CONST = 100; // final static은 상수라 허용
		int iiv = outerIv; // 외부클래스 private멤버도 접근 가능
	}

	// static 내부 클래스
	static class StaticInner {
		int iv = 200;
		static int cv = 200; // static 클래스만 static멤버 정의 가능
		// 객체 생성없이 사용가능한 static멤버이기 때문에 static 클래스만 정의 가능
		// static 내부 클래스에서는 외부 클래스의 인스턴스 멤버 접근 불가
	}
	
	void method() {
		int Iv = 0;
		final int LV = 0;
        
		// 지역 내부 클래스
		class LocalInner {
			int iv = 300;
			// static int cv  = 300; static 변수 선언 불가
			final static int CONST = 300; // final static은 상수라 허용
			// 지역 내부 클래스의 static 상수는 메서드 내애서만 사용 가능
			
			int liv = outerIv;
			int liv2 = outerCv;
			int liv3 = lv;
			int liv4 = Lv;
            // 외부 클래스의 지역변수는 final이 붙은 상수만 가능
            // 내부 클래스의 객체가 지역변수보다 더 오래 존재할 수 있기 때문에
		}
		
		int i = LocalInner.CONST; // 메서드 내에선 사용 가능
	}
}

class class Ex7_12 { 
	public static void main(String args[]) { 
		// 상수 사용
		System.out.println(InstanceInner.CONST); 
		System.out.println(StaticInner.cv); 
		// System.out.println(LocalInner.cv); 지역 내부클래스 메서드 내에서만
        
        
		// 인스턴스클래스의 인스턴스를 생성하려면
		// 외부 클래스의 인스턴스를 먼저 생성해야 한다.
		Outer oc = new Outer();
		// 외부 클래스 인스턴스 생성 후 내부 클래스 인스턴스 생성하여 사용
		Outer.InstanceInner ii = oc.new InstanceInner();

		System.out.println("ii.iv : "+ ii.iv);
		System.out.println("Outer.StaticInner.cv : "+Outer.StaticInner.cv);
		// 외부 클래스의 객체 생성 없이 사용 가능 
                                     
		// 스태틱 내부 클래스의 인스턴스는 외부 클래스를 먼저 생성하지 않아도 된다.
		Outer.StaticInner si = new Outer.StaticInner();
		System.out.println("si.iv : "+ si.iv);
	}
}

ch 7-51~52 익명 클래스

1. 익명 클래스

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

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

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

Object iv = new Object() { /*멤버 선언*/ }
728x90