☕JAVA/🔎 공부 [JAVA]

[JAVA] 상속 / super / 부모생성자/ 클래스형변환

디카페인라떼 2022. 8. 10. 16:56

상속 : 부모가 가진 것을 자식에게 물려주는 것 

  • 노트북은 컴퓨터의 한 종류다.
    • 컴퓨터(부모)-노트북(자식)
  • 침대는 가구의 한 종류다. 혹은 침대는 가구다.
    • 가구(부모)-침대(자식)

=> 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