객체 지향 프로그래밍에서 클래스들은 서로 긴밀한 관계를 맺고 상호작용을 한다. 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우에는 클래스 내부에 선언하는 것이 좋다.
중첩 클래스 (nested class)
-
클래스 내부에 선언한 클래스이며, 바깥 클래스와 긴밀한 관계를 가진다.
-
중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 콛의 복잡성을 줄일 수 있다.
중첩 인터페이스 (nested interface)
-
클래스 내부에 선언한 인터페이스이며, 바깥 클래스와 긴밀한 관계를 가진다.
중첩 클래스
멤버 클래스
클래스의 멤버로서 선언되는 중첩 클래스
로컬 클래스
생성자 또는 메소드 내부에서 선언되는 중첩 클래스이며, 새성자 또는 메소드가 실행할 때만 사용한다.
인스턴스 멤버 클래스
static 키워드 없이 중첩 선언된 클래스이다.
인스턴스 필드와 메소드만 선언 가능하고, 정적 필드와 메소드는 선언 할 수 없다.
예시1) 중첩 클래스
//바깥 클래스
public class A {
A() {
System.out.println("A 객체가 생성됨");
}
class B {
B() {
System.out.println("B 객체가 생성됨");
}
int field1;
// static int field2; //A객체때문에 static 필드를 선언할 수 없음
void method1() {
}
// static void method2(){} //A객체때문에 static 필드를 선언할 수 없음
}
}
중첩 클래스 객체 생성
public class Main {
public static void main(String[] args) {
A a = new A();
// 인스턴스 멤버 클래스 객체 생성
A.B b = a.new B();
b.field1 = 3;
b.method1();
}
}
정적 멤버 클래스
static 키워드로 선언된 클래스이다. 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.
로컬 클래스
-
생성자 또는 메소드 내에서 선언된 클래스이다.
-
접근제한자(public, private) 및 static 키워드를 붙일 수 없다.
-
인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언할 수 없다.
예시2) 중첩 클래스2
//바깥 클래스
public class A {
A() {
System.out.println("A 객체가 생성됨");
}
// 인스턴스 멤버 클래스
class B {
B() {
System.out.println("B 객체가 생성됨");
}
int field1;
// static int field2; //A객체때문에 static 필드를 선언할 수 없음
void method1() {
}
// static void method2(){} //A객체때문에 static 필드를 선언할 수 없음
}
// 정적 멤버 클래스
static class C {
C() {
System.out.println("C 객체가 생성됨");
}
int field1;
static int field2;
void method1() {
}
static void method2() {
}
}
void method() {
// 로컬 클래스
class D {
D() {
System.out.println("D 객체가 생성됨");
}
int field1;
// static int field2;
void method1() {
}
// static void method2(){}
}
D d = new D();
d.field1 = 3;
d.method1();
}
}
중첩 클래스 객체 생성
public class Main {
public static void main(String[] args) {
A a = new A();
// 인스턴스 멤버 클래스 객체 생성
A.B b = a.new B();
b.field1 = 3;
b.method1();
// 정적 멤버 클래스 객체 생성
A.C c = new A.C();
c.field1 = 3;
c.method1();
A.C.field2 = 3;
A.C.method2();
// 로컬 클래스 객체 생성을 위한 메소드 호출
a.method();
}
}
※용어 정리
-
중첩 클래스: 클래스 내부에 선언한 클래스이다. 중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
-
멤버 클래스: 클래스의 멤버로서 선언되는 중첩 클래스를 말한다. 멤버 클래스는 바깥 객체의 필요 여부에 따라 인스턴스 멤버 클래스와 정적 멤버 클래스로 구분된다.
-
로컬 클래스: 생성자 또는 메소드 블록 내부에 선언된 중첩 클래스를 말한다.
-
중첩 인터페이스: 클래스의 멤버로 선언된 인터페이스 이다. 중첩 인터페이스는 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능하다. 주로 정적 멤버 인터페이스를 많이 사용하는데 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용 된다.
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
java, 개발, 개발자, 비전공개발, 혼공자,
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 중첩 인터페이스 (0) | 2020.11.23 |
---|---|
자바(Java) - 중첩 클래스의 접근 제한 (0) | 2020.11.23 |
자바(Java) - 타입 변환과 다형성 (0) | 2020.11.17 |
자바(Java) - 인터페이스 (0) | 2020.11.16 |
자바(Java) - 추상 클래스 (0) | 2020.11.09 |