Java 다중 상속과 마커 인터페이스, 내부/익명 클래스🐰

alert("april");·2023년 7월 27일
0

java

목록 보기
9/9

다중 상속

여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.
JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.
하지만 JDK8 버전 부터는 인터페이스에 default 메소드 선언을 허용하며, 여러 개를 지정할 수 있는 인터페이스 특성상 다중 상속을 지원하는 것이나 다름이 없다.

마커 인터페이스(Marker Interface)

클래스들을 그룹화하기 위한 목적으로 사용한다.
인터페이스는 지정한 클래스의 부모이며, 모든 자식은 부모의 타입이므로 마커 인터페이스를 지정받은 클래스들이 하나의 타입으로 묶이게 된다. 이름 뒤에 Marker를 붙여줘야한다.

모호성(ambiguity)

하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면 어떤 부모의 필드인지 알 수가 없다. 이를 모호성이라고 부른다.

모호성 해결 방법

상황1 : 두 개의 인터페이스 내에 이름과 매개변수가 똑같은 메소드가 선언되어 있다.
해결1 : 자식 클래스에서 재정의하여 사용한다.
상황2 : 부모 클래스의 메소드와 인터페이스의 디폴트 메소드 이름과 매개변수가 똑같이 선언되어 있다.
해결2 : 부모 클래스의 메소드가 사용된다.


내부 클래스(Inner Class)

하나의 클래스에서 a작업과 b작업이 있을 때에는 따로 분리하여 클래스로 만들지 않고, 클래스 안에 클래스를 선언하여 설계한다.
이 때 밖에 있는 클래스를 외부 클래스라고 하며, 안에 선언된 클래스를 내부 클래스라고 한다. 외부 클래스가 메모리에 할당되어야 내부 클래스를 객체화할 수 있기 때문에 클래스를 숨기기 위해서 내부 클래스를 사용하기도 하며, 이를 캡슐화 또는 은닉화라고 한다. 내부 클래스는 외부 클래스의 필드이기 때문에 외부 클래스의 필드를 자신의 필드처럼 가져다 사용할 수 있게 된다.
* 메소드 안에서 클래스를 선언할 수도 있다.

익명 클래스(Anonymous Inner Class)

이름이 없는 클래스이며 구현되지 않은 필드를 구현하기 위해 일회성으로 생성되는 클래스이다.

building.java

package anonymousTask;

public class Building {
   public static void main(String[] args) {
//   역삼점 오픈
//   역삼점은 무료 나눔 행사중이라서 판매 방식을 구현할 필요 없다.
//   본사에서는 전달받는 양식을 검사할 때
//   무료나눔 행사중인 매장이라면 "무료 나눔 행사중" 출력하기
   Banapresso sf = new Banapresso();
   
   sf.register(new FormAdapter() {
      @Override
      public String[] getMenu() {
         String[] menus = {"아메리카노", "카푸치노", "바나리카노"};
         return menus;
      }
   });
      
//   신림점
//   본사에서 요구하는 방식 그대로 구현!
   Banapresso silim = new Banapresso();
   
   silim.register(new Form() {
      
      @Override
      public void sell(String order) {
         String[] menus = getMenu();
         for (int i = 0; i < menus.length; i++) {
            if(order.equals(menus[i])) {
               System.out.println("판매완료");
               return;	// return은 method를 탈출 해버린다
            } 
         }
         System.out.println("메뉴가 없습니다.");
      }
      
      @Override
      public String[] getMenu() {
         String[] menus = {"시그니처 아메리카노", "옛날 식혜", "리얼 복숭아 아이스티"};
         return menus;
      }
      
   });
      
   }
}

Banapresso.java

package anonymousTask;

public class Banapresso { // 본사
   
   public void register(Form form) {
      
      String[] menus = form.getMenu();
      
      System.out.println("-----메뉴-----");
      for (int i = 0; i < menus.length; i++) {
         System.out.println(i + 1 + ". " + menus[i]);
      }
      
      if(form instanceof FormAdapter) {
         System.out.println("무료 나눔 행사중");
         return;
      }
      
      form.sell("옛날 식혜");
      
   }
   
}

Form.java

package anonymousTask;

public interface Form { // 본사에 제출할 양식
   public String[] getMenu();
   public void sell(String order);
}

formAdapter.java

package anonymousTask;

// Form 의 강제성 소멸
public abstract class FormAdapter implements Form {

   @Override
   public String[] getMenu() {return null;}

   @Override
   public void sell(String order) {;}

}

profile
Slowly but surely

0개의 댓글

관련 채용 정보