minghxx.blog
  • 자바의 정석 94~96강 내부클래스, 익명 클래스
    2023년 08월 07일 06시 15분 36초에 업로드 된 글입니다.
    작성자: 민발자
    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
    댓글