클래스의 멤버인 변수와 메서드들의 접근 권한을 지정한다.
public > protected > default > private (허용 : O, 제한 : X)
접근자 | 클래스 내부 | 패키지 | 상속받은 클래스 | 이외의 영역 |
private | O | X | X | X |
default | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
위에서 설명한 개발자들의 커뮤니케이션에 대해 더 깊게 생각해보려 한다.
메서드에 정의된 접근 제어자를 생각해 보자.
private 메서드는 객체 내에서만 사용할 수 있다. 다른 메서드에서 호출되어 사용되는 메서드라는 메시지를 준다.
public 메서드는 어떤 곳에서도 사용할 수 있다. 개발이 완료되어 다른 곳에서 사용할 수 있다는 메시지를 준다.
private와 public은 용도가 명확하여 접근제어자에 대한 개념만 있다면 느낌적으로 위의 내용을 알고 있었을 것이다.
그렇다면 protected는 다른 개발자에게 어떤 메시지를 주는 것일까
protected는 상속받은 클래스에서 사용할 수 있다. 상속을 받은 객체에서 Override 해야 하는 가능성을 열어둔 것이라는 메시지를 주는 것이다.
잠재적으로 자식 클래스가 Override 해서 바꾸어야 할 경우를 고려한 modifier이다.
즉, '완성되지 못한 혹은 완성될 수 없다'라는 메시지를 주는 것이다.
클래스를 디자인한 개발자가 이 메서드에 대해서 앞으로 더 구현할 것이 남았다거나 혹은 디자인 콘셉트로서 일부러 완성시키지 않은 경우 둘 다를 의미할 수 있다.
public class Bird {
public void move() {
System.out.println("running");
}
protected void moveFast() {
System.out.println("flying");
}
}
/**
* 타조
*/
public class Ostrich extends Bird{
@Override
protected void moveFast() {
//super.moveFast();
System.out.println("fast running");
}
}
대부분의 새는 빠르게 이동할 때 날아서 이동한다. 타조는 새의 한 종류이지만 날 수가 없다. 빠르게 이동할 때는 빠르게 뛸 것이다. 타조의 경우는 moveFast() 메서드를 수정해야 한다는 뜻이다.
Bird클래스의 moveFast() 메서드의 protected 키워드를 통해서, 이 함수가 바뀔 경우가 존재할 수 있음을 짐작할 수 있는 것이다.
abstract 메서드는 abstract로 선언된 클래스의 구현부를 일부러 비워놓아서, 그것을 상속하는 클래스는 반드시 해당 메서드를 구현해주어야 하는 방식이다. 부모클래스는 그 자체로는 존재할 수 없고, 단지 추상적인 개념일 뿐이다. 실제 세상에 태어나는(instance)것은 자식 클래스에 의해서 이루어지기 때문에, 자식 클래스는 반드시 abstract를 구현해야만 한다.
Reflection을 사용하여 protected 필드와 메서드에 접근할 수 있다.
Reflection을 사용하여 protected 메서드에 접근할 수 있지만 보안에 취약한 코드를 만들 수 있으므로, 주의해서 사용해야 한다.
[JAVA] 스트림(Stream)이란 - (1) (66) | 2024.01.20 |
---|---|
[JAVA] 대용량 데이터 조회 - ResultHandler (3) | 2023.10.15 |
[JAVA] Custom Annotation 생성 및 활용 (5) | 2023.03.05 |
[JAVA] Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기 (4) | 2023.02.19 |
[JAVA] File Object 기본 사용법 (9) | 2023.02.18 |
댓글 영역