중첩 인터페이스 (Nested Interface)
클래스의 멤버로 선언된 인터페이스를 말한다.
인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.
(코드의 가독성이 좋아진다.)
이벤트를 처리할 때 많이 사용한다.
클래스 멤버로 선언된 중첩 인터페이스는 static 키워드를 붙일수도 있고, 생략도 가능하다.
주로 정적 멤버 인터페이스를 많이 사용하는데 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 사용된다.
[중첩 인터페이스에 대한 예제1] 버튼을 클릭했을 때 이벤트를 처리하려면 기능을 구현할 구상 클래스를 생성(클래스와 연관성이 있고, 가독성을 위함)
MessageListener ml = new MessageListener;
btn.setListener(ml);
= btn.setListener(new MessageListener);
중첩 클래스 (Nested Class)
클래스 내부에 선언한 클래스이다.
클래스가 다른 클래스에만 유용 할 경우 (서로간 결합만이 존재하는 클래스의 경우)
해당 클래스에 클래스를 포함시키면 가독성이 좋고 관리하기 편하다.
중첩 클래스는 클래스 내부에 숨겨져 있으므로 캡슐화에 도움이 된다.
Nested Class 종류
static 키워드가 없다면 인스턴스 멤버 클래스이다.
static 키워드가 있다면 static 멤버 클래스이다.
메소드 안에 클래스가 있다면 로컬 클래스이다.
인스턴스 멤버 클래스
[인스턴스 멤버 클래스에 대한 예제]
인스턴스 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결된다.
따라서, 인스턴스 멤버 클래스의 인스턴스 메소드에서 정규화된 this 를 사용해 바깥
인스턴스의 메소드를 호출하거나 바깥 인스턴스를 참조할 수 있다. 정규화된 this 란 클래스명.this 형태로 바깥 클래스의 이름을 명시하는 용법을 말한다.
인스턴스 멤버 클래스의 인스턴스와 바깥 인스턴스 사이의 관계는 멤버 클래스가
인스턴스화될 때 확립되며, 더 이상 변경할 수 없다. 이 관계는 바깥 클래스의 인스턴스 메소드에서 인스턴스 멤버 클래스의 생성자를 호출할 때 자동으로 만들어지는 게
보통이지만, 드물게는 직접 바깥 인스턴스의 클래스.new 인스턴스 멤버 클래스(args) 를 호출해 수동으로 만들기도 한다. 이 관계 정보는 인스턴스 멤버 클래스의 인스턴스 안에 만들어져 메모리 공간을 차지하며, 생성 시간도 더 걸린다.
정적(static) 멤버 클래스
내부 클래스가 자신이 바깥 클래스 인스턴스를 참조하지 않는다면 내부 클래스는 static nested class로 만드는 것이 낫다.
static 키워드가 있으면 인스턴스를 생성하지 않고도 사용이 가능하다.
로컬 클래스
익명 클래스 (Anonymous class)
클래스 선언과 객체 생성을 동시에 하는 클래스 이름이 없는 일회용 클래스이다.
(클래스 선언과 객체 생성을 동시에 하여 딱 한번만 사용할 때 익명 클래스를 사용한다.)
이름이 없기 때문에 생성자도 가질 수 없으며, 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.
[문법]
클래스 이름이 없이 Volume 타입 변수 temp에 직접 상위 인터페이스에서 정의한 추상메소드를 재정의한다.(일회용 클래스라는 특징을 보여준다.)
임시 변수(temp).으로 메소드 오버라이딩한 turnUp() 메소드와 turnDown() 메소드에 인자값을 전달하여 실행문을 리턴받아온다.