[JAVA] 상속에 대해

    상속
         - 기존 클래스를 확장해서 새로운 클래스를 만드는 기술

    상속방법
    class A extends B{
           하위        상위
           자식        부모
    }
    부모클래스에 있는 내용을 상속받아 자기것처럼 사용 할 수 있다.(신분도받아옴)


    super 함수는 반드시 첫줄에 써야 한다.
    super 함수의 파라미터와 데이터는 부모의 생성자를 호출하는 기준이 된다.
    super 함수는 부모의 생성자를 호출하기 위한 것이다.

    자식의 객체를 생성하면 무조건, 반드시 부모의 생성자 까지도 호출한다.
    = 상속시에 생성자관계는 자식의 생성자만 호출되는것이 아니라 부모의 생성자도 호출되어진다.
    (부모의 멤버 변수, 메소드, 데이터형을 사용가능)

    부모의 생성자를 어떻게 호출할 것인가?
      - super 함수의 파라미터 값에 따라 부모의 생성자가 결정되어짐.

    super 함수를 사용하지 않으면 부모의 default 생성자를 호출 하게 되어있다.


    에러나지 않게 하기 위한 2가지.
    //부모함수의 디폴트 생성자를 만들어준다.
    //super 함수를 사용한다.

    super 함수를 사용하는 이유
      - 자식에게 부모의 데이터를 물려주기위해.


    자바의 다형성
      - 메소드 오버라이딩과는 뗄 수 없는 관계, 오버라이딩이 되어야 다형성이 존재한다.
         
    상속에서 자식이 부모의 데이터형으로 변환 가능.

    상속 > 확장성 -> 어떤 대상일때 예)
      - 기존 클래스를 건드리지 않고 수정하고자 할때 상속을 사용하여 새로운 클래스에 기존 클래스의 기능을 사용할 수 있다.


    상속 특성
    •  자식의 객체를 생성하면 무조건,반드시 부모의 생성자 까지도 호출한다.
    •  부모클래스에 있는 내용을 상속받아 자기것처럼 사용 할 수 있다.(신분도받아옴)]
    •  2개 이상의 클래스를 한번에 상속받을 수 없습니다. 즉, 다중 상속이 불가능합니다.
    •  부모의 생성자는 상속이 되지 않습니다.
    •  부모 클래스가 가진 멤버변수와 메서드를 모두 상속받습니다.
    •  부모 클래스 내에서 멤버변수 또는 메서드가 private 접근 제한자를 사용하면 멤버변수는 상속을 받으나 바로 접근이 불가능하고, 메서드는 상속되지 않습니다.
    •  static 메서드나 static 변수도 상속이 됩니다.
    •  동일한 이름의 변수가 부모클래스와 자식클래스에 둘 다 존재할 경우 부모클래스의 변수는 가려집니다. (아래의 super예약어 참조)

    상속시 생성자
    • 상위 클래스인 Calculator의 생성자가 존재하지 않는다는 의미다. 하위 클래스가 호출될 때 자동으로 상위 클래스의 기본 생성자를 호출하게 된다. 그런데 상위 클래스에 매개변수가 있는 생성자가 있다면 자바는 자동으로 상위 클래스의 기본 생성자를 만들어주지 않는다. 따라서 존재하지 않는 생성자를 호출하게 되기 때문에 에러가 발생했다. 이 문제를 해결하기 위해서는 상위 클래스에 기본 생성자를 추가하면 된다.

    상속시 디폴트 생성자와 수퍼함수 를 언제사용하는지.
    • 부모클래스에 매개변수가 있는 생성자를 만들었을 때(이런 경우 디폴트 생성자가 만들어지지 않는다.) 자식클래스에서 생성자를 안만들어서 디폴트 생성자 안에 포함되어 있는 super()로 매개변수 없는 생성자를 호출하게 된다면 오류가 난다. 따라서 자식클래스에서 디폴트 생성자가 호출되게 하기보다 직접 생성자를 적어주는것이좋다.
    • super 함수를 사용하지 않으면 부모의 default 생성자를 호출 하게 되어있다.

    상속시에 => 데이터형에는 어떤 변화가있는지.
    • 부모타입으로 자동타입변환된다

    오버라이딩을 왜 하는것과, 하는거에 있어서 자바의 다형성.
    • 상속받은 기능이나 상태를 상속받은 객체의 스타일에 맞도록 재정의 하는것을 오버 라이딩.

    부모 클래스의 생성자가 반드시 필요한 경우
    • 부모클래스에 파라미터가 있는 생성자가 존재하면 부모클래스의 기본 생성자는 자동으로 생성되지 않으므로 명시적으로 생성자를 선언해야 합니다.


    상속의 장점
    • 상속은 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.
    • 상속을 이용하여 클래스의 수정을 최소화할 수 있다유지 보수 시간을 최소화한다

    타입 변환과 다형성
    • 다형성은 하나의 타입에 여러 객체를 대입하여 이용할 수 있는 성질을 말한다이러한 다형성을 위해 자바는 자식 클래스에서 부모 클래스로 자동 타입 변환하는 것을 허용한다부모 타입에는 모든 자식 객체가 대입될 수 있다.
     
    만약 Car 클래스를 상속하는 SportCar 클래스가 있다면,

    SportCar mySportCar = new SportCar();
    Car myCar = mySportCar; //자동 타입 변환

    mySportCar 변수와 myCar 변수는 타입만 다를 뿐 동일한 객체(SportCar)를 참조한다.

    매개 변수의 타입이 클래스일 경우해당 클래스의 객체 외에 상속받는 자식 객체까지도 매개값으로 사용할 수 있다.

    부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근할 수 있다변수는 자식 객체를 참조하더라도 해당 변수로 접근 가능한 멤버는 부모 클래스의 멤버로 제한된다.

    그러나 메소드가 자식 클래스에서 오버라이딩 되었다면 부모 타입으로 자동 타입 변환되어도 오버라이딩된 메소드가 호출된다.

    바로 위의 부모 클래스가 아니더라도 상속 계층에서 상위 타입이라면 하위 타입이 자동 타입변환 된다.


    자식클래스 데이터를 부모로 형변환을 하게되면 부모클래스로부터 오버라이딩된 메소드만 사용할 수 있다.

    상속을 금지하는 final 키워드
    String 앞에 많이씀.

    댓글