2 분 소요

중첩 클래스, 중첩 인터페이스

중첩 클래스

  • 클래스 내부에 선언한 클래스
  • 특정 클래스와 관계를 맺을 경우 관계 클래스를 내부에 선언하는 것이 좋음
  • 두 클래스의 멤버들을 서로 쉽게 접근할 수 있음
  • 외부에는 불필요한 관계 클래스를 감춰 코드의 복잡성을 줄일 수 있음
  • 선언되는 위치에 따라 분류
    • 멤버 클래스 : 클래스의 멤버로서 선언. 클래스나 객체가 사용 중이라면 언제든 재사용 가능
    • 로컬 클래스 : 메소드 내부에 선언되는 중첩 클래스. 로컬 클래스는 메소드 실행 시에만 사용되고, 메소드가 종료되면 없어짐

인스턴스 멤버 클래스

  • static 키워드 없이 선언된 클래스
  • 인스턴스 필드와 메소드만 선언 가능. 정적 필드와 메소드 선언 불가

정적 멤버 클래스

  • static 키워드로 선언된 클래스
  • 모든 종류의 필드와 메소드를 선언할 수 있음

로컬 클래스

  • 메소드 내에서 선언한 중첩 클래스
  • 접근 제한자(pubic, private), static 붙일 수 없음 ⇒ 메소드 내부에서만 사용되므로 접근을 제한할 필요 없음
  • 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언 가능, 정적 필드와 메소드 선언 불가
  • 메소드가 실행될 때 메소드 내에서 객체 생성하고 사용
  • 비동기 처리를 위한 스레드 객체 만들 때 사용

중첩 클래스의 접근 제한

  • 멤버 클래스가 인스턴스 또는 정적으로 선언됨에 따라 바깥 클래스의 필드와 메소드에 사용 제한이 생김

바깥 필드와 메소드에서 사용 제한

  • 인스턴스 멤버 클래스는 바깥 클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체 생성할 수 있음
  • 정적 필드의 초기값이나 정적 메소드에서는 객체 생성 불가
  • 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체 생성 가능

멤버 클래스에서 사용 제한

  • 인스턴스 멤버 클래스 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근 가능
  • 정적 멤버 클래스 안에서는 바깥 클래스의 정적 필드와 메소드에만 접근, 인스턴스 필드와 메소드는 접근할 수 없음

로컬 클래스에서 사용 제한

  • 내부에서는 바깥 클래스의 필드나 메소드를 제한 없이 사용
  • 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때
    • 로컬 클래스의 객체는 메소드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있음
    • 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 로컬 객체에서 사용할 경우 문제 발생
      • 컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변수의 값을 로컬 클래스 내부에 복사해 두고 사용
      • 매개 변수나 로컬 변수가 수정되어 값이 변경되면 로컬 클래스에 복사해 둔 값과 달라지는 문제점을 해결하기 위해 매개 변수나 로컬 변수를 final로 선언해서 수정 막음

중첩 클래스에서 바깥 클래스 참조 얻기

  • 중첩 클래스 내에서 this 키워드 사용하면 중첩 클래스의 객체가 참조됨
  • 바깥 클래스의 참조를 얻으려면 바깥 클래스의 이름음 this 앞에 붙여줌

중첩 인터페이스

  • 클래스의 멤버로 선언된 인터페이스
  • 해당 클래스와 긴밀한 관계를 맺는 구현 클래스 만들기 위해 사용
  • UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용

익명 객체

  • 이름이 없는 객체
  • 단독으로 생성할 수 없고 클래스를 상속하거나 인터페이스를 구현해야 생성할 수 있음
  • 필드의 초기값, 로컬 변수의 초기값, 매개 변수의 매개값으로 주로 대입됨
  • UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 익명 객체 활용

익명 자식 객체 생성

  • 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우
  • 실행문이기 때문에 끝에 세미콜론(;) 붙여야 함

익명 구현 객체 생성

  • 구현 클래스가 재사요오디지 않고, 해당 필드와 변수의 초기값으로만 사용하는 경우

익명 객체의 로컬 변수 사용

  • 로컬 클래스 사용 제한과 비슷