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로 바뀐다
		

	}

}