[Java]7-3抽象クラス


オブジェクトを直接生成できるクラスをエンティティークラスと呼ぶ場合、これらのクラスの共通のプロパティを抽出して宣言するクラスを抽象クラスと呼びます.
抽象クラス(親クラス)とエンティティクラス(子クラス)には継承関係があり、エンティティクラスは抽象クラスのすべてのプロパティ(フィールド、メソッド)を継承し、追加のプロパティ(再定義)を持つことができます.

抽象クラスの用途


1.共通フィールドとメソッド名を統一する目的


エンティティークラスを設計する人が複数いる場合は、各エンティティークラスのフィールドとメソッド名が異なる場合があります.
この場合、データも機能も同じであるにもかかわらず、名前が異なるため、使い方も異なる.
したがって、このメソッドと比較して、共通フィールドとメソッドを抽象クラスに宣言し、抽象クラスをエンティティクラスに継承して、フィールドとメソッド名を統一できます.

2.エンティティークラスの作成に時間を節約


共通フィールドとメソッドは抽象クラスPhoneに宣言されており、異なる点をエンティティクラスに宣言するだけで、エンティティクラスの作成時間を節約できます.
ex)自動車を設計する場合は、汎用タイヤ規格(抽象等級)に従って作成する.タイヤ規格に従って製造された韓国タイヤや錦湖タイヤ(実体類)は、継承抽象類と考えられる.

抽象クラス宣言


抽象クラスを宣言する場合は、クラスの前にabstractキーワードを付ける必要があります.
abstractを追加すると、new演算子を使用してオブジェクトを作成することはできません.継承によってのみサブクラスが作成されます.つまり、親としてのみ使用されます.(コードでは、抽象クラスはextendsの後にのみ表示されます.)
抽象クラスはnew演算子を直接使用してジェネレータを呼び出すことはできませんが、サブオブジェクトを作成するときはsuper(...)です.抽象クラスオブジェクトを作成するために呼び出す必要があるため、抽象クラスにも作成者が必要です.
package sec03.exam02;

//추상 클래스

public abstract class Phone {
	
	public String owner;
	
	public Phone(String owner) {
		this.owner=owner;
	}
	
	public void turnOn() {
		System.out.println("폰 전원을 켭니다.");
	}
	
	public void turnOff() {
		System.out.println("폰 전원을 끕니다.");
	}

}
package sec03.exam02;

//실체 클래스

public class SmartPhone extends Phone {

	public SmartPhone(String owner) {
		super(owner);
	}
	
	public void internetSearch() {
		System.out.println("인터넷 검색을 합니다.");
	}
	
}
package sec03.exam02;

//실행 클래스

public class PhoneExample {

	public static void main(String[] args) {
		// TODO 자동 생성된 메소드 스텁
		
		//Phone phone = new Phone() 생성자를 호출해서 객체를 생성할 수 X
		
		SmartPhone smartPhone = new SmartPhone("신우현");
		
		smartPhone.turnOn(); //Phone의 메소드
		smartPhone.internetSearch();
		smartPhone.turnOff(); //Phone의 메소드

	}

}
携帯電話の電源を入れます.
インターネットで検索する.
携帯電話の電源を切ります.

抽象メソッドと再定義


抽象クラスは、エンティティクラスが持つ必要がある共通のフィールドとメソッドを定義する抽象クラスです.エンティティクラスのメンバーを統一することを目的としています.
すべてのエンティティに同じメソッドがある場合は、抽象クラスにメソッドを作成することが望ましい.
ただし、メソッドの宣言を統一するしかなく、実行内容はエンティティクラスによって異なる場合があります.
すべての動物が音を出すので、Animal抽象クラスではsound()の方法が定義されていますが、動物たちはそれぞれ異なる音を出すので、抽象クラスで統一的に書くことはできません.したがって、抽象クラスは「抽象メソッド」を宣言できます.
抽象メソッドはabstractキーワードとともにメソッドの宣言子のみであり,コンテンツのカッコ{}を実行するメソッドはない.
この場合、サブクラスは抽象メソッドを再定義して実行を作成する必要があります.そうしないと、コンパイルエラーが発生します.
package sec03.exam02;

//추상 클래스

public abstract class Animal {
	
	public String kind;
	
	public void breathe() {
		System.out.println("숨을 쉽니다.");
	}
	
	public abstract void sound(); //추상 메소드
	
}
package sec03.exam02;

public class Dog extends Animal{
	
	public Dog() {
		this.kind="포유류";
	}
	
	@Override //추상 메소드 재정의
	public void sound() {
		System.out.println("멍멍");
	}

}
package sec03.exam02;

public class Cat extends Animal {
	
	public Cat() {
		this.kind="포유류";
	}
	
	@Override
	public void sound() {
		System.out.println("야옹");
	}
	
}
package sec03.exam02;

public class AnimalExample {

	public static void main(String[] args) {
		// TODO 자동 생성된 메소드 스텁
		
        //일반적인 변수 호출 방식
		Dog dog = new Dog();
		Cat cat = new Cat();
		dog.sound();
		cat.sound();
		
		System.out.println("-----");
		
        //변수의 자동 타입 변환(자식->부모)
        //재정의된 자식 메소드가 호출됨(다형성의 특징)
		Animal animal = null;
		animal = new Dog();
		animal.sound();
		animal = new Cat();
		animal.sound();
		
		System.out.println("-----");
		
        //매개 변수에 자식 객체를 대입
        //자식 객체가 부모 타입으로 자동 타입 변환되어 재정의된 sound()메소드가 호출됨
        //메소드의 다형성
		animalSound(new Dog()); //자동 타입 변환
		animalSound(new Cat()); //자동 타입 변환

	}
	
	public static void animalSound(Animal animal) {
		animal.sound(); //재정의된 메소드 호출
	}

}
ワンワン
ニャー.
----- 
ワンワン
ニャー.
----- 
ワンワン
ニャー.