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를 잘 전달해주었으니 메소드가 사용 가능하다.