티스토리 뷰

728x90
반응형

상속에 관한 3번째 게시물이다. 이전 게시물은 아래 링크!

 

상속 #1

https://live-for-myself.tistory.com/89

 

[Java] 상속 Inheritance #1 / extends, super, 다형성(polymorphism), 상속에서의 casting

자바에는 '상속'이라는 개념이 있다.  상속은, 자바의 중요한 특성들 중 하나이며 상속을 사용하는 이유는 좋은 프로그램을 만들기 위해서이다. 자식 클래스는, 상속을 받고싶은 부모 클래스를

live-for-myself.tistory.com

 

상속#2

https://live-for-myself.tistory.com/90

 

[Java] 상속 Inheritance #2 / Override

이전 게시물에 이어 이번에도 상속에 대해 다뤄보려 한다. 이전 게시물은 아래 링크! https://live-for-myself.tistory.com/89 [Java] 상속 Inheritance #1 / extends, super, 다형성(polymorphism), 상속에서의 c..

live-for-myself.tistory.com


부모 클래스의 생성자가 매개변수를 갖는다면?

 

Car.java - 엔진 타입의 변수 engine을 전달받는 Car 생성자와 drive() 메소드를 갖는 Car 클래스

package test.auto;

public class Car {
	//필드
	public Engine engine;
	//생성자
	public Car(Engine engine) {
		//생성자의 인자로 전단될 객체의 참조값을 필드에 저장하기
		this.engine = engine;
	}
	//메소드
	public void drive() {
		if(this.engine == null) {
			System.out.println("Engine객체가 없어서 달릴 수가 없어요");
			return;//메소드 끝내기
		}
		System.out.println("달려요!");
	}

}

 

Engine.java

package test.auto;

public class Engine {
	

}

Car 클래스를 상속받아 전기차 클래스 Ecar을 만들어보자.

 

public class Ecar extends Car{
}

위와 같이 코드를 작성하니 오류가 뜬다. 무엇이 잘못되었을까?

 

Car은 default 생성자가 없고 engine을 전달받는 생성자만 존재한다.

 

★중요

따라서, 자식 생성자인 Ecar에서 부모 생성자에 필요하 값을 받아, 부모생성자를 호출하며 전달을 해야한다.

말로 표현하니 어려운데 코드로 표현하면 간단하다.

//자식 생성자에서 부모 생성자에 필요한 값을 받아서
public Ecar(Engine engine) {
		//부모생성자를 호출하면서 전달해야 한다.
		super(engine);
}

 

이전 게시물에서, 부모 생성자를 호출하는 방법은 super()임을 배웠다.

하지만, Car의 생성자는 engine을 넘겨주어야 하므로 super(engine)과 같이 작성해야 한다. 

 

Ecar에 자율주행 메소드도 추가해보자.

//기능(Method)
public void autoPilot() {
	System.out.println("자율 주행을 해요");
	//this.engine 사용 가능(engine은 부모인 Car에 있는 필드) 
}

전체 코드 

Ecar.java

package test.auto;

public class Ecar extends Car{
	//자식 생성자에서 부모 생성자에 필요한 값을 받아서
	public Ecar(Engine engine) {
		//부모생성자를 호출하면서 전달해야 한다.
		super(engine);
	}
	
	//기능(Method)
	public void autoPilot() {
		System.out.println("자율 주행을 해요");
		//this.engine 사용 가능(engine은 부모인 Car에 있는 필드) 
	}
		

}

Ecar은 Car을 상속받았기 때문에, Car 객체와 Ecar 객체는 힙 영역의 같은 사물함 내에 같은 참조값으로 묶여있다.

따라서, autoPilot() 메소드 내에서 this.engine은 Car클래스에 있는 engine 필드이고 autoPilot() 내에서 사용할 수 있다.


main에서 Ecar 객체를 생성하고 메소드를 실행해보자.

 

MainClass10.java

package test.main;

import test.auto.Ecar;
import test.auto.Engine;

public class MainClass10 {
	public static void main(String[] args) {
		//Ecar 객체를 생성해서 .drive(), .autoPilot() 메소드를 호출해 보세요.
		Ecar car1 = new Ecar(new Engine());
		car1.drive();
		car1.autoPilot();
	}

}

drive() 메소드는 부모인 Car 클래스 내에 있고, autoPilot() 메소드는 Ecar 클래스에 있다.

Ecar 객체에서 두 메소드 모두 호출 가능한 모습을 확인할 수 있다.


비슷한 예제를 풀어보자.


문제

1. Car 클래스를 상속받는 클래스를 test.auto 패키지에 아무거나 하나 정의해서 만들어 보세요.
 2. 만든 클래스를 이용해서 객체 생성 후 메소드를 호출하는 코드를 main() 메소드 안에 작성해 보세요.


 

다음과 같이 풀이할 수 있다.

 

Sample.java

package test.auto;

public class Sample extends Car{

	public Sample(Engine engine) {
		super(engine);
		// TODO Auto-generated constructor stub
		
	}
	public void SampleMethod() {
		System.out.println("Sample");
	}

}

 

MainClass11.java

package test.main;

import test.auto.Engine;
import test.auto.Sample;

/*
 * 1. Car 클래스를 상속받는 클래스를 test.auto 패키지에 아무거나 하나 정의해서 만들어 보세요.
 * 2. 만든 클래스를 이용해서 객체 생성 후 메소드를 호출하는 코드를 main() 메소드 안에 작성해 보세요.
 */

public class MainClass11 {
	public static void main(String[] args) {
		Sample s = new Sample(new Engine());
		s.drive();
		s.SampleMethod();
		
	}

}

이렇게 자바의 상속에 대해 공부해보았다. 다음 게시물에서는 접근지정자에 대해 다뤄볼 예정이다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함