반응형
목차
1. 중첩 클래스와 중첩 인터페이스란?
객체 지향 프로그램에서 클래스들은 서로 긴밀한 관계를 맺고 상호작용을 한다.
클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 것이 좋다.
중첩 클래스(Nested Class)
- 클래스 내부에 선언한
클래스
- 중첩 클래스 사용 시 두 클래스 멤버들은 서로 쉽게 접근 가능
- 외부에서 불필요한 관계 클래스를 감춤 → 복잡성 ⬇️
class ClassName {
class NestedClassName { // <--- 중첩 클래스
}
}
중첩 인터페이스(Nested Inteface)
- 클래스 내부에 선언한
인터페이스
- 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함
class ClassName {
interface NestedInterfaceName { // <--- 중첩 인터페이스
}
}
2. 중첩 클래스
중첩 클래스는 클래스 내부 선언되는 위치에 따라 두 가지로 분류된다.
멤버 클래스
: 클래스 멤버로서 선언로컬 클래스
: 메소드 내부에서 선언
1. 인스턴스 멤버 클래스
public class Class {
class MemberClass { ... }
}
static
키워드 없이 선언된 클래스- 상위 객체를 생성해야만 사용 가능한 중첩 클래스이다.
- 내부에 정적 필드 혹은 메소드를 선언할 수 없다.
class A{
class B{
B() {} // 생성자
int field1; // 인스턴스 필드
//static int field2; 정적 필드 (X)
void method1(){} // 인스턴스 메소드
//static void method2() 정적 메소드 (X)
}
}
//A클래스 외부에서 인스턴스 멤버 클래스 B를 호출하려면,
//A 객체를 먼저 생성하고 B 객체를 생성한다.
A a= new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
2. 정적 멤버 클래스
public class Class {
static class MemberClass { ... }
}
static
키워드로 선언된 클래스- 상위 객체가 인스턴스화되지 않아도 접근 가능한 중첩 클래스이다.
- 내부에 정적 필드 혹은 메소드 선언이 가능하다.
class A{
static class C{
C() {} //생성자
int field1; //인스턴스 필드
static int field2; //정적 필드
void method1(){} //인스턴스 메소드
static void method2() //정적 메소드
}
}
//A클래스 외부에서 정적 멤버 클래스 C를 바로 호출한다.
A.C c = new A.C();
c.field1 = 3; //인스턴스 필드 사용
c.method1(); //인스턴스 메소드 호출
A.C.field2 = 3; //정적 필드 사용
A.C.method2(); //정적 메소드 호출
3. 로컬 클래스
public class Class {
void method() {
class LocalClass { ... }
}
}
메소드
내에 선언한 중첩 클래스- 접근 제한자(
public
,private
)와static
을 붙일 수 없다. - 로컬 클래스 내부에 정적 필드와 메소드 선언 불가하다.
- 로컬 클래스는 보통 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.
void methid() {
class D {
D() { } //생성자
int field1; //인스턴스 필드
//static int field2; //정적 필드(X)
void method1() { } //인스턴스 메소드
//static void method2() { } //정적 메소드(X)
}
D d = new D();
d.field1 = 3;
d.method1();
}
3. 중첩 클래스의 접근 제한
중첩 클래스는 정적 클래스 혹은 인트턴스로 생성되기 때문에 접근 제한이 걸린다.
1. 바깥 필드와 메소드에서 사용 제한
A 가 있어야, B를 사용할 수 있다. C는 A가 없이도 사용 가능하다.
- 외부클래스의
인스턴스 필드
와메소드
- → 일반 중첩 클래스 & 정적 중첩 클래스 둘 다 사용 가능
- 외부클래스의
정적 필드
와메소드
- → ONLY 정적 중첩 클래스만 사용 가능
2. 멤버 클래스에서 사용 제한
B → 안에서는 바깥 클래스의 모든 필드 및 메소드에 접근 가능
C → 안에서는 정적필드(field2
) 와 메소드(method2()
)만 접근 가능 & 인스턴스 필드(field1
) 와 메소드(method1()
) 에는 접근 할 수 없음
- 중첩 클래스에서는 바깥 클래스의
필드
,메소드
사용 가능 - 단, 정적 중첩 클래스에서는 바깥 클래스에 선언된 정적 필드, 정적 메소드만 사용 가능
- → 왜냐하면
정적 중첩 클래스
가 메모리상에 먼저 생김 →일반 중첩 클래스
는 객체화되는 타이밍에 생김
3. 로컬 클래스에서 사용 제한
매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 있어, 매개 변수나 로컬 변수는 final
의 속성을 가져야 한다. 자바 8부터는 키워드를 붙이지 않아도 final
의 특성을 가지고 있다.
- 클래스의
메소드
에 있는 중첩 클래스 - 로컬 클래스에서 외부 클래스의 필드 사용 가능
4. 중첩 클래스에서 바깥 클래스 참조 얻기
- 중첩 클래스에서
this
를 사용하면 중첩 클래스의 객체를 가리킨다. - 바깥 클래스 객체의 참조를 얻으려면
바깥클래스명.this
를 해야 한다.
public class OuterClass {
String field = "Outter-field";
Class NestedClass {
void printOuterField() {
System.out.println(OuterClass.this.field); // 바깥 클래스 객체 참조
}
}
}
4. 중첩 인터페이스
- 클래스의 멤버로 선언된 인터페이스
- 선언한 클래스와 인터페이스가 관계를 맺기 때문에 클래스 내부에 선언
- UI 처리 시 많이 사용
- 객체지향의 다형성을 극대화할 수 있다.
예시
public class Button {
OnClickListener listener; // 인터페이스 타입 필드
void setOnClickListener(OnClickListener listener) {
this.listener = listener; // 매개변수의 다형성
// OnClickListener인터페이스를 상속하는 객체를 받을 수 있다.
}
// 터치 시 구현 객체의 메소드 호출
void touch() {
listener.onClick();
}
// 중첩 인터페이스
interface OnClickListener {
void onclick();
}
}
5. 익명 객체
- 이름 없는 객체
- 단독 생성 불가능
- 클래스를 상속하거나, 인터페이스를 구현해야만 생성가능 함
- 필드의 초기값, 로컬 변수의 초기값, 매개변수의 매개값으로 주로 대입됨
반응형
'공부 > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 16. 스트림과 병렬처리 (0) | 2022.09.14 |
---|---|
[이것이 자바다] 13. 제네릭(Generic) (1) | 2022.09.13 |
[이것이 자바다] 15. 컬렉션 프레임워크 1️⃣ List, Set, Map (1) | 2022.08.09 |
[이것이 자바다] 8. 인터페이스 (0) | 2022.08.01 |
[이것이 자바다] 04. 조건문과 반복문 (0) | 2022.07.27 |