자식class의 중복되는 코드를 부모 class에 담아주므로 코드의 중복이 발생하는것을 줄일 수 있다.
하위 class 의 동작방식을 모를때가 많기 때문에 , 부모 class로 Dog, Cat을 구동시키는 객체를 만든다.
부모 class 쪽으로 객체를 생성하는것이 훨씬 유익하다.
superclass: 부모 클래스 = 공통부분을 정의해 놓은 곳이다.
subclass: 자식 클래스 = 화살표로 상속을 받는다.
subclass는 superclass를 확장한것이다.
superclass의 속성과 method는 subclass에 상속된다.
subclass에는 고유한 속성과, method만 추가하면 된다. -> class 내용이 커진다
재정의 가능하다 (수정가능하다 = 오버라이딩)
private으로 이루어진 것은 상속이 안된다.
즉, 상속을 받아서 사용할건 하고, extends 하여 수정도 가능하다.
상속 vs include 의 차이점 ?
- include는 단순한 사용이다.
- 상속은 단순한 사용이 아닌 extends 하여 구체화시키며 재정의가 가능하다.
class A extends B {}
B : 일반화, 더 넓은 의미 = super class
A : B에 덧붙여 정의된다 = 더 구체적 = 더 좁은 의미
정확하게 말하자면 superclass의 생성자는 상속 되지 않는다.
상속을 하려면, 준비를 해 놓고 상속을 해야한다.
즉, 상속을 하기위해서는 상속되는 객체가 존재 해야한다.
객체가 존재하기 위해서는 생성자가 불려야하는것을 꼭 기억하자.
1번: A의 객체를 생성할때, B가 먼저 만들어져야하므로 언급이 없을경우 자동생성한다.
class A extends B {
// super(); // 부모생성자 명시적 호출
//1번
new A();
}
Q. class A { } 처럼 subclass 가 아니더라도 super(); 해주는가?
Object
다시 subclass, superclass를 왜 배우고 왜 상속 받는지에대해 생각해보기 !!
상속을 함으로써, 클래스를 구체적이고 적절하게 만들어 나간다.
Animal class
public class Animal {
public void eat() {
System.out.println("??");
}
public Animal() {
super();
}
}
Dog class
public class Dog extends Animal {
// 재정의
@Override
public void eat() {
System.out.println("개 eat ");
}
public Dog() {
super(); // new Animal();
}
}
Cat class
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("고양이 eat");
}
public void night() {
System.out.println("고양이 night");
}
}
부모 클래스를 이용하여 간접적으로 생성하는 방법이 있다.
Animal d = new Dog();
d의 타입이 Animal 이기 때문에 Dog 객체를 생성했지만 Dog의 eat() 를 호출할 수 없다.
이때 이것을 가능하게 하는것이 Override 이다.
재정의를 한다는것은 메모리에서의 부모와 자식간의 연결을 해주는 것이다.
부모는 항상 자신의 하위 class가 자기의 동작을 재정의 했는지 찾아본다.
따라서 양쪽에 같은 mehtod 가 정의되어있으면 subclass의 mehtod가 우선시 된다. (더 구체적이기 때문)
🙅🏻♀️ 주의사항 🙅🏻♀️
superclass에서 private으로 정의된 methods 는 override 할 수 없다.
static 그룹과 instance그룹은 별도로 취급된다.
같은 이름을 가진 메소드가 있더라도 인자의 개수, 타입이 다르면 같은 이름을 사용하여 method를 정의할 수 있다.
같은 class 내에서 적용된다.
c에는 없다.
인자가 다르면 구분이된다.
method 이름이 똑같다.
overloading 관계는 compile time 에 결정이 된다.(어떤것이 call 되는지!)
두함수의 인자는 서로 다르다
즉 두 함수의 이름은 같지만 서로다른 함수인것이다.
오버라이딩이 일어나는 관계가 아니다
class B {
public void p (double i) {
System.out.println(i*2);
}
}
class A extends B {
@Override
public void p (double i) {
System.out.println(i);
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
a.p(10); //10.0
a.p(10.0); //10.0
}
}
상속 받았기 때문에 B의 p가 아닌 A의 p가 불린다
class B {
public void p (double i) {
System.out.println(i*2);
}
}
class A extends B {
public void p (int i) {
System.out.println(i);
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
a.p(10); //10
a.p(10.0); //20.0
}
}
모든 class는 extends Object 가 생략 되어있다고 볼 수 있다.