본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

プログラミング自主学習 46日目 instanceof /抽象クラス(abstract)/sealed(JAVA 15)

instanceof

boolean result = object instanceof  Classtype

 instanceofを通して、objectがどのClasstypeがtrueかfalseかをリータンする。

 

booleanにリータンするため、制御文ifとも相性が良い。

自動変換された、サーブクラスを元に戻して、また、元のサーブクラスを使用することができる。

 

package ch07.sec09;

 

public class Person {

//필드 선언

public String name;

 

//생성자 선언

Person(String name){

this.name =name;

}

 

//메소드 선언

public void walk() {

System.out.println("걷습니다.");

}

}

package ch07.sec09;

 

public class Student extends Person{

//필드 선언

public int studentNo;

 

//생성자 선언

Student(String name, int studentNo){

super(name);

this.studentNo = studentNo;

}

 

//메소드 선언

public void study() {

System.out.println("공부를 합니다.");

}

}

 

 

package ch07.sec09;

 

public class InstanceofExample {

//main() 메소드에서 바로 호출하기 위해 정적 메소드 선언

public static void personInfo(Person person) { //Person 타입의 인수를 받기 위해 매개변수를 만든다.

System.out.println("name:" + person.name); //메소드 실행 시 인수로 받은 객체에 접근하여 객체의 필드 name을 읽는다.

person.walk(); //객체에 접근하여 객체의 메소드 walk를 실행한다.

 

 

//person이 참조하는 객체가 Student 타입인지 확인

if(person instanceof Student) { //person이 참조하는 객체가 Student 타입의 객체라면

//Student 객체일 경우 강제 타입 변환

Student student = (Student)person; //Person 타입 person을 Student로 강제 형변환을 시키고 person이 참조하는 객체를 student에 담는다.

//Student만 가지고 있는 필드 및 메소드 사용

System.out.println("StudentNo: " + student.studentNo); //student에 접근하여 객체의 필드 studentNo의 데이터를 읽는다 (출력)

student.study(); //student에 접근하여 Student 객체의 동작을 한다(공부)

}

}

 

public static void main(String[] args) {

//person 객체를 매개값으로 제공하고 personInfo() 메소드 호출

Person p1 = new Person("홍길동");

personInfo(p1);

 

System.out.println();

 

 

//매개변수의 다형성을 활용해 Student 객체를 Person 타입으로 자동 형변환(컴파일러 상, 실제 객체는 Student임)후 personInfo() 메소드 호출

Person p2 = new Student("김길동",10);

personInfo(p2);

}

}

 

抽象クラス(abstract)

public abstract class Classname{ 
//field 
//constuctor
//method
}

 

俺らが、add(int a, ind b) メソッドを見る時、足し算にするメソッドだと推測できる理由はなぜか?

このように、具体性はないが、ざっくり、そのざっくりで誰かが見てもなんとなく分かるように

情報を伝えることが抽象化だ。

 

1. メソッドブロックがない抽象メソッドがある。

 

抽象クラスの特徴はメソッドだ。メソッドブロックが存在しないので、動作の具体性がない。

 

package ch07.sec10;

 

public abstract class Animal {

//메소드 선언

public void breathe() {

System.out.println("숨을 쉽니다.");

}

 

//추상 메소드 선언

public abstract void sound();

}

 

public abstract void sound()

これは一番大きな一般クラスとの特徴だ。

通常、サーブクラスの方がスーパクラスより機能く具体性があるように、

抽象クラスも自然にスーパクラスとして使われる。

 

 

2. 継承したクラスに抽象メソッドをオーバーライドすることが必修だ。

オーバーライドしなければ、コンパイルができないためだ。

他の解決策があるが、スーパクラスをもう一度抽象クラスに宣言するしかない。

 

自然に抽象クラスを具体化するため、継承したクラスは色々な動作を具現する。

Dogクラスなら、sound() {sysout("멍멍)}で、抽象クラスを再定義することで、

抽象クラスの任務は終わる。

 

package ch07.sec10;

 

public class Dog extends Animal{

//추상 메소드 재정의

@Override

public void sound() {

System.out.println("멍멍");

}

}

package ch07.sec10;

 

public class Cat extends Animal{

//추상 메소드 재정의

@Override

public void sound() {

System.out.println("야옹");

}

}

 

3. new 演算子を通してはインスタンス化ができない。

オブジェクトを生成できるクラスが継承する。

そのため、コンストラクタも存在する。

スーパクラスのオブジェクトがなければ、サーブクラスも存在しないから。

 

Sealed

Java 15からは、sealed付けることで、継承を特定なclassのみ指定できる。

オオ様曰"あなたがわしの跡継ぎだ。"ような感じのクラスだ。

permitsを入力し、継承させたいclassのclass名を作成することで指定できる。

 

public sealed class Person permits Employee, Manager

package ch07.sec11;

 

public sealed class Person permits Employee, Manager{

//필드

public String name;

 

//메소드

public void work() {

System.out.println("하는 일이 결정되지 않았습니다.");

}

}

 

 

継承したサブクラスはfinalをするか、non-sealedをするかによって、継承の有無を作る。

結婚しないで、子供を産まないか生んで継承させるかがとても抽象化がしっかりされているため分かると思う。

 

package ch07.sec11;

 

public final class Employee extends Person{

@Override

public void work() {

System.out.println("제품을 생산합니다.");

}

}

package ch07.sec11;

 

public non-sealed class Manager extends Person{

@Override

public void work() {

System.out.println("생산 관리를 합니다.");

}

}

package ch07.sec11;

 

public class Director extends Manager {

@Override

public void work() {

System.out.println("제품을 기획합니다");

}

}

package ch07.sec11;

 

public class SealedExample {

public static void main(String[] args) {

Person p = new Person();

Employee e = new Employee();

Manager m = new Manager();

Director d = new Director();

 

p.work();

e.work();

m.work();

d.work();

} //main(end)

}//Class(end)