Java Silver 6장 클래스의 상속과 폴리모피즘

10031 단어 자바JavaSilver

상속



기존 클래스를 기반으로 새 클래스를 정의합니다.
상속원의 클래스를 슈퍼 클래스, 새롭게 정의된 클래스를 서브 클래스라고 부른다

상속의 역할: 차등 프로그래밍
복수의 클래스에 공통되는 처리를 슈퍼 클래스에 정의하고, 각 클래스에서 구현하고 싶은 기능을 서브 클래스로 정의한다.

슈퍼 클래스에서 상속하는 것
・변수(필드)
· 방법

상속하지 않는 것
· 생성자
· 개인 변수 (필드), 메소드

추상 클래스



클래스를 작성할 때, 그 골조에 해당하는 클래스를 추상 클래스(abstract 클래스)라고 부른다
추상 클래스에는 처리 내용을 기술하지 않는 추상 메소드(abstract 메소드)를 작성 가능
또한 일반 메서드와 추상 메서드를 혼합하여 사용할 수 있습니다.

【액세스 수식자】 abstract class 클래스명 {}
【액세스 한정자】 abstract 반환 값 메소드 이름 (인수);

추상 클래스 규칙
· 추상 클래스는 인스턴스화할 수 없으며 상속된 하위 클래스를 만들고 인스턴스화합니다.
・추상 클래스를 계승한 서브 클래스는, 추상 클래스의 추상 메소드를 모두 오버라이드(override) 할 필요가 있다
・추상 클래스를 계승한 추상 클래스는, 원이 되는 추상 클래스의 추상 메소드의 오버라이드(override)는 임의
// 抽象クラス
abstract class User{
  //具象メソッド:オーバーライドは任意
  public void sayHo(){
    System.out.println("HO");
  }

  //抽象メソッド:オーバーライドは必須
  public abstract void sayHi();
}

// 具象クラス
class JapaneseUser extends User{
  @Override //オーバーライド
  public void sayHi(){
    System.out.println("こんにちは");
  }
}

class AmericanUser extends User{
  @Override
  public void sayHi(){
    System.out.println("Hi");
  }

}

public class Sample{

  public static void main(String[] args) {
    JapaneseUser taro = new JapaneseUser();
    AmericanUser tom = new AmericanUser();

    taro.sayHi();
    taro.sayHo();
    tom.sayHi();

  }
}

인터페이스



클래스를 작성할 때 공개해야 할 메소드와 상수를 정의하는 클래스 협약
추상 메소드, 디폴트 메소드, 정적 상수(final)만 선언할 수 있습니다.

【액세스 한정자】interface 인터페이스명{}
【액세스 한정자】defoult 반환값 메소드명(인수){}

인터페이스 규칙
· 인터페이스에 선언 할 수있는 변수 (필드)는 정적 또는 상수 만
・액세스 수식자가 없으면 강제적으로 public static final가 된다
・메소드는 디폴트와 추상 클래스가 선언 가능

추상 클래스와 인터페이스의 차이



둘 다 클래스 작성의 기초가됩니다.

추상 클래스: 클래스의 「골조」, 공통 처리를 정한다
인터페이스 : 클래스의 「형」, 취급 방법을 결정하는 정보를 정한다

위의 그림에서는 안쪽이 될수록 기저, 바깥쪽이 될수록 상속이 된다

인터페이스는 복수의 클래스가 상속할 수 있는 특징이 있다
편리한 면도 있지만, 어느 클래스의 사양 변경이 미치는 영향이 복잡해지는 단점이 있다

인터페이스의 개념이 특히 이해하기 어렵습니다.
예로서 '3'에 대해서는
int형의 정수 3과, floot형의 부동 소수점수 3.00과 같이 형이 다르면 취급도 다르지만 종류로서는 숫자이다.
마찬가지로 클래스에도 타입을 정해 취급하는 방법을 명언할 때 인터페이스를 사용한다
그 때문에 public로 공개해 static로 공통의 변수나 메소드를 선언하고 있다
//interface

interface Printable{
  //定数
  double VERSION = 1.2;

  //抽象メソッド
  void print();

  //defaultメソッド
  public default void getInfo(){
    System.out.println("I/F ver. " + Printable.VERSION);
  }
  //staticメソッド

}

class User implements Printable{
  //インターフェースをもとに実装クラスを作成

  //抽象メソッドは必ずオーバーライド
  @Override
  public void print(){
    System.out.println(
      "Now printing user profile...");
  }
}

public class Sample {

  public static void main(String[] args){
    User tom = new User();
    tom.print();

    //defaultメソッドは実装クラスに共通したメソッドとして使用可能
    tom.getInfo();
  }

}

interfaceof 연산자



참조 변수 이름 innterfaceof 클래스 이름 및 인스턴스 이름

인터페이스와 클래스, 인스턴스의 상속 관계의 유무를 boolen치로 돌려준다
interface A { }
class B { }
class C extends B { }
class D { }
public class Main {
  public static void main(String[] args) {
    C obj = new C();
    System.out.println(obj instanceof A);
    System.out.println(obj instanceof B);
    System.out.println(obj instanceof C);
    //System.out.println(obj instanceof D); 継承なしはコンパイルエラー
  }
}
n
false
true
true

좋은 웹페이지 즐겨찾기