본문 바로가기

Java

[혼자 공부하는 자바] 9-1 중첩 클래스와 중첩 인터페이스 소개

728x90

1. 중첩클래스

  • 클래스 내부에 선언되는 위치에 따라 분류
    • 멤버 클래스
      클래스의 멤버로서 선언되는 중첩 클래스
      인스턴스 멤버 클래스와 정적 멤버 클래스로 나뉨
      클래스나 객체 사용 중이라면 언제든 재사용 가능
    • 로컬 클래스
      메소드 내부에서 선언되는 중첩 클래스
      메소드를 실행할 때만 사용됨
  • 인스턴스 멤버 클래스
    • static 키워드 없이 중첩 선언된 클래스. 인스턴스 필드와 메소드만 선언 가능
    • 외부에서 객체 생성하려면 외부클래스 객체 먼저 생성하고 내부클래스 객체 생성해야 함
class A{
	class B{			//인스턴스 멤버 클래스
		B(){}
        int x;
        void do(){}
    }
}

 

  • 정적 멤버 클래스
    • "static" 키워드로 선언된 클래스. 모든 종류의 필드와 메소드 선언 가능
    • 외부에서 객체 생성하기 위해 외부 객체 생성할 필요 없이 바로 내부 객체 생성하면 됨
class A{
	staic class B{       //정적 멤버 클래스
    	B(){}
        int x;
       	void do(){}
        staic int y;
        staic int play(){}
    }
}
  • 로컬 클래스
    • 메소드 내에 선언된 클래스
    • 접근 제한자 및 static을 붙일 수 없음
    • 클래스내부에 인스턴스 필드, 메소드 필드만 선언할 수 있음
    • 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 함
void do(){
	class B{		//로컬 클래스
    	B(){}
        int x;
        void play(){}
	{
    B b = new B();
    b.x = 0;
    b.play();
 }

 

 

2. 중첩 클래스의 접근 제한

  • 바깥 필드와 메소드에서 사용 제한 - 바깥 클래스에서 인스턴스 멤버 클래스를 사용할 때 제한이 있음
    • 인스턴스 멤버 클래스
      바깥 클래스의 인스턴스 필드 초기값, 인스턴스 메소드에서 객체 생성할 수 있음
      정적 필드의 초기값이나 정적 베소드에서는 객체를 생성할 수 없음
    • 정적 멤버 클래스
      모든 필드의 초기값이나 모든 메소드에서 객체 생성 가능
  • 멤버 클래스에서 사용 제한
    • 인스턴스 멤버 클래스 안에서 바깥 클래스의 모든 필드와 모든 메소드 접근 가능
    • 정적 멤버 클래스 안에서 바깥 클래스의 정적 필드와 메소드에만 접근할 수 있고, 인스턴스 필드와 메소드에 접근할 수 없음
  • 로컬 클래스에서 사용 제한
    • 로컬 클래스의 객체는 일반적으로 메소드 실행이 종료되면 없어짐
    • 메소드가 종료되어도 속 실행 상태로 존재할 수 있음
    • ex) 로컬 스레드 객체를 사용할 때
    • 문제 해결
      • 컴파일 시 로컬 클래스에서 사용하는 매개 변수나 로컬 변슈 값을 로컬 클래스 내부에 복사해두고 사용
      • 매개 변수나 로컬 변수가 수정되어 값이 변경되면 로컬 클래스에 복사해둔 값과 달라짐
      • => 변수 final 선언 
  • 중첩 클래스에서 바깥 클래스 참조 얻기
    • this : 객체자신의 참조
    • 중첩 클래스에서 this 키워드를 사용하면 중첩 클래스의 객체 참조가 됨
    • 바깥클래스 참조를 얻기 위해  [바깥 클래스.this.] 의 형태 사용

 

3. 중첩 인터페이스

  • 클래스의 멤버로 선언된 인터페이스
  • 클래스 내부에 선언해 해당 클래스와 긴밀한 관계를 맺는 클래스 만듦
  • 인스턴스 멤버 인터페이스, 정적 멤버 인터페이스 모두 사용 가능
  • 주로 정적 멤버 인터페이스를 많이 사용하는데, UI프로그래밍에서 이벤트 처리할 목적으로 많이 활용됨
class A{
	interface B{ 		//중첩 인터페이스
    	void do();
    }
}
728x90