상속
상속의 기초
사고방식
상속은 한 클래스에서 파생되는 다른 클래스를 생성하는 데 사용됩니다.
예를 들어, 이미 '히어로'클래스가 있고 이에 파생되는 '슈퍼 히어로'클래스를 생성하는 데 사용됩니다.
사용방법
class クラス名 extends 元にするクラス名{
元のクラス名に追加するメンバ
}
예
(Hero 클래스)
public class Hero {
//フィールド
private String name;
private int hp;
}
이것에 하늘을 나는 슈퍼 히어로를 추가하고 싶은 경우 ...
(SuperHero 클래스)
public class SuperHero extends Hero{
private boolean flying;
public void fly() {
this.flying = true;
System.out.println("飛び上がった!");
}
public void land() {
this.flying = false;
System.out.println("着地した!");
}
}
상속 관계의 표현 방법
「원래 클래스」・・・부모 클래스, 슈퍼 클래스
「원래 클래스를 바탕으로 작성한 클래스」・・・아이 클래스, 서브 클래스
상기의 코드로 말하면, 계승 관계는 이하와 같다.
「Hero 클래스」・・・부모 클래스, 슈퍼 클래스
「SuperHero 클래스」・・・아이 클래스, 서브 클래스
상속 금지 사항
・계속시에 복수의 부모 클래스를 계승(다중 계승) 할 수 없다.
・클래스 작성시에 final
가 붙은 클래스는, 계승 불가.
오버라이드
사고방식
부모 클래스의 멤버를 자식 클래스로 다시 씁니다. 이때 부모 클래스의 멤버는 써 바뀌지 않는다.
예
run 메소드를 재작성하고 싶은 경우.
(부모 클래스)
public class Hero {
//フィールド
private String name;
private int hp;
public void run() {
System.out.println("逃げ出した!");
}
(아이 클래스)
public class SuperHero extends Hero{
private boolean flying;
public void run() {//書き変えるメンバ
System.out.println("撤退した!");
}
}
(메인 클래스)
public static void main(String[] args) {
//ヒーロー
Hero hero1 = new Hero();
hero1.run();
//スーパーヒーロー
SuperHero shHero1 = new SuperHero();
shHero1.run();
}
(출력 결과)
逃げ出した!
撤退した!
재정의 금지 방법
오버라이드 금지의 메소드에 final
를 붙이는 것으로, 금지 할 수 있다.
예
run 메소드의 오버라이드(override)를 금지하고 싶은 경우.public final void run
상속시의 클래스 상태
사고방식
위에서 만든 SuperHero
인스턴스는 Heroインスタンス
및 SuperHero
인스턴스의 이중 구조입니다.
(이미지 다이어그램)
호출시 동작
호출시는, 우선 SuperHero 인스턴스의 멤버로부터 이용하도록 동작한다.
(이미지 다이어그램)
이 경우 runメソッド
는 'SuperHero`내에 있기 때문에 그쪽이 호출된다.
그리고, ①에서 메소드가 발견되었기 때문에, ②의 호출은 실행되지 않는다.
상위 클래스에 액세스하는 방법
사고방식
부모 클래스의 멤버를 자식 인스턴스에서 사용하는 방법
사용방법
필드 ... super.フィールド名
메소드 ... super.メソッド名(引数)
예
SuperHeroクラス
의, attackメソッド
에서는, 날고 있는 경우 2회 공격한다.
공격 내용은 부모 클래스 Heroクラス
의 attackメソッド
를 사용하고 싶은 경우.
//Heroクラス
public void attack(Matango matango) {
int matangoHp = matango.getHp() - 5;
matango.setHp(matangoHp);
}
//SuperHeroクラス
public void attack(Matango matango) {
super.attack(matango);
if(this.flying) {
super.attack(matango);
}
주의점
부모 클래스의 부모 클래스(조부모 클래스)에의 액세스는 불가.
상속 및 생성자 정보
사고방식
상속에 의해 생성되고 있는 인스턴스는, 자신의 생성자 호출전에 반드시 부모 생성자도 호출한다.
부모 클래스의 생성자를 호출하는 방법
子クラス名(){
super(引数);
}
그러나, 아무것도 기재하지 않는 경우, 암묵의 super가 자동으로 들어간다.
예
(Hero 클래스)
Hero(){
System.out.println("Heroを生成しました");
}
(SuperHero 클래스)
SuperHero(){
//ここに暗黙のsuperが入る
System.out.println("SuperHeroを生成しました");
}
(main 클래스)
SuperHero shHero1 = new SuperHero();
(출력 결과)
SuperHero는 생성하지 않지만 SuperHero의 생성자가 호출됩니다.
Heroを生成しました
SuperHeroを生成しました
보충
부모 클래스의 생성자에 인수가 필요한 경우는, super(인수)의 인수에 명시적으로 값을 넣을 필요가 있다.
상속시의 주의점
is-a의 관계
아이 클래스 is-a 부모 클래스 (아이 클래스는 부모 클래스의 일종이다)가 성립하지 않으면 안된다.
예
○ 올바른 예 : 아이 클래스 (TV) - 부모 클래스 (가전 제품) "TV는 가전 제품이다"→ 성립
× 잘못된 예 : 아이 클래스 (TV) - 부모 클래스 (자동차) "TV는 자동차이다"→ 성립되지 않음
Reference
이 문제에 관하여(상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_sk193/items/4a4dd065ebd6b27efd9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class クラス名 extends 元にするクラス名{
元のクラス名に追加するメンバ
}
public class Hero {
//フィールド
private String name;
private int hp;
}
public class SuperHero extends Hero{
private boolean flying;
public void fly() {
this.flying = true;
System.out.println("飛び上がった!");
}
public void land() {
this.flying = false;
System.out.println("着地した!");
}
}
사고방식
부모 클래스의 멤버를 자식 클래스로 다시 씁니다. 이때 부모 클래스의 멤버는 써 바뀌지 않는다.
예
run 메소드를 재작성하고 싶은 경우.
(부모 클래스)
public class Hero {
//フィールド
private String name;
private int hp;
public void run() {
System.out.println("逃げ出した!");
}
(아이 클래스)
public class SuperHero extends Hero{
private boolean flying;
public void run() {//書き変えるメンバ
System.out.println("撤退した!");
}
}
(메인 클래스)
public static void main(String[] args) {
//ヒーロー
Hero hero1 = new Hero();
hero1.run();
//スーパーヒーロー
SuperHero shHero1 = new SuperHero();
shHero1.run();
}
(출력 결과)
逃げ出した!
撤退した!
재정의 금지 방법
오버라이드 금지의 메소드에
final
를 붙이는 것으로, 금지 할 수 있다.예
run 메소드의 오버라이드(override)를 금지하고 싶은 경우.
public final void run
상속시의 클래스 상태
사고방식
위에서 만든 SuperHero
인스턴스는 Heroインスタンス
및 SuperHero
인스턴스의 이중 구조입니다.
(이미지 다이어그램)
호출시 동작
호출시는, 우선 SuperHero 인스턴스의 멤버로부터 이용하도록 동작한다.
(이미지 다이어그램)
이 경우 runメソッド
는 'SuperHero`내에 있기 때문에 그쪽이 호출된다.
그리고, ①에서 메소드가 발견되었기 때문에, ②의 호출은 실행되지 않는다.
상위 클래스에 액세스하는 방법
사고방식
부모 클래스의 멤버를 자식 인스턴스에서 사용하는 방법
사용방법
필드 ... super.フィールド名
메소드 ... super.メソッド名(引数)
예
SuperHeroクラス
의, attackメソッド
에서는, 날고 있는 경우 2회 공격한다.
공격 내용은 부모 클래스 Heroクラス
의 attackメソッド
를 사용하고 싶은 경우.
//Heroクラス
public void attack(Matango matango) {
int matangoHp = matango.getHp() - 5;
matango.setHp(matangoHp);
}
//SuperHeroクラス
public void attack(Matango matango) {
super.attack(matango);
if(this.flying) {
super.attack(matango);
}
주의점
부모 클래스의 부모 클래스(조부모 클래스)에의 액세스는 불가.
상속 및 생성자 정보
사고방식
상속에 의해 생성되고 있는 인스턴스는, 자신의 생성자 호출전에 반드시 부모 생성자도 호출한다.
부모 클래스의 생성자를 호출하는 방법
子クラス名(){
super(引数);
}
그러나, 아무것도 기재하지 않는 경우, 암묵의 super가 자동으로 들어간다.
예
(Hero 클래스)
Hero(){
System.out.println("Heroを生成しました");
}
(SuperHero 클래스)
SuperHero(){
//ここに暗黙のsuperが入る
System.out.println("SuperHeroを生成しました");
}
(main 클래스)
SuperHero shHero1 = new SuperHero();
(출력 결과)
SuperHero는 생성하지 않지만 SuperHero의 생성자가 호출됩니다.
Heroを生成しました
SuperHeroを生成しました
보충
부모 클래스의 생성자에 인수가 필요한 경우는, super(인수)의 인수에 명시적으로 값을 넣을 필요가 있다.
상속시의 주의점
is-a의 관계
아이 클래스 is-a 부모 클래스 (아이 클래스는 부모 클래스의 일종이다)가 성립하지 않으면 안된다.
예
○ 올바른 예 : 아이 클래스 (TV) - 부모 클래스 (가전 제품) "TV는 가전 제품이다"→ 성립
× 잘못된 예 : 아이 클래스 (TV) - 부모 클래스 (자동차) "TV는 자동차이다"→ 성립되지 않음
Reference
이 문제에 관하여(상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_sk193/items/4a4dd065ebd6b27efd9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
사고방식
부모 클래스의 멤버를 자식 인스턴스에서 사용하는 방법
사용방법
필드 ...
super.フィールド名
메소드 ... super.メソッド名(引数)
예
SuperHeroクラス
의, attackメソッド
에서는, 날고 있는 경우 2회 공격한다.공격 내용은 부모 클래스
Heroクラス
의 attackメソッド
를 사용하고 싶은 경우.//Heroクラス
public void attack(Matango matango) {
int matangoHp = matango.getHp() - 5;
matango.setHp(matangoHp);
}
//SuperHeroクラス
public void attack(Matango matango) {
super.attack(matango);
if(this.flying) {
super.attack(matango);
}
주의점
부모 클래스의 부모 클래스(조부모 클래스)에의 액세스는 불가.
상속 및 생성자 정보
사고방식
상속에 의해 생성되고 있는 인스턴스는, 자신의 생성자 호출전에 반드시 부모 생성자도 호출한다.
부모 클래스의 생성자를 호출하는 방법
子クラス名(){
super(引数);
}
그러나, 아무것도 기재하지 않는 경우, 암묵의 super가 자동으로 들어간다.
예
(Hero 클래스)
Hero(){
System.out.println("Heroを生成しました");
}
(SuperHero 클래스)
SuperHero(){
//ここに暗黙のsuperが入る
System.out.println("SuperHeroを生成しました");
}
(main 클래스)
SuperHero shHero1 = new SuperHero();
(출력 결과)
SuperHero는 생성하지 않지만 SuperHero의 생성자가 호출됩니다.
Heroを生成しました
SuperHeroを生成しました
보충
부모 클래스의 생성자에 인수가 필요한 경우는, super(인수)의 인수에 명시적으로 값을 넣을 필요가 있다.
상속시의 주의점
is-a의 관계
아이 클래스 is-a 부모 클래스 (아이 클래스는 부모 클래스의 일종이다)가 성립하지 않으면 안된다.
예
○ 올바른 예 : 아이 클래스 (TV) - 부모 클래스 (가전 제품) "TV는 가전 제품이다"→ 성립
× 잘못된 예 : 아이 클래스 (TV) - 부모 클래스 (자동차) "TV는 자동차이다"→ 성립되지 않음
Reference
이 문제에 관하여(상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/k_sk193/items/4a4dd065ebd6b27efd9b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
子クラス名(){
super(引数);
}
Hero(){
System.out.println("Heroを生成しました");
}
SuperHero(){
//ここに暗黙のsuperが入る
System.out.println("SuperHeroを生成しました");
}
SuperHero shHero1 = new SuperHero();
Heroを生成しました
SuperHeroを生成しました
is-a의 관계
아이 클래스 is-a 부모 클래스 (아이 클래스는 부모 클래스의 일종이다)가 성립하지 않으면 안된다.
예
○ 올바른 예 : 아이 클래스 (TV) - 부모 클래스 (가전 제품) "TV는 가전 제품이다"→ 성립
× 잘못된 예 : 아이 클래스 (TV) - 부모 클래스 (자동차) "TV는 자동차이다"→ 성립되지 않음
Reference
이 문제에 관하여(상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/k_sk193/items/4a4dd065ebd6b27efd9b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)