자바 상속 형변환 - jaba sangsog hyeongbyeonhwan

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

  • 노트북은 컴퓨터의 한 종류다.
  • 침대는 가구의 한 종류다. 혹은 침대는 가구다.

=> is a 관계 혹은 kind of 관계 라고 한다.

Car 를 상속받은 Bus 를 class로 표현하는 방법

    public class Car{

    }

    public class Bus extends Car{

    }

  • public class 클래스명 extends 부모클래스명
  • 자바는 클래스 이름 뒤에 extends 키워드를 적고 부모클래스 이름을 적게 되면 부모 클래스가 가지고 있는 것을 상속받을 수 있게 된다.
  • 상속이란 부모가 가지고 있는 것을 자식이 물려받는 것을 말한다. 즉, 부모가 가지고 있는 것을 자식이 사용할 수 있게 된다.

부모클래스에 메소드 추가하기

    public class Car{
        public void run(){
            System.out.println("달리다.");
        }
    }

    public class BusExam{
        public static void main(String args[]){
            Bus bus = new Bus();
            bus.run();  
            //Bus class 는 아무런 코드를 가지지 않는다. 그럼에도 run 이라는 메소드를 사용하는데 문제가 발생되지 않는다. 
        }   

    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();//부모클래스는 자식이 가진 메소드 사용 불가능		
	}

}

: 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();가 자동 생성 되지만 기본생성자가 아닐경우 실행이 안되므로

자식 생성자 위에 적어주어야 함!!

  • 자신을 가리키는 키워드가 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 Car{
        public void run(){
            System.out.println("달리다.");
        }
    }
0
  • ppangppang()메소드를 호출하고 싶다면 Bus타입의 참조변수로 참조해야 한다.
  • 객체들 끼리도 형변환이 가능하다. 단 상속관계에 있었을 때만 가능하다.
  • 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.
  • 부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 한다. 단 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.

부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.

자식객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환을 해야한다.

    public class Car{
        public void run(){
            System.out.println("Car의 run메소드");
        }
    }

    public class Bus extends Car{
        public void ppangppang(){
            System.out.println("빵빵.");
        }   
    }

상속관계란 is a 관계이다. "Bus는 Car다" 라는 관계가 성립된 것이다.

현실에서도 버스를 가리키면서 차다. 라고 말한다.

부모타입으로 자식객체를 참조할 수 있다.

부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.

    public class BusExam{
        public static void main(String args[]){
            Car car = new Bus();
            car.run();
            car.ppangppang(); // 컴파일 오류 발생
        }
    }

ppangppang()메소드를 호출하고 싶다면 Bus타입의 참조변수를 참조해야한다.

    public class BusExam{
        public static void main(String args[]){
            Car car = new Bus();
            car.run();
            //car.ppangppang(); // 컴파일 오류 발생

            Bus bus = (Bus)car;  //부모타입을 자식타입으로 형변환 
            bus.run();
            bus.ppangppang();
        }
    }

1. 객체들끼리도 형변환이 가능하다. 단, 상속관계에 있었을 때만 가능하다.

2. 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.

3. 부모타입 객체를 자식타입으로 참조하게 할때 명시적 형변환을 해줘야한다.

   단, 이렇게 형변환을 시도할땐 부모가 참초하는 인스턴스가 형변환하려는 자식타입일 때만 가능하다.