抽象クラスとインタフェース


1. Abstract Class


  • 抽象メソッド:
    Prototypeのみ、実行コードの未完了メソッドは記述されていません。


  • 抽象メソッドの定義:
    メソッド名の前にabstractを宣言すればよい。

  • 例は次のとおりです.
    public abstract void setName(String newName);
    public abstract String getName();

  • 抽象クラス
    abstractキーワードとして宣言されたクラスは、次の2つに分類されます。
  • は、1つまたは複数の抽象メソッド(抽象クラスとして宣言する必要がある)
  • を有する.
    抽象メソッド
  • がない場合、
  • !! 抽象クラスには、実行コードを持たない未完了状態の抽象メソッドが存在する可能性があるため、オブジェクトを作成できません.
  • 抽象クラスの目的と用途
    抽象クラスは抽象メソッドによってサブクラスが実現するメソッドを明確にするインタフェースであり,サブクラスは抽象メソッドを目的とした多形式化を実現できる. これにより、設計と実装を分離し、階層的継承関係を簡単に作成できます。
  • 例)
    📃 抽象クラス
    abstract class PairMap {
    
        protected String keyArray[];// key들을 저장하는 배열
        protected  String valueArray[];// value들을 저장하는 배열
        abstract String get(String key);// key값을 가진 value 리턴, 없으면 null
        abstract void put(String key, String value);// key와 value의 쌍으로 저장, 기존에 key가 있으면 값을 value로 수정
        abstract String delete(String key);// key값을 가진 아이템 삭제, 삭제된 value값 리턴
        abstract int length();// 현재 저장된 아이템의 개수 리턴
    }
    
    📃 抽象クラスを継承するクラス
    class Dictionary extends PairMap {
    
        private int count = 0;
    
        public Dictionary(int num) {
            keyArray = new String[num];
            valueArray = new String[num];
            count = 0;
        }
    
        @Override
        String get(String key) {
            for (int i = 0; i < keyArray.length; i++) {
                if (key.equals(keyArray[i])) {
                    return valueArray[i];
                }
            }
            return null;
        }
    
        @Override
        void put(String key, String value) {
            for (int i = 0; i < keyArray.length; i++) {
                if (key.equals(keyArray[i])) {
                    valueArray[i] = value;
                    return;
                }
            }
            keyArray[count] = key;
            valueArray[count] = value;
            count++;
        }
    
        @Override
        String delete(String key) {
            for (int i = 0; i < keyArray.length; i++) {
                if (key.equals(keyArray[i])) {
                    String returnDeleteValue = valueArray[i];
                    keyArray[i] = null;
                    valueArray[i] = null;
                    count--;
                    return returnDeleteValue;
                }
            }
            return null;
        }
    
        @Override
        int length() {
            return count + 1;
        }
    }
    
    📃 そのmain()メソッドの使用
    public class DictionaryApp {
        public static void main(String[] args) {
            Dictionary dic = new Dictionary(10);
            dic.put("황기태", "자바");
            dic.put("이재문", "파이썬");
            dic.put("이재문", "c++");
            System.out.println("이재문의 값은 " + dic.get("이재문"));
            System.out.println("황기태의 값은 " + dic.get("황기태"));
            String deleteValue = dic.delete("황기태");
            System.out.println("황기태의 값은 " + dic.get("황기태"));
            System.out.println("삭제된 값은 " + deleteValue);
            System.out.println("저장된 아이템의 개수는 " + dic.length());
        }
    }
    
    出力結果=>
    財テクコンサルタントの値はc++
    黄基泰の価格はジャワです.
    黄基泰の値はnull
    削除された値はJava
    保存されているアイテムの数は2

    2. Interface

  • インタフェース
    抽象クラスより抽象的なクラス keyword : interface
  • 例は次のとおりです.
    interface PhoneInterface(){
        public static final int TIMEOUT = 10000;// 상수필드 public static final 생략가능
        public abstract void sendCall();
        void receiveCall();// 추상 메서드, public abstract 생략 가능(인터페이스 내의 메서드는 모두 추상메서드로 간주)
        public default void printLogo(){// default 메서드
            System.out.println("** Phone **");
        }
    }
    !! メンバー変数を作成できません.
    !! オブジェクトを作成できません(インタフェースで抽象メソッドを使用できるため)
  • および多重継承を継承できます.
  • クラス-extends-クラスインタフェース-extends-インタフェース-implements-クラス

    例)
    📃 インタフェース
    public interface Shape {
    
        final double PI = 3.14;// 상수
        void draw();// 도형을 그리는 추상 메서드
        double getArea();// 도형의 면적을 리턴하는 추상 메서드
        default public void redraw(){// 디폴트 메서드
            System.out.print("---다시 그립니다.");
            draw();
        }
    }
    
    📃 円を描く
    public class Circle implements Shape {
    
        private int radius;
    
        public Circle(int radius) {
            this.radius = radius;
        }
    
        @Override
        public void draw() {
            System.out.println(" 반지름이 " + radius + "인 원입니다.");
        }
    
        @Override
        public double getArea() {
            return PI * radius * radius;
        }
    }
    
    
    📃 楕円を描画
    package aboutInterface;
    
    public class Oval implements Shape{
    
      private int width;
      private int height;
    
      public Oval(int width, int height) {
          this.width = width;
          this.height = height;
      }
    
      @Override
      public void draw() {
          System.out.println(" " + width + "*" +height + "에 내접하는 타원입니다.");
      }
    
      @Override
      public double getArea() {
          return PI * width * height;
      }
    }
    
    📃 長方形の描画
    package aboutInterface;
    
    public class Rect implements Shape{
    
        private int width;
        private int height;
    
        public Rect(int width, int height) {
            this.width = width;
            this.height = height;
        }
    
        @Override
        public void draw() {
            System.out.println(" " + width + "*" + height + "크기의 사각형 입니다.");
        }
    
        @Override
        public double getArea() {
            return width * height;
        }
    }
    
    📃 そのmain()メソッドの使用
    public class DrawShape {
      public static void main(String[] args) {
          Shape[] list = new Shape[3];
          list[0] = new Circle(10);
          list[1] = new Oval(20,30);
          list[2] = new Rect(10,40);
          for (Shape shape : list) {
              shape.redraw();
          }
          for (Shape shape : list) {
              System.out.println("면적은 " + shape.getArea());
          }
      }
    }
    
    出力結果=>
    ---再描画.半径10の円.
    ---再描画.2030年以内につながった楕円です.
    ---再描画.1040サイズの長方形.
    面積314.0
    面積は1884億4千万2千万
    面積は400.0


    3. Abstract Class VS Interface

  • 共通点
    継承としてのみ使用されるスーパークラス クラスの多様化を実現
  • 差異
  • 比較目的抽象クラスのサブクラスを構成するために必要な機能の大部分は抽象クラスで実現され、サブクラスが継承および利用できるようにするが、実現可能な機能は抽象メソッドとして宣言され、サブクラスで定義された目的
  • 抽象メソッド、従来のメソッド、定数、変数ソース
  • マルチ継承X
  • インタフェース開発者は、インタフェース継承クラスの目的に応じてインタフェースを作成するすべての抽象メソッド目的
  • 変数フィールドX
  • 定数、抽象メソッド、一般メソッド、defaultメソッド、すべての静的方法を含む
  • 多重継承O
  • 📌すなわち、抽象クラスが継承および利用(拡張および拡張)機能である場合、インタフェースは、オブジェクト間で同じ操作を実行するために特定のメソッドが存在する必要があることを強制します.
    ソース:
    ブランドjavaプログラミング(290 p~322 p)
    インフラストラクチャ-doit javaプログラミング(抽象クラス、インタフェース)