Languages/Java

[HUFS/객체지향프로그래밍] #8 중첩 클래스와 중첩 인터페이스

성중 2023. 1. 4. 16:06

중첩 클래스

클래스 내부에 선언한 클래스를 중첩 클래스(nested class)라 하며, 클래스 내부에 선언한 인터페이스를 중첩 인터페이스(nested interface)라 한다

 

중첩 클래스 정리

  • 내장 클래스는 외부 클래스의 멤버가 private이어도 접근 가능
  • 내장 클래스는 외부로부터 보이지 않고 철저하게 숨겨 짐
  • 익명 클래스로 콜백 메소드를 편리하게 작성 가능

 

클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고도 하며, 메소드 내부에서 선언되는 중첩 클래스는 로컬 클래스라 한다 (메소드가 종료되면 사라짐)

 

멤버 클래스와 로컬 클래스
중첩 클래스를 컴파일하면 바이트 코드 파일(.class)이 별도로 생성

static 키워드 없이 중첩 선언된 클래스를 인스턴스 멤버 클래스라 하며, 정적 필드와 메소드가 아닌 인스턴스 필드와 메소드만 선언 가능하다

 

인스턴스 멤버 클래스
인스턴스를 단계적으로 생성해야 사용 가능

반면 static 키워드로 선언된 정적 멤버 클래스는 모든 종류의 필드와 메소드가 선언 가능하다

 

정적 멤버 클래스
인스턴스를 단계적으로 생성할 필요 없이 사용 가능

메소드 내부에서 선언할 수 있는 로컬 클래스는 접근 제한자 및 static 사용이 불가능하다

 

로컬 클래스
정적/인스턴스 멤버 클래스 접근 제한
메소드의 매개변수나 로컬 변수를 로컬 클래스에서 수정 불가 (final 특성)
this를 사용해 바깥 클래스 참조

중첩 인터페이스

중첩 인터페이스는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해 사용한다

* 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능

 

중첩 인터페이스 선언
중첩 인터페이스 구현 클래스
구현 클래스 사용

익명 객체

이름이 없는 익명(anonymous) 객체는 어떤 클래스를 상속하거나 인터페이스를 구현해야 한다

 

익명 객체

부모 클래스를 상속하는 자식 클래스를 선언하고 new 연산자를 이용하여 자식 객체를 부모 타입 필드나 변수의 초기값에 대입해 익명 자식 객체를 생성할 수 있다

 

일반적 자식 객체 생성
자식 클래스를 재사용하지 않는 경우 익명 자식 객체 생성 (필드 / 로컬 변수 / 매개 변수)
재정의된 필드 및 메소드는 익명 자식 객체 내부에서만 사용 가능

비슷하게 인터페이스 타입의 필드 혹은 변수를 선언 후 new 연산자를 이용한 구현 객체를 초기값으로 대입해 익명 구현 객체를 생성할 수 있다

 

일반적 구현 객체 생성
구현 객체를 재사용하지 않는 경우 익명 구현 객체 생성 (필드 / 로컬 변수 / 매개 변수)

메소드의 매개/로컬 변수를 익명 객체 내부에서 사용하는 경우 제한

  • 메소드가 종료되어도 익명 객체가 계속 실행 상태일 수 있음
  • 메소드의 매개/로컬 변수를 익명 객체 내부에서 사용할 경우 지속 사용 불가
  • 컴파일 시 익명 객체에서 사용하는 매개/로컬 변수의 값을 익명 객체 내부에 복사해두고 사용
  • 매개/로컬 변수 값이 변경되면 매개/로컬 변수를 final로 선언할 것을 요구