중첩 인터페이스 (Nested Interface), 중첩 클래스 (Nested Class)

Lee Yong Seok·2022년 5월 9일
0
post-thumbnail
post-custom-banner

중첩 인터페이스 (Nested Interface)

  • 클래스의 멤버로 선언된 인터페이스를 말한다.

  • 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다.
    (코드의 가독성이 좋아진다.)

  • 이벤트를 처리할 때 많이 사용한다.

  • 클래스 멤버로 선언된 중첩 인터페이스는 static 키워드를 붙일수도 있고, 생략도 가능하다.

  • 주로 정적 멤버 인터페이스를 많이 사용하는데 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 사용된다.

[중첩 인터페이스에 대한 예제1] 버튼을 클릭했을 때 이벤트를 처리하려면 기능을 구현할 구상 클래스를 생성(클래스와 연관성이 있고, 가독성을 위함)

  1. OnClickListener 인터페이스 타입 변수 listener 를 선언한다.
  2. 변수 listener의 setListener() 메소드를 생성한다.
  3. touch() 메소드를 생성하고, 클래스 내에 OnclickListener 인터페이스를 중첩한다.

  1. CallListener 클래스는 Button.OnClickListener 를 상속받는다.
    (Button 클래스 내에 OnClickListener 인터페이스가 중첩되어있기때문에 Button.(점)으로 클래스에 먼저 접근한다음
    클래스 내에 중첩된 인터페이스에 접근한다.)
  2. Button.OnClickListener 인터페이스에서 정의한 추상메소드 onClick()은 서브 클래스인 CallListener 에서 오버라이딩(메소드 재정의) 해야한다.

  1. MessageListener 클래스는 Button.OnClickListener 를 상속받는다.
    (Button 클래스 내에 OnClickListener 인터페이스가 중첩되어있기떄문에 Button.(점)으로 클래스에 먼저 접근한다음
    클래스 내에 중첩된 인터페이스에 접근한다.)
  2. Button.OnClickListener 인터페이스에서 정의한 추상메소드 onClick()은 서브 클래스인 MessageListener 에서 오버라이딩(메소드 재정의) 해야한다.

  1. Button 기능을 테스트할 ButtonTest 클래스를 생성한다.
  2. Button 클래스에 정의된 기능을 사용해야하기때문에 Button 인스턴스를 생성한다.
  3. Button 클래스 변수 btn 으로 Button 클래스에 접근하여 정의된 setListener() 메소드를 호출한다.
  4. setListener() 메소드를 호출할 때, MessageListener 인스턴스를 생성한다.
MessageListener ml = new MessageListener;
btn.setListener(ml);
= btn.setListener(new MessageListener);
  1. ButtonTest 클래스에 Line 14에 의해 touch() 메소드가 호출된다.
  2. Button 클래스에 정의된 touch() 메소드를 실행하는데, Button 클래스에 정의된 onclick() 메소드가 없기때문에, Button.OnClickListener 인터페이스를 상속받은 하위 클래스 MessageListener 클래스에 오버라이딩된 onClick() 메소드를 호출하여 실행문을 리턴한다.

  • 위의 Call MessageListener.onClick() 문자열을 출력한 메커니즘과 동일하다.

중첩 클래스 (Nested Class)

  • 클래스 내부에 선언한 클래스이다.

  • 클래스가 다른 클래스에만 유용 할 경우 (서로간 결합만이 존재하는 클래스의 경우)
    해당 클래스에 클래스를 포함시키면 가독성이 좋고 관리하기 편하다.

  • 중첩 클래스는 클래스 내부에 숨겨져 있으므로 캡슐화에 도움이 된다.

Nested Class 종류

  • static 키워드가 없다면 인스턴스 멤버 클래스이다.

  • static 키워드가 있다면 static 멤버 클래스이다.

  • 메소드 안에 클래스가 있다면 로컬 클래스이다.

인스턴스 멤버 클래스

[인스턴스 멤버 클래스에 대한 예제]

  • 인스턴스 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결된다.
    따라서, 인스턴스 멤버 클래스의 인스턴스 메소드에서 정규화된 this 를 사용해 바깥
    인스턴스의 메소드를 호출하거나 바깥 인스턴스를 참조할 수 있다. 정규화된 this 란 클래스명.this 형태로 바깥 클래스의 이름을 명시하는 용법을 말한다.

  • 인스턴스 멤버 클래스의 인스턴스와 바깥 인스턴스 사이의 관계는 멤버 클래스가
    인스턴스화될 때 확립되며, 더 이상 변경할 수 없다. 이 관계는 바깥 클래스의 인스턴스 메소드에서 인스턴스 멤버 클래스의 생성자를 호출할 때 자동으로 만들어지는 게
    보통이지만, 드물게는 직접 바깥 인스턴스의 클래스.new 인스턴스 멤버 클래스(args) 를 호출해 수동으로 만들기도 한다. 이 관계 정보는 인스턴스 멤버 클래스의 인스턴스 안에 만들어져 메모리 공간을 차지하며, 생성 시간도 더 걸린다.

정적(static) 멤버 클래스

  • 내부 클래스가 자신이 바깥 클래스 인스턴스를 참조하지 않는다면 내부 클래스는 static nested class로 만드는 것이 낫다.

  • static 키워드가 있으면 인스턴스를 생성하지 않고도 사용이 가능하다.

로컬 클래스

  • 로컬 클래스는 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문에 접근 제한자를 붙일 수 없고 static 을 붙일 수 없다.

  • 로컬 클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.

  • 자바 8 버전부터 final을 지워도 무조건 final 키워드를 인식한다.
  • final 키워드를 사용한 변수는 중간에 값을 변경할 수 없기때문에 위 화면은 이에 대해 컴파일 에러가 나고있는 상황이다.

익명 클래스 (Anonymous class)

  • 클래스 선언과 객체 생성을 동시에 하는 클래스 이름이 없는 일회용 클래스이다.
    (클래스 선언과 객체 생성을 동시에 하여 딱 한번만 사용할 때 익명 클래스를 사용한다.)

  • 이름이 없기 때문에 생성자도 가질 수 없으며, 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

[문법]

  1. 클래스 이름이 없이 Volume 타입 변수 temp에 직접 상위 인터페이스에서 정의한 추상메소드를 재정의한다.(일회용 클래스라는 특징을 보여준다.)

  2. 임시 변수(temp).으로 메소드 오버라이딩한 turnUp() 메소드와 turnDown() 메소드에 인자값을 전달하여 실행문을 리턴받아온다.

profile
Today I Learned 🌙
post-custom-banner

0개의 댓글