본문 바로가기
프로그래밍 언어/자바 (Java)

[자바(Java) 공부하기] 18. 중첩 클래스 - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 7. 18.
728x90
반응형

 

객체지향 프로그래밍에서 클래스는 서로 긴밀한 관계를 맺고 상호작용합니다.

클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋지만, 특정 클래스와 관계를 맺는 경우에는 클래스 내부에 선언하는 것이 좋습니다.

이렇게 클래스 내부에 선언한 클래스 중첩 클래스라고 합니다.

중첩 클래스를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근할 수 있고, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있습니다.

 

중첩 클래스는 클래스 내부에 선언되는 위치에 따라서 두 가지로 분류됩니다. 클래스의 멤버로 선언되는 중첩 클래스 멤버 클래스라고 하고, 생성자 또는 메서드 내부에서 선언되는 중첩 클래스 로컬 클래스라고 합니다.

멤버 클래스는 다시 인스턴스 멤버 클래스 정적 멤버 클래스로 나뉘는데, 인스턴스 멤버 클래스는 바깥 클래스의 객체를 생성해야만 안쪽 클래스를 사용할 수 있습니다. 반면에, 정적 멤버 클래스는 바깥 클래스로 바로 안쪽 클래스에 접근할 수 있습니다.

 

인스턴스 멤버 클래스 static 키워드 없이 중첩 선언된 클래스를 말합니다.

인스턴스 멤버 클래스 내부에는 인스턴스 필드와 메서드만 선언이 가능하고 정적 필드와 메서드는 선언할 수 없습니다.

정적 멤버 클래스 static 키워드로 선언된 클래스를 말합니다. 정적 멤버 클래스 내부에는 모든 종류의 필드와 메서드를 선언할 수 있습니다.

 

중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트 코드 파일(.class) 별도로 생성됩니다.

멤버 클래스일 경우 바이트 코드 파일 이름 바깥 클래스 이름 $ 멤버 클래스 이름.class 형식으로 결정됩니다.

중첩 클래스는 메서드 내에서도 선언할 수 있는데, 이것을 로컬 클래스라고 합니다.

로컬 클래스는 메서드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문에 접근 제한자(public, private) 및 static을 붙일 수 있습니다. 로컬 클래스 내부에는 필드와 메서드만 선언할 수 있고 정적 필드와 메서드는 선언할 수 없습니다.

로컬 클래스일 경우에는 바깥 클래스 이름 $1 로컬 클래스 이름.class 형식으로 바이트 코드 파일이 생성됩니다.

 

익명 객체는 이름이 없는 객체를 말합니다.

어떤 클래스를 상속하거나 인터페이스를 구현해야만 익명 객체를 만들 수 있습니다.

부모 클래스 변수 = new 부모 클래스() {...}; 경우 부모 클래스 변수는 이름이 없는 자식 객체를 참조하고, 인터페이스 변수 = new 인터페이스() {...}; 경우 인터페이스 변수는 이름이 없는 구현 객체를 참조하게 됩니다.

자식 클래스가 재사용되지 않고, 오로지 특정 위치에서 사용할 경우라면 자식 클래스를 명시적으로 선언하는 것은 귀찮은 작업이 됩니다. 이런 경우 익명 자식 객체를 생성해서 사용하는 것이 좋은 방법입니다.

한 가지 주의해야 할 점은 익명 자식 객체를 생성한 뒤, 꼭 마지막 세미콜론(;)을 붙여야 합니다.

반응형

728x90
반응형