Programming

[자바] 접근제한자 default vs protected 차이 (예시)

송코딩 songcoding 2023. 7. 10. 16:31

안녕하세요,

송아지할때 송아 김송아입니다.

 

 

자바의 접근제한자 4개 중 ✨default와 protected의 차이✨에 대해 예시를 통해 알아보겠습니다!

 

default와 protected의 개념에 대해 이미 잘 알고 계신다고 가정하고 작성된 글이니,

예시 코드를 직접 쳐보면서 두 개의 차이점을 손으로 확실히 확인해보시는 것을 추천 드립니다 😊

 

 

우선 default와 protected의 차이는 1️⃣ 상속 관계 여부와 2️⃣ 같은 패키지 여부에 따라 나뉩니다.

예시로 먼저 확인해 본 후, 글 제일 하단에서 이 두가지에 따른 차이점을 간단하게 표로 정리해보죠~~

 

테스트를 위해 다음과 같이 클래스를 구성합니다.

먼저 1️⃣ 상속 관계 부터 설정해주기 위해, Parents (부모) 클래스를 상속 받는 Child (자식) 클래스들을 준비합니다.

단, Child 클래스는
Parents와 같은 패키지와 Parents와 다른 패키지에 각각 하나씩 준비해줍니다.

 

Parents를 상속받는 다른 패키지의 Child 클래스들

 

그리고 상속 관계가 아닌 NoChild 클래스들도 생성해야 합니다.

 

Parents와 같은 패키지와 Parents와 다른 패키지에 각각 하나씩 준비해줍니다.

Parents와 상관 없는, 패키지만 다른 NoChild 클래스들

 

 

🤔 Parents 선언

 

Parents 클래스에 접근제한자 default를 가지는 defaultMethod와 접근제한자 protected를 가지는 protectedMethod를 각각 선언합니다. 

@Parents 클래스의 default / protected 메소드

 

 

🤔 Parents와 동일 패키지 + 상속 관계 O

 

먼저, Parents와 같은 패키지에 있는 자식 클래스 Child부터 확인해보겠습니다.

 

Parents와 같은 패키지에 있으며 상속 받은 Child 클래스

 

1️⃣ 상속을 받았기 때문에 Parents 객체 생성 없이도 Parents의 default/protected 메소드를 모두 호출 할 수 있고

2️⃣ 같은 패키지에 있기 때문에 Parents 객체를 생성해서도 default/protected 메소드에 접근할 수 있습니다.

 

 

 

🤔 Parents와 동일 패키지 + 상속 관계 X

 

다음은 Parents와 같은 패키지에 있지만, 상속 관계가 아닌 NoChild를 확인해보겠습니다. 

 

1️⃣ 상속 관계가 아니기 때문에 Parents의 메소드를 호출하려면 당연히 객체를 생성해야 합니다. (feat. static 여부도 상관 있겠죠?)

2️⃣ 같은 패키지에 있기 때문에 Parents 객체를 생성해서 default/protected 메소드에 접근할 수 있습니다.

 

Parents와 같은 패키지에 있지만 상속 관계는 아닌 Child 클래스

 

 

🤔 Parents와 다른 패키지 + 상속 관계 O

다음은 가장 중요한 포인트죠?

Parents와 다른 패키지에 있지만, 상속 관계인 Child를 확인해보겠습니다.

 

1️⃣ 부모 클래스와 다른 패키지에 있지만 상속 관계에 있는 자식 클래스는 default 와 protected에서 다음과 같은 차이를 느끼게 됩니다.

✔️ default는 같은 패키지 안에 있어야만 상속 받을 수 있습니다.
✔️ protected는 다른 패키지에 있어도 상속 받을 수 있습니다.

 

따라서, 다음과 같이 defaultMethod는 호출을 시도하면 오류가 나고, protectedMethod는 호출이 가능한거죠!

다른 패키지에 부모클래스가 있으면 default는 상속 받을 수 없음!

 

 

2️⃣ 다른 패키지에 있기 때문에 Parents 객체를 생성해서는 default/protected 메소드에 접근할 수 없습니다.

 

다른 패키지는 객체 생성으로는 default / protected에 접근할 수 없음

 

🤔 Parents와 다른 패키지 + 상속 관계 X

마지막 비교 포인트입니다.

 

Parents와 다른 패키지에 있고, 상속 관계도 아닌 NoChild를 확인해보겠습니다.

 

1️⃣ 상속 관계가 아니기 때문에 Parents의 메소드를 호출하려면 당연히 객체를 생성해야 합니다. (feat. static 여부도 상관 있겠죠?)

2️⃣ 다른 패키지에 있기 때문에 Parents 객체를 생성하여도 default/protected 메소드에 접근할 수 없습니다.

 

다른 패키지에서는 객체를 통해 default / protected 접근 불가능!

 

 

접근 제한자가 허용해주는 범위를 간단하게 정리하면 이렇다는 거죠 :)

 

세상 간-단

 

 

 

그럼 도움 되셨길 바라며~~

 

좋은 하루 되세요😊

김송아 드림

 

 

👆🏻클릭이 될까?