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

0
  • 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
    • 원래 클래스에는 (default), public 밖에 못붙임!
  • 내부클래스에 static 멤버가 필요하다면, 클래스도 static 이여야만 함!
    ( static = 객체 생성없이 사용 가능해야 함 )
    내부에 있는 static 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
    예외) 상수(final)인 경우에는 static을 붙일 수 있음.
void myMethod() {
	class LocalInner {
    	int iv = 300;
     // static int cv = 300; // 에러! static 변수 선언할 수 없음. 
        final static int CONST = 300; // final static은 상수이므로 허용
    }
    int i = LocalInner.CONST;  // 가능
}

public static void main(String args[]) {
	System.out.println(LocalInner.CONST); // 불가!
    // 지역 내부 클래스는 메소드 내에서만 사용가능
}

  • 내부클래스가 외부 클래스의 private 멤버에도 접근가능.
  • static 내부 클래스는 외부 클래스의 '인스턴스멤버'에 접근할 수 없음
    ( 인스턴스 멤버 ⇌ static 멤버, 인스턴스는 항상 static 사용 가능 / static에서 인스턴스는 접근x )
void myMethod() {
	int lb = 0; // 지역변수 ( 메소드 종료와 함께 소멸)
    final int LV = 0; // jdk1.8부터 생략가능
    
    class LocalInner {
    	int liv = outerIv; // 외부 클래스의 지역변수
        int liv2 = lv; // 에러
(외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능하다., jdk1.8부터 에러아님)
        int liv3 = LV; // 가능
    }    
}

⇒ 지역 내부 클래스의 객체가 지역변수보다 더 오래 존재할 수 있음.
↳ 따라서 상수만 접근 가능. (단, jdk 1.8부턴 final 생략되도 값이 바뀌지 않는 변수는 상수로 간주됨. 웬만하면 붙이는게 좋긴함)


class Outer {
	class InstanceInner {  // 일반 내부클래스
    	int iv = 100;
    }
    static class StaticInner {  // static 내부클래스
    	int iv = 200;
        static int cv = 300;
    }
    void myMethod() { // 메소드
    	class Local Inner {
        	int iv = 400;
		}
    }
}    

위와 같은 외부&내부 클래스 코드가 있을 때, main 함수에서 Outer클래스의 내부 클래스를 이용하는 방법.

  • 일반 클래스
    1) 외부 클래스의 인스턴스를 먼저 생성
    Outer oc = new Outer();
    2) 내부 클래스의 인스턴스 생성
    Outer.InstanceInner ii = oc.new InstanceInner();
  • static 클래스
    Outer.StaticInner si = new Outer.StaticInner(); : 외부 클래스의 객체 생성 없이 바로 인스턴스 만들 수 있음
    Outer.StaticInner.cv : 위처럼 객체 만들지 않아도 상수는 static 내부클래스의 상수는 바로 사용 가능

  • 외부, 내부클래스들의 인스턴스변수 & 로컬변수 가리키는 법

출처

  • 자바의 정석 기초편 - youtube : ch7 -45~50
profile
백엔드를 공부하고 있습니다.

0개의 댓글