java
java Inheritance
YTCW
2024. 9. 6. 14:16
상속
한 클래스의 속성과 메서드를 다른 클래스가 물려받는것
기존의 클래스를 재사용해서 새로운 클래스를 작성하는것
코드의 재사용성과 중복을 제거 (프로그램의 생산성 향상)
상속 구현 방법extends 키워드를 사용하여 구현 ( 확장한다 )
명칭 정리상속해주는 클래스 (Parent)조상, 부모, 상위, 슈퍼 클래스
상속 받는 클래스(Child)자손, 자식, 하위, 서브 클래스
package chapter06;
class Parent {
} // 기존 클래스 ( 부모 클래스 )
class Child extends Parent {
}; // 새로운 클래스 ( 자식 클래스 )
// 동물 클래스를 만들어보자
class Animal {
String name;
}
// Dog 자식 클래스는 Animal 부모 클래스의 상속을 받음
class Dog extends Animal {
// 부모 클래스의 속성과 메서드를 모두 상속받음
// String name; 생략되어있다고 보면 된다.
void bark() {
System.out.println("강아지가 짖습니다.");
}
}
class Tv {
boolean power; // 전원 상태를 on/off
int channel; // 채널
void power() {
power = !power;
}
void channelUp() {
++channel;
}
void channelDown() {
--channel;
}
}
class SmartTv extends Tv {
boolean ott; // ott 플랫폼 전원 상태 on/off
void displayOtt(String platform) {
if (ott) {
System.out.println(platform);
} else {
}
System.out.println("ott 연결이 되지 않았습니다.");
}
}
public class Inheritance {
public static void main(String[] args) {
Dog choco = new Dog();
choco.name = "초코";
System.out.println(choco.name);
SmartTv stv = new SmartTv();
stv.channel = 10;
stv.channelUp();
stv.channelUp();
stv.channelUp();
stv.channelUp();
System.out.println(stv.channel); // 14
stv.displayOtt("netflix");
stv.ott = true;
stv.displayOtt("netflix");
}
}
그래서 기능상으로는 자식 클래스가 더 많은 기능을 가지게 된다.
상속에서의 생성자
상속받은 클래스에서 생성자 호출 순서는
부모 - 자식 순서로 진행되어야한다.
자식 클래스의 객체를 생성할 때 자식클래스는 자식생성자를 통해 자식 객체를 생성하게 될것이다.
자식 클래스의 생성자 호출 시 항상 부모 클래스 생성자를 호출하게 된다.
직접적으로 정의된 생성자 호출이 필요하지 않는다
package chapter06;
class Mammel {
String name = "Parent";
Mammel() {
System.out.println("d");
}
Mammel(String name) {
this.name = name;
}
}
class Cat extends Mammel {
String name = "Child";
// super () ;
// 자식 클래스의 기본 생성자는 사용자 정의 생성자가 없더라도
// super () 부모 클래스 생성자 호출 키워드가 정의되어 있음( 생략 )
Cat () {
// super();
System.out.println("빈 자식 생성자");
}
Cat (String name) {
// super() 는 부모 클래스의 생성자를 가지고 오기 때문에
// 기본 생성자 또는 사용자 정의 생성자의 형태를 그대로 사용
super (name); // 얘는 부모 클래스를 가르키고 이름 가졌던 애를 호출하게 됨
this.name = name;
System.out.println("자식 클래스를 생성하였습니다.");
}
// 인스턴스 메서드
void greet () {
// 해당 클래스가 가진 인스턴스 변수에 접근 this (생략 o)
System.out.println("자식 : " + this.name);
// 부모 클래스가 가진 인스턴스 변수에 접근 super (생략 x)
System.out.println("부모 : " + super.name);
}
}
public class Inheritance02 {
public static void main(String[] args) {
Cat voidCat = new Cat();
Cat myCat = new Cat("choco");
//
voidCat.greet();
// 자식 : Child
// 부모 : Parent
myCat.greet();
// 자식 : Child
// 부모 : choco => this.name = name; 을 사용하지 않았기 때문 => 사용하면 자식도 choco로 바뀐다
}
}