티스토리 뷰
상속에 관한 3번째 게시물이다. 이전 게시물은 아래 링크!
상속 #1
https://live-for-myself.tistory.com/89
상속#2
https://live-for-myself.tistory.com/90
부모 클래스의 생성자가 매개변수를 갖는다면?
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();
}
}
이렇게 자바의 상속에 대해 공부해보았다. 다음 게시물에서는 접근지정자에 대해 다뤄볼 예정이다.
'development > Java' 카테고리의 다른 글
[Java] final , static final (0) | 2021.11.07 |
---|---|
[Java] 접근 지정자 / public, protected, default, private (0) | 2021.11.03 |
[Java] 상속 Inheritance #2 / Override (0) | 2021.11.03 |
[Java] 상속 Inheritance #1 / extends, super, 다형성(polymorphism), 상속에서의 casting (0) | 2021.11.03 |
[Java] While문 / 문자열 비교하기 .equals(), 무한 루프 , 탈출 조건, break() (0) | 2021.11.02 |
- Total
- Today
- Yesterday
- Django
- 백준
- Java
- web
- 자바
- 단계별로풀어보기
- jQuery
- Case When
- baekjoon
- R
- 정렬
- 자바스크립트
- python
- html
- 브루트 포스
- 스프링
- 파이썬
- 문자열
- CSS
- 큐
- append
- 고득점 키트
- jsp
- bootstrap
- javascript
- brute force
- 장고
- 덱
- Oracle
- 프로그래머스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |