자바의정석

[자바의 정석 - 기초편] ch7-45~50 내부클래스의 제어자와 접근성

유호야 2022. 3. 24. 17:02
반응형

ch7-45 내부 클래스의 제어자와 접근성

클래스 앞에는 (default : 아무것도 안 붙이는 것 ) 아니면 public

하지만 내부 클래스 앞에는 private protected 도 추가로 사용 가능하다. 
iv와 cv에 가능한 것처럼.... 내부 클래스에도 적용된다. 


static 멤버를 가질 수 있는 것은 static 내부 클래스만 가질 수 있다. 
내부 클래스를 정의 했는데 static 멤버가 필요하면 내부 클래스를 static 내부 클래스로 정의하면 된다.

static 멤버 자체가 객체 생성 없이 사용 가능해야 한다. 
근데 만약 static이 아니면, 모순이 발생할 수 밖에 없기 때문에 
static 내부 클래스가 아닌 내부 클래스에서 static 변수를 사용할 수 없다. 

 하지만 상수인 경우에는 final static 이 붙게 된다. 

final이라고 무조건 static을 붙이는 것이 아니다.

 카드 개수가 언제나 52개인 경우 final static.... 


public class Ex7_12 {

	class InstanceInner {
		int iv = 100;
//		static int cv = 100;
		final static int CONST = 100;
	}
	
	static class StaticInner {
		int iv = 200;
		static int cv = 200;
	}
	
	void method() {
		class LocalInner {
			int iv = 300;
//			static int cv = 300;
			final static int CONST = 300;
		}
		
		int i = LocalInner.CONST;
	}
	
	public static void main(String[] args) {
		System.out.println(InstanceInner.CONST);
		System.out.println(StaticInner.cv);
//		System.out.println(LocalInner.CONST);
		//지역 내부 클래스는 메서드 안에서만 사용 가능 
	}
	
}

 


인스턴스 멤버는 static 멤버를 사용할 수 있지만, 
그 반대는 불가능

인스턴스 멤버에서는 둘 다 사용 가능

static 클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다. 
내부 클래스는 외부 클래스의 private 멤버에도 접근이 가능하다.
메소드 내에서는 지역 변수를 사용 불가능하지만, jdk 1.8부터는 final이 자동으로 생략 가능하다.

내부 클래스의 객체가 지역변수보다 더 오래 존재 가능하기 때문에 
(메서드에서 ?) 지역변수를 사용하지 못한다. 


constant pool 에 상수가 남았을 경우를 대비해 
따로 저장 및 관리되고 있다. 
메서드를 종료해서 상수를 사용할 수 있다. 

1) 내부 클래스에서 private 멤버도 접근 가능하다
2) 지역 내부 클래스를 감싸고 있는 외부 메서드에 있는 상수만 가능하다. 
  


외부 클래스의 바깥에서 내부 클래스를 어떻게 사용하느냐

외부 클래스의 객체를 먼저 만들어야 내부 클래스의 객체를 생성할 수 있다. 

예제를 컴파일할 시 class 파이링 5개 만들어진다. 

내부 클래스 앞에 외부 클래스의 이름이 붙어진다. 
같은 이름의 클래스가 메서드마다 있을 수 있기 때문에 숫자가 붙어있기도 하다. 


반응형