ch10 : 상속
목차
상속
상속을 하게 되면 부모 클래스에 선언된
public,protected로 선언된 모든 변수, 메서드를 사용할 수 있다.자바 클래스는 단일 상속만 가능하다.
상속을 사용하는 이유 : 자식에서 부모의 기능을 재사용 + 확장하기 위해
상속과 생성자
자식의 생성자가 호출되면, 자동으로 부모클래스의 매개변수 없는 생성자가 실행된다.
상속 받으려면,
부모 클래스의 기본 생성자가 존재해야 한다.
만약 부모 클래스에 매개변수 있는 생성자만 있다면,
super을 통해서 부모 클래스의 생성자를 선택해도 된다. → 이때, 매개변수는 null이 아닌 명확한 값을 넘겨주어야 한다!
super()을 통해서 부모 클래스의 메소드에 접근할 수 있다.
오버라이딩
부모 클래스의 메서드를 자식클래스에서 재정의하는 것
이때, 접근 제어자, 리턴 타입, 메소드명, 매개변수 타입/갯수가 동일해야 한다.
주의
자식클래스에서 리턴 타입을 동일하게 오버라이딩 해야 된다.
접근 제어자는 자식에서 같거나, 더 넓은 권한이어야 한다.
ex) 부모에서
priavte이면, 자식은public일 수 있다. 반대는 안됨!
참조자료형의 형변환
Parent obj = new Child();가능 → 객체를 자식으로 생성하면, 자식객체는 부모의 메소드를 사용할 수 있다.Child obj = new Parent();컴파일 에러 → 객체를 부모로 생성하면, 자식의 메소드들을 사용할 수 없다.이 경우 명시적 형변환이 필요하다.
다만, 부모 객체를 자식클래스로 억지로 형변환 하는 경우, 컴파일 에러는 피할 수 있으나, 실제로 생성된 부모객체가 자식 클래스의 메소드를 사용하려면 예외가 발생한다.
명시적 형변환을 사용하는 이유
실제로는 자식 클래스 객체인데, 부모 클래스에 담겨있던 경우, → 다시 자식 클래스로 형변환하기 위해 사용할 수 있다.
... Child child = new Child(); Parent parent = child; Child child = (Child) parent; // 실제로는 Child 객체 이다. ...사용하는 경우
일반적으로 여러 개의 값을 처리(배열)하거나, 매개 변수로 값을 보낼 땐 보통 부모 클래스의 타입으로 보낸다.
그렇지 않으면, 여러 값을 한번에 보낼 때 각 타입별로 구분해서 메소드를 만들어야 하기 때문이다.
이때 실제 타입이 부모 클래스인지 자식클래스인지 구분하기 위해
instanceof로 구분한다.instanceof로 타입 점검할 경우, 하위에 있는 자식부터 확인해야 한다.객체 instanceof 클래스(타입)ex)
if (parentArr[0] instanceof Parent)로 실제 클래스를 확인한다.
다형성
✏️ 형 변환을 하더라도, 실제 호출되는 것은 원래 객체에 있는 메서드가 호출된다.
즉 부모 클래스로 선언되더라도, 실제 실행될 때는 실제 객체의 메소드가 실행된다.Last updated