ultra_dev
이것이 자바다 CH 7-1(상속) 본문
☑️ 상속 : 잘 개발된 클래스를 재사용하여 중복되는 코드를 줄여줌, 부모 클래스를 수정하면 모든 자식 클래스에 수정효과를 가져옴
☑️ 자바는 다중 상속을 허용하지 않는다. 따라서 extends 뒤에는 단 하나의 부모 클래스만이 와야 한다.
☑️ 자식객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.
→ 모든 객체는 생성자를 호출해야만 생성되는데 부모 객체의 생성자는 어디 있을까?
→ 자식 생성자의 맨 첫줄에 숨겨져 있는 super()에 의해 호출 된다.
public class SmartPhone extends Phone{
//자식 생성자 선언
public SmartPhone(String model, String color){
super(); <- 생략 가능(컴파일시 자동 추가됨)
this.model = model;
this.color = color;
}
}
→ super()는 컴파일 과정에서 자동 추가되는데, 부모의 기본 생성자를 호출한다.
📌 만약 부모 클래스에 기본생성자가 없고, 매개 변수를 갖는 생성자만 있다면 개발자는 super(매개값,…) 생성자를 직접 넣어줘야 한다.
public class SmartPhone extends Phone{
//자식 생성자 선언
public SmartPhone(String model, String color){
super(model, color); <- 반드시 작성해야 함, 생략불
this.model = model;
this.color = color;
}
}
☑️ 메소드 오버라이딩
: 자식 클래스에서 부모 메소드를 재정의해서 사용
→ 메소드가 오버라이딩 됐다면 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
📌메소드 오버라이딩 규칙
- 부모 메소드 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
- 접근 제한을 더 강하게 오버라이딩할 수 없다. (public → private로 변경 불가)
- 새로운 예외를 throws할 수 없다.
☑️ @Override
:컴파일시 정확히 오버라이딩 되었는지 체크해줌.
생략 가능하지만 달아둬야 개발자의 실수를 줄여주고, 정확한 체크 가능
☑️ super.method() : 숨겨진 부모 메소드 호출 가능
@Override
public void fly() {
if(flyMode == SUPERSONIC) {
System.out.println("초음속 비행합니다.");
}else{
//Airplane 객체의 fly()메소드 호출
super.fly();
}
}
}
☑️부모 메소드 호출
- 메소드 재정의 시, 일부만 변경한다고 해도 중복된 내용을 자식 메소드도 가지고 있어야 함
- 자식 메소드 내에서 부모 메소드를 호출하여 해결
- super 키워드와 도트(.) 연산자 사용
- 부모 메소드 재사용으로 자식 메소드의 중복 작업 내용 없앰
class Child extends Parent {
@Override
void method() {
super.method(); //부모 메소드 호출
... // 추가할 로직
}
}
☑️final class
: final을 class 앞에 붙이면 최종적인 클래스이므로 더이상 상속할 수 없는 클래스가 된다.
→ 즉, final 클래슨는 부모클래스가 될 수 없어 자식 클래스를 만들 수 없다.
ex) String 클래스는 밑에처럼 선언돼 있어서 자식 클래스를 만들 수 없다.
public final class String {...}
☑️final 메소드
:final 키워드를 붙이면 이 메소드는 초정적인 메소드로, 오버라이딩할 수 없는 메소드가 된다.
→ final 메소드는 자식 클래스에서 재정의할 수 없다.
☑️protected 접근 제한자
:같은 패키지, 자식 객체만 사용 가능
public과 default의 중간쯤에 해당하는 접근 제한
→ 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식객체만 접근 가능
📌 만약 다른 패키지에 있지만 자식클래스인 경우
부모 클래스의 protected 필드, 생성자, 메소드에 접근은 가능하지만
new 연산자를 사용해서 생성자를 직접 호출할 수는 없고, 자식 생성자에서 super()로 부모 생성자를 호출할 수 있다.
package ch07.package2; //다른 패키지
import ch07.package1.A;
public class D extends A{
//생성자 선언
public D() {
//A() 생성자 호출
super();
}
//메소드 선언
public void method(){
//A 필드값 변경
this.field = "value";
//A 메소드 호출
this.method();
}
-----> 위에처럼 상속을 통해서만 사용 ok
//메소드 선언
public void method2(){
A a = new A(); -> X
a.field = "value"; -> X
a.method(); -> X
}
}
----> 직접 객체생성해서 사용하는 건 안됨!!
---->만약 같은 패키지였으면 A a = new A(); 다 가능
'이것이 자바다' 카테고리의 다른 글
이것이 자바다 CH 8(인터페이스) (0) | 2023.01.13 |
---|---|
이것이 자바다 CH 7-2(상속) (0) | 2023.01.13 |
이것이 자바다 CH 6-2(클래스) (0) | 2023.01.13 |
이것이 자바다 CH6-1(클래스) (0) | 2023.01.13 |
이것이 자바다 CH 5(참조타입) (0) | 2023.01.13 |