상속 : 부모가 가진 것을 자식에게 물려주는 것
- 노트북은 컴퓨터의 한 종류다.
- 컴퓨터(부모)-노트북(자식)
- 침대는 가구의 한 종류다. 혹은 침대는 가구다.
- 가구(부모)-침대(자식)
=> is a 관계 혹은 kind of 관계 라고 한다.
Car 를 상속받은 Bus 를 class로 표현하는 방법
public class Car{
}
public class Bus extends Car{
}
- public class 클래스명 extends 부모클래스명
- 자바는 클래스 이름 뒤에 extends 키워드를 적고 부모클래스 이름을 적게 되면 부모 클래스가 가지고 있는 것을 상속받을 수 있게 된다.
- 상속이란 부모가 가지고 있는 것을 자식이 물려받는 것을 말한다. 즉, 부모가 가지고 있는 것을 자식이 사용할 수 있게 된다.
부모클래스에 메소드 추가하기
- Car에 run()메소드를 추가
public class Car{
public void run(){
System.out.println("달리다.");
}
}
- Car를 상속받은 Bus 사용
public class BusExam{
public static void main(String args[]){
Bus bus = new Bus();
bus.run();
//Bus class 는 아무런 코드를 가지지 않는다. 그럼에도 run 이라는 메소드를 사용하는데 문제가 발생되지 않는다.
}
- Bus에 메소드 추가
public class Bus extends Car{
public void ppangppang(){
System.out.println("빵빵");
}
}
- Bus는 Car에서 물려받은 run메소드와 ppangppang메소드를 사용할 수 있게 된다.
- 부모가 가지고 있는 메소드외에 추가로 메소드를 선언하는 것을 확장하였다고 표현한다.
❗그러나 부모는 자식메소드를 사용하지 못한다!
public class BusExam {
public static void main(String[] args) {
Bus bus = new Bus();//클래스 생성
bus.run();//car1의 메소드 상속받아 사용
bus.ppangppang();//상속받은 메소드 이외에도 추가하여 사용함 : 확장하였다.
Car1 car = new Car1();
car.run();
// car.ppangppang();//부모클래스는 자식이 가진 메소드 사용 불가능
}
}
<Super와 부모생성자>
: class가 인스턴스화 될때 생성자가 실행이되면서 객체의 초기화를 한다.
그때 자신의 생성자만 실행되는 것이 아니고, 부모의 생성자부터 실행된다!
public class Car {
public Car(String name) {//부모생성자
System.out.println("Car의 name생성자 입니다.");
}
public class Truck extends Car {//자식생성자!
public Truck () {
super("소방차");// 자동으로 생성 기본생성자만 가능 /부모의 생성자
System.out.println("Truck의 기본 생성자 입니다.");
}
}
public class TruckExam {
public static void main(String[] args) {
Truck t = new Truck();
//truck이 인스턴스화 될때 부모인 car객체도 메모리에 올라감.
// 먼저 생성이되어야지만 된다.
// 생성자가하는 일= 객체를 초기화
// ->생성자가 호출될때 자동으로 부모의 생성자가 호출되며 부모의 객체 초기화
// super() : 부모의 생성자를 호출할때 필요한 키워드
// Car c = new Car();
❗ 부모 생성자가 기본 생성자일때는 super();가 자동 생성 되지만 기본생성자가 아닐경우 실행이 안되므로
자식 생성자 위에 적어주어야 함!!
super
- 자신을 가리키는 키워드가 this 라면, 부모를 가리키는 키워드는 super
- super() 는 부모의 생성자를 의미한다.
- 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동으로 호출된다.
부모의 기본생성자가 아닌 다른 생성자를 호출하는 방법
- 클래스는 기본 생성자가 없는 경우도 존재한다.
public class Car{
public Car(String name){
System.out.println(name + " 을 받아들이는 생성자입니다.");
}
}
- Car class가 위 처럼 수정되면, Bus생성자에서 컴파일 오류가 발생한다.
- 부모가 기본생성자가 없기 때문에 컴파일 오류가 발생하게 되는 것이다.
- 이런 문제를 해결하려면 자식 클래스의 생성자에서 직접 부모의 생성자를 호출해야 합니다.
public Bus(){
super("소방차"); // 문자열을 매개변수로 받는 부모 생성자를 호출하였다.
System.out.println("Bus의 기본생성자입니다.");
}
super 키워드는 자식에서 부모의 메소드나 필드를 사용할 때도 사용합니다.
<클래스 형변환>
is a 관계이므로 자식=부모다! 라고 가능
버스는 차다! =>버스객체를 차 타입의 참조변수로 참조 가능
부모 타입으로 자식객체를 참조하게되면 부노가 가지고 있는 메소드만 사용할 수 있다.
자식 객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환 해야 한다.
public class BusExam {
public static void main(String[] args) {
Car1 c = new Bus ();
//부모타입으로 자식을 가리킬수 있다
//이 경우 부모가 가지고있는 내용만 사용가능
c.run();
// c.ppangppang();//오류//자식메서드
//클래스 형변환 (부모>자식이므로)
// Bus bus = c; //오류
Bus bus = (Bus)c;//강제형변환
bus.run();
bus.ppangppang();//자식메서드도 실행됨
}
}
- ppangppang()메소드를 호출하고 싶다면 Bus타입의 참조변수로 참조해야 한다.
- 객체들 끼리도 형변환이 가능하다. 단 상속관계에 있었을 때만 가능하다.
- 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.
- 부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 한다. 단 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.
'☕JAVA > 🔎 공부 [JAVA]' 카테고리의 다른 글
[JAVA] 추상클래스 (0) | 2022.08.10 |
---|---|
[JAVA] 접근 제어자 (0) | 2022.08.10 |
[JAVA] 패키지 (0) | 2022.08.10 |
[JAVA] 메소드 - 오버로딩 (0) | 2022.08.10 |
[JAVA] 생성자 / this / 생성자 오버로딩 (0) | 2022.08.10 |