Deperecated/JAVA

JAVA - 중첩 클래스&중첩 인터페이스

누알라리 2020. 1. 11. 16:59

C++에도 있는 개념이지만 난 한번도 써보지 않았다..흠냐뤼;


1. 정의

- 클래스 내부에 선언되는 클래스&인터페이스.

- 특정 클래스와 관계를 맺을 경우에는 관계 클래스 안에 선언하는것이 은닉할수도있고, 필드에 쉽게 접근할 수 있기 때문에 도입된 개념.


1. 중첩 클래스

선언 위치에 따른 분류 선언 위치 설명

멤버 클래스

인스턴스

멤버 클래스

Class A{

    Class B {...}

}

A 객체를 생성해야만 사용할 수 있는

B 중첩 클래스

정적 

멤버 클래스

Class A{

   static class B {..}

}

A 클래스로 바로 접근할 수 있는 

B 중첩 클래스

로컬 클래스

class A {

  void method(){

       class B {...}

   }

}

method()가 실행될 때만 사용할 수 있는

B 중첩 클래스

- 멤버 클래스도 하나의 클래스로 취급되기 때문에 컴파일 하면 바이트 코드(.class)가 별도로 생성된다.

 

1-1) 인스턴스 멤버 클래스의 예

public static void main(String[] args)
{
   A a = new A();
   A.B b = a.new B();
   
   b.field1 = 3;
   b.method();
}

인스턴스 멤버 클래스는 정적 필드, 메소드를 가질 수 없다.

A클래스 외부에서 인스턴스 멤버 클래스 B 객체를 생성하려면
먼저 A 객체를 생성하고 B 객체를 생성해야 한다.

1-2) 정적 멤버 클래스

public static void main(String[] args)
{
   A.C c = new A.C();
   c.method();
   A.C.field2 = 3;
   A.C.method2();
}

A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서 A객체를 생성할 필요 없이
바로 생성할 수 있다.

2. 중첩 클래스의 접근 제한

접근 제한 인스턴스 멤버 클래스 정적 멤버 클래스

바깥 클래스의

필드와 메소드에서 사용 제한

바깥 클래스의

인스턴스 필드,메소드에서 객체 생성 가능

 

정적 필드, 메소드에서 객체 생성 QNFRK

바깥 클래스의 모든 필드, 메소드에서

객체 생성 가능

멤버 클래스 내부에서

바깥 클래스의 필드와 메소드의

사용 제한

바깥 클래스의 모든 필드, 메소드에 접근 가능

바깥 클래스의 정적 필드, 메소드에만

접근 가능

3. 로컬 클래스에서 사용 제한

- 로컬 클래스 내부에서는 바깥 클래스의 필드나 메소드를 제한 없이 사용할 수 있다.

 

- 문제는 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 경우이다.

로컬 클래스의 객체는 메소드 실행이 끝나도 "힙 메모리"에 존재해서 계속 사용할 수 있는데,

매개 변수나 로컬 변수는 메소드가 끝나면 스택 영역에서 사라지기 때문에 크래시가 날 수 있다.

 

- JAVA는 이를 위해 "컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변수의 값을 로컬 클래스 내부에 복사" 해둔다.

- 그리고 저장한 값이 변화되면 안되니까 매개 변수나 로컬 변수를 "final"로 선언해서 수정을 막는다.

 

- JAVA7까지는 명시적으로 붙여야 했지만, 8 부터는 안붙여도 final의 특성을 갖는다.

 

결론은 로컬 클래스에서 사용 가능한 것은 final로 선언된 매개 변수나 로컬 변수 뿐이다.

 

4. 중첩 클래스에서 바깥 클래스 참조 얻기

- this.method() -> 중첩 객체 참조

- 바깥클래스.this.method(); -> 바깥 객체 참조

 


1. 중첩 인터페이스

- 클래스의 멤버로 선언된 인터페이스

- 주로 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다.

'Deperecated > JAVA' 카테고리의 다른 글

JAVA - 멀티 쓰레드  (0) 2020.01.17
JAVA - 주요 API 정리  (0) 2020.01.16
JAVA - 예외 처리  (0) 2020.01.10
JAVA - 익명 구현 객체, 람다식  (0) 2020.01.09
JAVA - 인터페이스  (0) 2020.01.09