article thumbnail image
Published 2020. 5. 13. 20:18

Inner Classes

  1. 클래스나 인터페이스 내부에서 선언한다.
  2. 코드를 더 읽기 쉽고, 더 오래 유지하기 위해 사용한다.
  3. 이너클래스는 모든 멤버, 메소드에 접근 가능하다.

이너 클래스 vs 중첩 클래스

Inner 클래스는 중첩클래스의 한 부분이다.

정적 중첩 클래스는 이너 클래스이다.


중첩클래스의 2가지 타입

1. 정적 중첩클래스 = 이너 클래스

2. 동적 중첩클래스


정적 중첩 클래스 (이너 클래스)

멤버 이너 클래스

익명 이너 클래스

지역 이너 클래스


동적 중첩 클래스


 1. Member inner class

정적 중첩 클래스는 클래스 내에서 만들어지고, 외부 메소드는 Member inner class라고 불린다.

멤버 이너 클래스로 msg() 메쏘드 만들기

 

 

컴파일러는 inner class의 케이스 안에 2개의 클래스 파일을 만든다.

이너클래스의 클래스 파일 이름은 Outer$Inner 이다.

만약 이너 클래스를 생성하길 원한다면, 외부 클래스의 인스턴스를 만들어야 한다.

그런 경우, 외부 클래스의 인스턴스 안에 이너 클래스의 인스턴스가 만들어 진다.

 

멤버 이너 클래스는 외부 클래스의 참조를 가진다.

그렇기 때문에 외부 클래스의 모든 데이터 멤버에 접속할 수 있다.


 2. Anonymous inner class

인터페이스클래스의 메소드를 오버라이딩 해야만 할 때 

 

(1) 클래스를 사용하는 익명 inner class의 예시

1. 클래스는 생성되지만 이름은 확장한 Person 클래스 컴파일러에 의해 결정되고, eat() 메쏘드를 구동시킨다.

2. 익명의 클래스의 한 객체는 Person 타임의 기본설정변수와 참조와 관련되어 만들어진다.


(2) 인터페이스를 사용한는 익명 inner class의 예시

이 코드에서는 2개의 메인 작업을 수행한다.

1. 클래스는 생성되지만 이름은 식용가능한 인터페이스 구동 컴파일러에 의해 결정되고, eat() 메소드를 구동시킨다.

2. 익명 클래스의 한 객체는 식용가능 타입의 기본설정변수와 참조와 관련되어 만들어진다.

 


 3. Local inner class

메소드 안에서 생성되는 클래스를 지역 이너 클래스라고 부른다.

지역 이너 클래스를 불러오고 싶다면, 메소드 안에 클래스를 만들어야 한다.

지역 이너 클래스는 외부 메소드로부터 불러올 수 없다.

컴파일러에 의한 내부 코드 발생.

컴파일러는 외부 클래스의 참조를 가지는 클래스 Simple1$Local 을 만든다.


 4. Static nested inner class

정적 중첩 클래스라고 불리는 클래스 안에서 만들어진다.

동적 데이터 멤버와 메쏘드에는 접속할 수 없다.

외부 클래스 네임에 의해 접속될 수 있다.

 

인스턴스 메소드와 자바 정적 중첩 클래스의 예시

private을 포함하는 외부 클래스의 정적 데이터 멤버에 접속할 수 있다.

정적 중첩 클래스는 동적 데이터 멤버나 메쏘드에 접속할 수 없다.

 

위의 예에서 정적 중첩 클래스의 인스턴스를 만들 필요가 있다.

왜냐하면 그 클래스는 인스턴스 메소드 msg()를 가지기 때문이다.

하지만 중첩클래스가 정적이고 정적특성이라서 외부 클래스의 객체를 만들필요가 없다면,

메소드나 클래스는 객체 없이 접근할 수 있다.

 

자바 정적 중첩 클래스 예시와 정적 메소드

 

정적 중첩 클래스 안에 정적 멤버를 가진다면, 정적 중첩 클래스의 인스턴스를 만들 필요가 없다.


 5. Nested interface 

다른 인터페이스나 클래스에서 선언된 인터페이스는 중첩 인터페이스라고 불린다.

중첩 인터페이스는 유지를 쉽게 하기 위해 인터페이스와 관계된 그룹에 사용된다.

중첩 인터페이스는 외부 인터페이스나 클래스에 의해 적용되어야 한다.

또한 다이렉트로 접근할 수 없다.

 

만약 인터페이스 내에 선언된다면, 중첩 인터페이스를 공개해야 하고, 클래스 내에 선언된다면 액세스 수정을 할 수 있다.

중첩 인터페이스는 정적으로 선언된다.

 

 

 

출처 : www.tworab.tistory.com/49


 

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

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
java - throw new  (0) 2020.04.29
복사했습니다!