[자바] 접근 지정자
1. Public
public은 어떤 패키지든 상관없이 모든 클래스에서 사용할 수 있게 해주는 지정자입니다.
패키지 P를 만들어서 클래스 Bb와 Cc를 만들어줍니다
(원래는 B, C로 하려고 했는데 한글자로는 생성이 안되더군요...)
^클래스 Bb
멤버 접근을 public으로 해줍시다
public int n;
public void g();
-> 다른 패키지의 클래스에서도 int n과 void g를 사용할 수 있습니다.
^클래스 Cc
그리고 다른 패키지에 클래스 Aa를 생성해줍니다
^클래스 Aa
Bb와 같은 패키지에 있던 Cc가 Bb의 값을 가져와 쓸 때는 멀쩡했는데
서로 다른 패키지에 있는 Aa에서 Bb를 가져다 쓰니까 에러가 났습니다.
Bb에서 접근 지정을 public으로 했기 때문에
다른 패키지인 Aa에서 가져다 써도 에러가 나지 않아야 정상일텐데 말이죠.
이럴 때 다른 패키지의 클래스를 불러오는 명령어는 "import"입니다.
import 패키지명.클래스명;
^import를 적어준 후의 클래스 Aa
import를 적어준 후 왼쪽 창을 보면
클래스 Aa, Bb, Cc를 보면 셋다 모두 에러가 나지 않았습니다.
2. private
private는 같은 클래스 내에서만 접근이 가능하며, 상속을 받은 클래스에서도 접근이 불가능합니다.
클래스 Bb의 멤버 지정자를 private로 지정해줍시다.
private int n;
private void g()
Bb의 멤버 지정자를 private로 바꿔주었더니
클래스 Bb는 에러가 나지 않았지만 클래스 Aa와 Cc는 에러가 난 것을 볼 수 있습니다.
다른 패키지인 Aa는 물론이고 같은 패키지인 Cc에서도 Bb의 값을 가져다 쓰지 못해서 에러가 난 것입니다.
3. 디폴트
int n;
void g()
디폴트로 지정해 준 후, 왼쪽을 보면 Aa는 에러가 났지만 Bb와 Cc는 에러가 나지 않았습니다.
다른 패키지인 Aa에서는 Bb를 가져다 쓰지 못하지만, 같은 패키지인 Cc에서는 가져다 쓸 수 있기 때문입니다.
4. protected
protected는 디폴트와 마찬가지로 같은 패키지 내의 클래스에서만 접근이 가능합니다.
단, 상속받은 하위 클래스는 다른 패키지에서도 접근이 가능하다는 점에서는 디폴트와 차이가 있습니다.
Bb의 멤버 지정자를 protected로 만들어줍시다.
protected int n;
protected int void g()
이제 다른 패키지에 Bb를 상속받은 하위 클래스 Dd를 만들어줍시다.
위 소스에서 extends란 상속받았다라는 뜻입니다.
Dd클래스를 보면 에러가 나지 않았습니다.
왼쪽 창을 보면 Aa는 에러가 났지만 Bb, Cc, Dd는 에러가 나지 않았습니다.
Cc는 같은 패키지이기 때문에 Bb의 값을 가져다 쓸 수 있습니다.
Aa는 다른 패키지인데다 Bb를 상속받지도 않았기 때문에 Bb의 값을 가져다 쓸 수 없습니다.
Dd는 다른 패키지지만 Bb를 상속받았기 때문에 Bb의 값을 가져다 쓸 수 있기 때문에
이런 결과가 나온 것입니다.