<aside> 💡 자바복습을 하며 protected를 왜 많이 안쓰는지 다시금 알게되고 abstract와 interface를 쓸때의 활용성 OCP개방폐쇄원칙에 대해서 다시금 알게 되어 정리하게 되었습니다.

</aside>

protected가 제한적인 이유

  1. protected 접근 제어자는 해당 클래스와 그 클래스를 상속받은 서브클래스에서만 접근할 수 있는 멤버 변수를 정의합니다.
  2. 주로 상속 관계에서 부모 클래스의 특정 멤버를 서브클래스에서 사용하고자 할 때 사용됩니다.
  3. 같은 패키지 내의 다른 클래스에서는 접근할 수 없기 때문에, 사용 범위가 제한적입니다.

-이점에 대해서 abstract도 interface도 똑같이 상속받기 마찬가지 아닌가? 의문이 들다가 알게 되었다

주된 제한이유

protected를 쓰는 순간 OCP개방폐쇄원칙에 어긋나서 어떠한 객체든 받아들인다는 확장에 열려있지않아 쓸수 없다

-어디까지나 protected로 개인 메서드를 상속해서 쓸때 기본 부모클래스에서class Accumulator{ protected void accumulate(int num){}

-protected int getAccVal(){return val;}}로 해줘서 SavingAccount extends Accumulator{}로 구현하는식으로 protected메서드 덕분에 구현이 가능한 구조가 되었다

그러나 내부에서 쓰기에는 좋으나 외부로 노출되어야할 부분 외부라이브러리같은곳에서 상속을 받을수도 없고 OCP개방폐쇠원칙에도 어긋나서 interface나 abstract로 구별해주는게 좋다, 설사 상속을 외부라이브러리에서 한다해도 코드 내용이 길어진다

<aside> 💡 같은 패키지 안에서 사용하기위해 protected로 메서드 만들기

public class Accumulator {

private int val;

public Accumulator(int init){

val=init;

}

protected void accumulate(int num){

//음수는 누적대상에서 제외

if(num<0){

return;

}

val+=num;

}

protected int getAccVal(){

return val;

}

}

</aside>

<aside> public class SavingAccount extends Accumulator{

public SavingAccount(int initDep){

super(initDep);

}

public void saveMoney(int money){

accumulate(money);

}

public void showSaveMoney(){

System.out.println("지금까지의 누적금액 :");

System.out.println(getAccVal());

}

}

</aside>

OCP(Open-Closed Principle) 개방-폐쇄의 원칙

확장에는 열려 있고 수정에는 닫혀 있어야 한다는 원칙입니다.

추상클래스(abstract class) VS 인터페이스(interface)

추상클래스(공통 조립 나사)