클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는것이 좋으나

특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 것이 좋다.

 

∘ 장점

- 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다

- 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다

 

프로그램을 개발할 때 "관련있는 것은 모으고 관련없는 것은 서로 분리한다" 원칙을 지키는것이 좋다

> 그러므로 한 클래스에만 관련있는 클래스는 내부 클래스로 선언하는 것이 좋다

 

중첩 클래스와 중첩 인터페이스

✔ 중첩 클래스: 클래스 멤버로 선언된 클래스

✔ 중첩 인터페이스: 클래스 멤버로 선언된 인터페이스

∘ UI컴포넌트 내부 이벤트 처리에 많이 활용

 

✔ 중첩 클래스의 분류

선언 위치에 따른 분류 선언위치 설명
멤버 클래스 인스턴스 멤버 클래스 class outer {
   class inner{ ... }
}
outer객체를 생성해야만 사용할 수 있는 inner 중첩 클래스
정적 멤버 클래스 class outer {
   static class inner{ ... }
}
outer 클래스로 바로 접근할 수 있는 inner 중첩 클래스
로컬 클래스 class outer {
   void method( ) {
      class inner{ ... }
  }
}
method()가 실행 할 때만 사용할 수 있는 inner 중첩 클래스

∘ 클래스 생성시 바이트 코드 따로 생성

 

1) 내부 클래스 정의 및 선언

자바에서는 하나의 클래스 안에 다른 클래스를 정의할 수 있다. 이것을 내부 클래스라고 한다

- 중첩 클래스: 클래스 멤버로 선언된 클래스

 

2) 내부 클래스를 사용하는 이유

∘ 하나의 장소에서만 사용되는 클래스들을 한 곳에 모을 수 있다 > 만약 클래스가 하나의 장소에서만 필요하다면 클래스를 분리하는 것보다 클래스의 내부에 위치시키는 것이 가독성이 좋아진다

 

✔ 클래스 종류

1. 인스턴스 멤버 클래스(non-static 내부 클래스)

1) Inner 클래스는 Outer 클래스의 멤버이다

2) 모든 멤버 변수와 메소드가 그렇듯이, Inner 클래스는 Outer의 모든 멤버를 참조할 수 있다

3) 다른 클래스에서 Outer 클래스의 내부 클래스인 Inner 클래스애 접근하기 위해서 객체를 생성할 때는

먼저 외부 클래스의 객체를 생성해서 그 레퍼런스를 가지고 내부 클래스의 객체를 생성한다

4) Outer 클래스의 객체가 있어야만 Inner 클래스의 객체를 만들 수 있기 떄문에

   Inner 클래스의 멤버들은 static이 될 수 없다. 하지만 상수(static final)는 가능하다

 

2. 정적 멤버 클래스 (static 내부 클래스)

1) Inner 클래스는 Outer의 static 멤버를 참조할 수 있다

   하지만 일반 멤버 변수는 참조할 수 없다

2) Inner 클래스는 Outer 클래스의 멤버이면서 동시에 static으로 선언되었으므로 Outer 클래스 외부에서 Outer의 객체 없이도 Inner의 객체를 만들 수 있다

 

3. 지역 내부 클래스 (로컬 클래스) 

- 외부 클래스 멤버의 위치에 선언: 인스턴스 멤버 클래스와 정적 멤버 클래스 

- 메서드 내에 선언: 지역 내부 클래스   // 외부 클래스의 메소드에서 사용하려고

 

1) 메소드 내부에서만 사용 가능하고, 메소드의 실행이 끝나는 순간 메소드의 모든 멤버가 사라진다

2) 로컬 클래스 내부에는 인스턴스 필드와 메서드만 선언 가능하고 정적 필드와 메소드느 선언할 수 없다

 

 

무명 클래스

무명 클래스는 클래스 몸체는 정의 되지만 이름이 없는 클래스이다

무명 클래스는 정의부와 생성부가 하나로 묶여 있는 클래스로 선언과 동시에 객체가 생성된다

✔ 특징

- 무명 클래스는 이름이 없어 한번만 사용하며 재참조가 불가능하다

   즉 하나의 객체만 생성하는 일회용 클래스이다

- 하나의 상위 클래스 (일반 클래스, 추상 클래스, 인터페이스)로부터 상속받아 정의한다

 

✔ 이름이 있는 클래스의 경우

 

✔ 무명 클래스의 경우

∘ 명시적인 구현 클래스 작성 생략하고 바로 구현 객체를 얻는 방법

∘ 이름없는 구현 클래스 선언과 동시에 객체 생성

 

∘ 인터페이스의 추상 메소드들 모두 재정의

∘ 추가적으로 필드와 메소드 선언 가능하나 익명 객체 안에서만 사용

 

✔ 무명 클래스의 경우

익명 클래스는 클래스 선언과 동시에 힙에 인스턴스가 생성된 후 참조변수에 인스턴스의 주소값을 저장한다

익명 클래스는 이름이 없기 때문에 참조변수의 타입과 new 명령문에서 사용하는 객체 이름을 상속받는 인터페이스나 추상 클래스를 지정한다

'Language > Java' 카테고리의 다른 글

제네릭 Generic  (0) 2022.02.23
예외 (Exception Event)  (0) 2022.02.22
다형성 (Polymorphism)  (0) 2022.02.21
인터페이스 (interface)  (0) 2022.02.21
추상 클래스/메소드  (0) 2022.02.21