<aside> 💡 과정 목표
</aside>
private
접근 제한자가 붙은 멤버 변수 및 메서드는 물려받을 수 없습니다.package-private
접근 제한자(default
)로 선언된 멤버 변수 및 메서드의 경우, 다른 package
에서 상속을 수행한다면 마찬가지로 상속될 수 없습니다.is-a
라고 할 수 있을 때 사용해야 합니다.<aside> 💡 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다.
</aside>
class Parent {
Parent() {}
protected void doSomething() {
System.out.println("hello world!!");
}
protected String doSomething2() {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 10; i++) {
sb.append(i).append(" ");
}
return sb.toString();
}
}
class Child extends Parent {
Child() {
super();
}
@Override
protected void doSomething() {
System.out.println("hello world child");
}
public void process() {
String rawQuery = doSomething2();
if (rawQuery.length() == 0) {
System.out.println("empty string");
} else {
System.out.println("process complete");
}
}
}
public class InheritanceExample {
public static void main(String[] args) {
Child child = new Child();
child.doSomething();
child.process();
}
}
Child
클래스의 process()
메서드는 부모 클래스에게서 물려받은 doSomething2()
를 수행하여 그 결과값 스트링의 길이를 대조하여 동작을 처리하고 있습니다.doSomething2()
의 결과 스트링은 길이가 0이 아니기 때문에 empty string 이라는 출력이 없습니다. 하지만 만약 다음과 같이 Parent
클래스가 수정되게 되면 문제가 발생하게 됩니다.