www.youtube.com/watch?v=cZJyRGX2VoM&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=95&t=0s


1. 외부 클래스의 인스턴스를 먼저 생성해야 인스턴스 클래스의 인스턴스를 생성 가능하다.

class B에서 class A의 객체를 생성해야 쓸 수 있는데

class A의 객체를 만들지 않아도 class B에서 class A의 객체를 쓸 수 있다.

 

BBB 클래스에서 b 객체를 사용하려면 또 AAA클래스에서 b객체를 만들어야 한다.

 

BBB클래스는 AAA 안에서만 사용한다는 가정하에 inner class로 해준 것이다.

 

여기서 main에서 내부클래스의 BBB 객체는 생성하지 못한다.

왜냐하면 내부클래스는 외부클래스를 먼저 생성한 다음에야 생성이 가능하기 때문이다.

BBB클래스는 AAA의 멤버처럼 다루어 진다.

 


 

오른쪽의 세가지 내부 클래스는 왼쪽의 세가지 변수와 성격이 똑같다.

  1. 인스턴스 클래스 : 변수 iv가 클래스 내부에서 사용할 수 있듯이 InstanceInner()도 그럴 수 있다.
  2. 스태틱 클래스 : StaticInner 는 Static 멤버처럼 외부 클래스에서 사용할 수 있다.
  3. 지역클래스 : 메써드 안에 있는 LocalInner()는 메써드 안에서만 사용할 수 있다.
  4. 익명클래스 : 딱 한번만 쓰고 안 쓸 클래스

2. 원래 클래스의 접근제어자(modifier)에는 default와 public 밖에 안됐는데
내부 클래스의 접근제어자에는 public, default, private, protected 모두 쓸 수 있다.


static 멤버란

 : 객체 생성 없이 사용가능 한 것

 

내부 클래스를 작성하는데 static 멤버가 필요하다면?

내부 클래스도 static 내부 클래스가 되어야 한다.

 

다시 말하면 static class 안에서만 static int cv 같은 변수를 만들 수 있다.

다른 class 에서는 못만든다. 모순이기 때문이다.

다른 class는 객체를 만들어야만 변수를 사용하는데 그 class안에 static이 있다? 말이 안 되는거다.


3. static 내부클래스에서는 외부클래스의 인스턴스 멤버에 접근할 수 없다.


4. 다만 상수(final)인 경우에는 내부클래스가 static 멤버를 가질 수 있다.
상수(상수≠변수)인 경우에는 inner class가 static 멤버를 가질 수 있다.

int iv = 100; // iv 는 변수

final int lv= 100; // lv 는 상수


5. 지역 내부 클래스메서드 내에서만 접근 가능하다.
method() 안의 Local inner class는 그 method() 안에서만 접근 가능하다.


 

InstanceInner obj1 = new InstanceInner(); 가 안된다. 스태틱 메쏘드 내부에서는.

스태틱 멤버는 인스턴스 멤버에 접근이 안되기 때문이다.


6. 내부클래스에서 private 멤버를 이용할 수 있다.
private는 원래 다른 클래스에서는 사용할 수 없다.

static 클래스 내에서는 여전히 안된다. 인스턴스 멤버이니까!

 

7. 지역 내부 클래스에서는 변수는 이용할 수 없고 상수(final)만 이용할 수 있다.

메써드 내부의 변수는 지역변수이므로 메서드 종료와 함께 소멸된다. 메써드는 한번 호출되면 종료와 함께 끝나기 때문이다.

내부클래스의 객체가 더 오래 존재할 수 있다. 누구보다? 지역변수보다.

메써드가 종료되어도 상수니까 사용할 수 있다.

 

하지만 JDK1.8부터는 변수의 값을 설정하고 바꾸지만 않으면 에러가 나지 않는다.

그래도 그냥 왠만하면 붙여라.


 

객체 생성 = 인스턴스 만들기

point

(1) 외부 클래스의 인스턴스를 먼저 생성해야 내부 클래스의 인스턴스를 만들 수 있다.

(2) static 멤버는 외부 클래스의 객체 생성없이 사용이 가능하다.

(3) static 내부 클래스의 인스턴스를 만들 때는  외부 클래스를 먼저 생성하지 않아도 된다.
     다만 외부 클래스의 이름을 붙여줘야 한다.

(4) 내부클래스가 만들어질 때는 앞에 외부클래스와 $ 가 붙어서 만들어진다.


 외부 클래스와 내부 클래스의 변수 구분하기 

 

'📌 java > java' 카테고리의 다른 글

java - Generic  (0) 2020.06.02
java - Anonymous class  (0) 2020.05.16
java - Inner Class  (0) 2020.05.13
java - getClass()  (0) 2020.05.01
java - Object 클래스  (0) 2020.04.30
복사했습니다!