抽象クラスとインタフェース
6861 ワード
1. Abstract Class
抽象メソッド:
Prototypeのみ、実行コードの未完了メソッドは記述されていません。
抽象メソッドの定義:
メソッド名の前にabstractを宣言すればよい。
public abstract void setName(String newName);
public abstract String getName();
抽象クラス
abstractキーワードとして宣言されたクラスは、次の2つに分類されます。
抽象メソッド
抽象クラスは抽象メソッドによってサブクラスが実現するメソッドを明確にするインタフェースであり,サブクラスは抽象メソッドを目的とした多形式化を実現できる. これにより、設計と実装を分離し、階層的継承関係を簡単に作成できます。
📃 抽象クラス
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
継承としてのみ使用されるスーパークラス クラスの多様化を実現
ソース:
ブランドjavaプログラミング(290 p~322 p)
インフラストラクチャ-doit javaプログラミング(抽象クラス、インタフェース)
Reference
この問題について(抽象クラスとインタフェース), 我々は、より多くの情報をここで見つけました https://velog.io/@lejehwan/Abstract-Class-VS-Interfaceテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol