Java
자바 step8 - Extends(super, protected)
코딩탕탕
2022. 10. 26. 21:19
protected = 동일한 package 혹은 상속관계에서 자식에서 접근 가능
임의로 아무런 값이 없는 Engine 클래스 생성
package test.auto;
public class Engine {
}
Car class 생성
package test.auto;
/*
* - 접근 지정자 접근범위
*
* public : 어디에서나 접근 가능
* protected : 동일한 package 혹은 상속관계에서 자식에서 접근 가능
* default : 동일안 package 안에서만 접근 가능
* private : 동일한 클래스 혹은 동일한 객체 안에서만 접근가능
*
* - 접근 지정자를 붙이는 위치
*
* 1. 클래스를 선언 할때
* 2. 생성자
* 3. 필드
* 4. 메소드
*
* 클래스는 default 와 public 두가지의 접근 지정자만 지정 가능하다
* 접근 지정자를 생략한것이 default 접근 지정자다
*/
import test.auto.Engine;
public class Car {
//필드
protected Engine engine;
//Engine 객체를 인잘 전달 받는 생성자
public Car(Engine engine) {
//생성자의 인자로 전달받은 값을 필드에 저장하기
this.engine=engine;
}
//메소드
public void drive() {
if(this.engine==null) {
System.out.println("Engine 객체가 없어서 달릴수가 없어요.");
return; //메소드 끝내기
}
System.out.println("달려요~");
}
}
Car class를 상속받아 Benz class 생성
package test.auto;
public class Benz extends Car{
//Engine type 을 전달 받는 생성자
public Benz(Engine engine) {
//부모 생성자를 호출하면서 필요한 값을 전달해 준다.
super(engine);
}
//메소드
public void smoothDrive() {
System.out.println("부드럽고 조용하게 달려요!");
}
}
package test.main;
import test.auto.Benz;
import test.auto.Car;
import test.auto.Engine;
public class MainClass07 {
public static void main(String[] args) {
//Benz 객체를 생성해서 참조값을 car1 이라는 지역 변수에 담아보세요.
//car1 에 들어있는 참조값을 이용해서 달리기도 하고 부드럽게 달리기도 해 보세요.
Benz car1=new Benz(new Engine());
car1.drive();
car1.smoothDrive();
}
}
<console>
달려요~
부드럽고 조용하게 달려요!
Car class에서 매개변수 값으로 Engine을 선언하였기에 Engine class를 인자값으로 전달한다.
Benz에서도 생성자에 Engine engine이라는 값을 전달해야 되기 때문에 객체를 생성할 때 인자값으로 Engine class를 전달해주어야 된다.
그렇게 되면 Benz class의 생성자에서 super를 사용해 부모 생성자를 호출하면서 필요한 값을 전달해 준다.
그러므로 Car class의 drive메소드 또한 사용할 수 있게 된다.
Car class를 상속받아서 CampingCar class 생성
package test.auto;
public class CampingCar extends Car{
public CampingCar(Engine engine) {
super(engine);
}
public void Yaho() {
System.out.println("신난다~!");
}
}
마찮가지로 객체를 생성할 때, 인자값으로 Engine class를 전달해 주어야된다. 그래야 생성 가능하다.
package test.main;
import test.auto.CampingCar;
import test.auto.Engine;
public class MainClass08 {
public static void main(String[] args) {
CampingCar cam=new CampingCar(new Engine());
cam.Yaho();
}
}
<console>
신난다~!
객체를 생성할 때, 인자값으로 Engine class를 잘 전달해주었으니 메소드가 사용 가능하다.