클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는것이 좋으나
특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 것이 좋다.
∘ 장점
- 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다
- 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다
프로그램을 개발할 때 "관련있는 것은 모으고 관련없는 것은 서로 분리한다" 원칙을 지키는것이 좋다
> 그러므로 한 클래스에만 관련있는 클래스는 내부 클래스로 선언하는 것이 좋다
▶ 중첩 클래스와 중첩 인터페이스
✔ 중첩 클래스: 클래스 멤버로 선언된 클래스
✔ 중첩 인터페이스: 클래스 멤버로 선언된 인터페이스
∘ 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 |