내부 클래스

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

클래스 앞에 쓸수있는건 public (default) 이지만

내부클래스에는 public protected default private 4개 다 가능하다


class Outer {
  private int iv = 0;
  protected static in cv = 0;

  void myMethod() {
    int lv = 0;
  }
}

---

clas Outer { //클래스 
  privatate class InstanceInner {} //내부클래스 
  protected static class StaticInner {} //스태틱 내부 클래스

  void myMethod() {
    class LocalInner {}

  }
}

클래스 > 내부클래스 > static 정적 클래스 > 지역메소드호출시 > (지역클래스)

class Ex7_12 { 
  //클래스가 생성될때 ,내부클래스,static 클래스는 생성된다 

  class InstanceInner { // 인스턴스 내부클래스
    int iv = 100; 
//		static int cv = 100;            // 에러! static 변수 는 static 클래스내에서만 가능하다
    final static int CONST = 100;   // final static 은 상수이므로 허용가능
  } 

  static class StaticInner { // static 내부클래스 static 이아니면 인스턴스 내부클래스가된다.
    int iv = 200; 
    static int cv = 200;    // 핵심은 static 클래스만 static 멤버를 정의할수있다.
  } 





  void myMethod() {  // 따로 메서드가 호출되어야만 지역클래스가 생성된다 
    class LocalInner { //지역내부클래스

      int iv = 300;  //지역변수 JDK 1.8 부터는 final 생략가능하지만 final 작성해야한다 중요 
//			static int cv = 300;             // 에러! static 변수 선언 핧수없다 . static 클래스가 아니므로.
      final static int CONST = 300;    // final static 은 상수이므로 허용 <지역클래스 내부의 메서드 내에서만 가능
    } 
    
    int i = LocalInner.CONST; // 2번 ok 
  } 

  public static void main(String args[]) { 
    System.out.println(InstanceInner.CONST); 
    System.out.println(StaticInner.cv);

    //System.out.println(LocalInner.CONST); // 1번  에러 지역클래스 내에서만 가능 
  } 
}


  +------------------+
  |     Ex7_12       | //클래스 
  +------------------+
  | InstanceInner    | // 내부클래스      (외부 , 내부,  스태틱 사용가능 )
  | StaticInner      | // 스태틱 내부클래스 (자기것만 사용가능 , 외부클래스의cv 가능)
  |------------------|
  | myMethod()       | // * 외부클래스만사용가능 < 혼동주의   지역 메소드 호출해야지만 생성되어서 지역클래스 사용가능 
  +------------------+
        |     
        |              // 메서드내에 선언된 지역클래스 이기떄문이다 < 중요
        v       
  +------------------+
  |  LocalInner      | // 지역클래스 (생성된이후에는  > 외부 사용가능)
                       // final이붙은 상수만 접근가능 > 이유는 값이변경되지않는다는 보장을 컴파일러가하기때문에 
  +------------------+

결론Permalink

  1. 내부클래스에서 > 외부클래스의 private 멤버도 접근가능하다

  2. LocalInner(지역내부클래스)는 final 상수만 사용가능하다 (JDK 1.8부터는 생략가능해졌지만 final을 붙이자 )
  3. LocalInner클래스에서 outerIv와 outerCv를 사용되는 이유는, myMethod()가 Outer 클래스의 메소드이기때문이다
  4. meMethod()가 Outer 꺼 이기 떄문에 outerIv, outerCv 가능 // meMethod()로 호출하면 종료되기때문에 상수로변경시킨뒤 값을 없애지말자 (그안의 변수는 final 상수만 사용가능하다 )

MyMethod() 호출전 이미 Outer(outerIv와 outerCv)는 생성되어있어서 final이 안붙어도된다
myMethod()입장에서는 > InstanceInner,StaticInner 이접근가능하다 하지만
LocalInner 입장에서는 > Outer 의 인스턴스 멤버만 접근가능하다

프로그램실행 유지 > 클래스 > 객체생성(객채의변수,메서드) 복사 > 메서드는 호출될때만 실행>종료 > 클래스는 종료되지않음

한마디로 메서드(); 안에것들은 호출해서사용하는거기떄문에 원본클래스만 사용가능하며 final이없어도된다

Categories:

Updated:

Leave a comment