1.중첩 클래스(Nested Class)
중첩클래스란?
클래스 내부에 선언한 클래스를 말한다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.
class ClassName{
class NestedClassName{ //중첩클래스
}
}
인터페이스도 클래스 내부에 선언할 수 있는데, 이런 인터페이스를 중첩 인터페이스 라고 한다.
>내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.
class ClassName{
interface NestedInterfaceName{ //중첩클래스
}
}
중첩 클래스
중첩 클래스는 클래스 내부에 선언되는 위치에 따라서 두 가지로 분류된다. 클래스의 멤버로서 선언되면 멤버 클래스,
생성자 또는 메소드 내부에서 선언되면 로컬 클래스라고 한다.
차이점 |
멤버 클래스 : 객체가 사용 중이라면 언제든 재사용이 가능함. |
로컬 클래스 : 메소드를 실행할 때만 사용되고, 메소드가 종료되면 사라짐. |
인스턴스 멤버 클래스
static 키워드 없이 중첩 선언된 클래스를 말한다.
인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
<객체 생성>
A클래스 외부에서 B객체를 생성하려면 먼저 A객체를 생성한 뒤 B객체를 생성해야한다.
반면에 A클래스 내부의 생성자 및 인스턴스 메소드에서는 일반 클래스처럼 B객체를 생성할 수 있다.
<메모리 구조>
외부 클래스를 인스턴스화하면 외부 클래스의 코드가 메모리에 올라오게 되고 이 때 내부 클래스의 코드도 메모리에 올라오게 된다. 이렇게 코드를 메모리에 올린 이후에야 내부 클래스의 인스턴스를 생성할 수가 있다.
*다만 내부 클래스는 다른 클래스에서 직접 사용하는 것보다 해당(외부) 클래스에서만 사용하는 경우가 일반적이므로, 내부 클래스와 인스턴스를 다른 클래스에서 만드는 경우는 드물다.
//A클래스 외부 객체생성
A a = new A();
A.B b = a.new B();
b.field1 = 3;
b.method1();
//A클래스 내부 객체 생성
class A{
class B{
void methodA() {
B b = new B();
b.field1 = 3;
b.method1();
}
}
}
정적 멤버 클래스
정적 멤버 클래스는 static 키워드로 선언된 클래스를 말한다. 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.
class A{
//정적 멤버 클래스
static class C {
C(){ } //생성자
int field1; //인스턴스 필드
static int field2; //정적 필드
void method1(){ } //인스턴스 메소드
static void method2(){ } //정적 메소드
}
}
A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 A객체를 생성할 필요가 없고, 다음과 같이 C객체를 생성하면 된다.
//정적 멤버 클래스 객체 생성
A.C c = new A.C();
c.field1 = 3; //인스턴스 필드 사용
c.method1(); //인스턴스 메소드 호출
static 멤버 클래스의 인스턴스와 메서드는 바깥 클래스의 필드의 static 타입에만 접근이 가능하다.
로컬 클래스
중첩 클래스는 메소드 내에서도 선언할 수 있는데, 이것을 로컬(Local)클래스 라고 한다.
로컬 클래스는 접근 제한자 및 static을 붙힐 수 없다. 왜냐하면 로컬 클래스는 메소드 내부에서만 사용되므로
접근을 제한할 필요가 없기 때문이다. 그리고 인스턴스 필드와 메소드만 선언이 가능하고, 정적 필드와 메소드는 선언이 불가하다.
로컬 클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
중첩 인터페이스
클래스의 멤버로 선언된 인터페이스를 말한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.
class A{
[static] interface I { //중첩 인터페이스
void method();
}
}
중첩 인터페이스는 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능하다. 인스턴스 멤버 인터페이스는 바깥 클래스의 객체가 있어야 사용 가능하며, 정적 멤버 인터페이스는 바깥 클래스의 객체 없이 바깥 클래스만으로 바로 접근할 수 있다.
정리
중첩 클래스 : 클래스 내부에 선언한 클래스. 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다.
멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스를 말한다. 바깥 객체의 필요 여부에 따라 인스턴스 멤버 클래스와 정적 멤버 클래스로 구분된다.
로컬 클래스 : 생성자 또는 메소드 블룩 내부에 선언된 중첩 클래스를 말한다.
중첩 인터페이스 : 클래스의 멤버로 선언된 인터페이스를 말한다. 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능. 주로 정적 멤버 인터페이스를 많이 사용한다.
'JAVA Study' 카테고리의 다른 글
[JAVA] 컬렉션 프레임워크 (0) | 2024.04.16 |
---|---|
[JAVA]예외 처리 (0) | 2024.04.11 |
[JAVA] 상속(Inheritance) (0) | 2024.04.04 |
스터디 1회차 - 클래스 (0) | 2024.04.02 |